2014年2月10日月曜日

WebGLの座標系は右手系なのか左手系なのか

あちこちの解説を読んでいて,DirectXは左手系,OpenGLは右手系である,という記述を良く見かけるただ,これって正確じゃないよなぁ,と思った.結果として右手系として見なせるか,左手系として見なせるかは,深度値の扱い方でしかないと思う.ということで,深度値(clearDepthで設定する値)と深度値の扱い方(depthFuncの設定)を切り替えて確認できるWebGLのサンプルを作ってみた.

depthの値とdepthFuncの関係を確認する

赤の三角形のZ値は0.25,緑の三角形のZ値は0.75となっている.

こちらは,WebGLのデフォルトの状態で,clearDepthには1が設定され,depthFuncにはLESS(未満かどうか)が設定されている.赤の三角形が前に来ているので,画面奥側をZ軸の正方向としていることになり,左手系ということになる.

一方,こちらはclearDepthに0を設定し,depthFuncにはGREATER(より大きいかどうか)を設定した状態である.緑の三角形が前に来ているので,画面手前側をZ軸の正方向としていることになり,右手系ということになる.

どちらの座標系としても扱えるのに,どうしてDirectXは左手系でOpenGLは右手系という話が広まったのだろう?
想像でしか無いが,調べている範囲ではDirectX系では座標変換系の行列が左手系のものが多く,OpenGLでは右手座標系のものが多いため,初期に提供された座標変換行列の生成関数の影響を受けて鵜呑みにした人の話が広まってしまっているのではないか.