オブジェクト空間でオブジェクトの 3 つの軸を知っているとします。簡単にするために、これらはデカルト軸であると仮定します (そうでない場合は、以下で説明するプロセスを 2 回適用して対処できます)。
ox = (1, 0, 0)
oy = (0, 1, 0)
oz = (0, 0, 1)
また、ワールド空間に他の 3 つの直交する正規化された軸があり、オブジェクトの上、前、横の方向を示しているとします [*]:
wx = (wx.x, wx.y, wx.z)
wy = (wy.x, wy.y, wy.z)
wz = (wz.x, wz.y, wz.z)
次に、次の (列ベクトルを想定) は、オブジェクト空間からワールド空間への回転行列です。
[ wx.x wx.y wx.z ]
M = [ wy.x wy.y wy.z ]
[ wz.x wz.y wz.z ]
行列式が 1 (直交および正規化された線) であるため、これは回転行列です。ワールド空間からオブジェクト空間に移動することを確認するには、方法M*wx = (1, 0, 0)
などに注意してください.
今度は正反対のオブジェクト空間からワールド空間へ。行列を逆にするだけです。その場合、逆は転置と同じであるため、最終的な答えは次のとおりです。
objectToWorld = transpose(M)
2 つのことが残っています。
1) このマトリックスを OpenGL にロードします。glMultMatrix
あなたのためにこれを行います(注意してください、glMultMatrix
列メジャーであり、4x4マトリックスが必要です):
double objectToWorld[] = [ wx.x, wy.x, wz.x, 0,
wx.y, wy.y, wz.y, 0,
wx.z, wy.z, wz.z, 0,
0, 0, 0, 1 ];
glMultMatrixd( objectToWorld );
2) 翻訳。これを行うには、これに続いて を呼び出しますglTranslate
。
[*] 3 つのうち 2 つしかない場合、たとえば上と前に、外積を使用して側面を簡単に計算できます。正規化されていない場合は、単純に正規化します。それらが直交していない場合、すべてが難しくなります。