誰かが私のモデルをデフォルトの(0,0,0)軸の代わりにそれ自身の中心で重力に回転させる方法を教えてもらえますか?
そして私の回転は360度ではなく左右にしか進んでいないようです。
誰かが私のモデルをデフォルトの(0,0,0)軸の代わりにそれ自身の中心で重力に回転させる方法を教えてもらえますか?
そして私の回転は360度ではなく左右にしか進んでいないようです。
オブジェクトをその中心を中心に回転させたい場合は、最初にオブジェクトを原点に移動してから、回転させて元に戻す必要があります。変換行列はベクトルに右から左へ影響するため、これらの手順を逆の順序でコーディングする必要があります。
私は OpenGL ルーチンを暗記していないので、いくつかの疑似コードを次に示します。
PushMatrix();
LoadIdentity(); // Start with a fresh matrix
Translate(); // Move your object to its final destination
Rotate(); // Apply rotations
Draw(); // Draw your object using coordinates relative to the object center
PopMatrix();
これらのマトリックスが適用されます。
v_t = (I * T * R) * v = (I * (T * (R * v)))
したがって、順序は次のとおりです。回転、平行移動。
編集:上記の方程式の説明。
回転、スケール、平行移動の変換は、model-view-matrixに影響します。モデルのすべての 3D ポイント (ベクトル) にこのマトリックスを掛けて 3D 空間の最終ポイントを取得し、次に射影マトリックスを掛けて 2D ポイント (2D 画面上) を受け取ります。
射影を無視すると、モデルビューマトリックスによって変換されたポイントは次のとおりです。
v_t = MV * v
v
model-view-matrix を掛けた元の point を意味しMV
ます。
上記のコードではMV
、恒等行列I
、平行移動T
、および回転によって構築されていR
ます。
MV = I * T * R
すべてをまとめると、ポイントv
が最初に rotation の影響を受けR
、次に translationの影響を受けることがわかります。これにより、ポイントは、必要に応じて、移動T
される前に回転されます。
v_t = MV * v = (I * T * R) * v = T * (R * v)
Translate() の前に Rotate() を呼び出すと、次のようになります。
v_t = (I * R * T) * v = R * (T * v)
これは悪いことです: 3D のあるポイントに変換され、次に原点を中心に回転し、モデルに奇妙な歪みが生じます。