左手座標系・右手座標系

 3D プログラミングでは「左手座標系」「右手座標系」なるモノがちょくちょく現れます。
今回はこれについてちょっとお話…。(※左手デカルト座標系や右手デカルト座標系等とも言う場合がある)
 そもそも 3D とは 3 つの方向(direction) を持った空間の事です。
現在の 3D プログラミングで主流の方法とは三角形又は四角形等のポリゴンで構成表現されます。
この三角形を考えてみると三角形の書き方にも 2 種類あるのが分かります。
時計回りに描く方法と反時計回りに描く方向です。
この書き方によってかなりの影響を受けてしまいます。
具体的にどういう影響が出るかと言うとポリゴンが反対方向を向いてしまったりしてしまいます。
 何故にポリゴンが反対を向くかというと左手座標系と右手座標系による「z 座標の方向に違い」になります。
通常 x 座標は画面を見て右方向が正方向で逆が負の方向で y 座標が上方向が正方向で下方向が負の方向になりますが
z 座標だけは「左手座標系では奥が正方向で手前方向が負の方向」になり、
「右手座標系では奥が負の方向で手前が正の方向」になります。
座標系により完全に符号方向が反転してしまいます。
 この違いにより三角形の描画順序が変化します。
3D プログラミングには左手座標系であろうと右手座標系であろうと三角形の描画順序は必ず時計回りの方向でないといけないという制限があります。
これに合わせるために左手座標系と右手座標系とで相互変換する場合は三頂点の 2 番目の要素と 3 番目の要素を入れ替える必要があります。
例えば次の様な感じなります。
(v0, v1, v2) →座標系の変換 → (v0, v2, v1)
モデルに対しては以上の様な感じで変換が可能です。
難しく考えなくてもとりあえず時計回りに頂点を通る様な描画順序にすればよい事である。
さらにもう一つ考える必要のあるのがビュー変換です。
ビュー変換に使用する行列の z 要素も符号を反転する必要があります。
 以上で左手座標系と右手座標系の違いと相互変換方法を説明しましたが座標系を変更する事は希なので気にする必要は無いと思いますが
Direct3D と OpenGL で共通で動作するライブラリの開発等では役に立つと思います。