1

古い OpenGL プロジェクトを更新していて、行列とクォータニオンのすべての (非推奨の) glMatrix()関数を切り替えていますが、回転を機能させるのに問題があります。

私の絵は次のようになります。

//these two are supposedly working
mat4 mProjection = perspective(FOV, aspectRatio, near, far);
mat4 mView = lookAt(cameraPosition, cameraCenter, headsUp);

mat4 mModel = mat4(1.0f);
mat4 mMVP = mProjection * mView * mModel;

私が今やろうとしているのは、特定の点 (オブジェクトの中心など) を中心にオブジェクトに回転を適用することです。私は試した:

mat4 mModelRotation = rotate(mModel, object->RotationY(), vec3(0.0, 1.0, 0.0)); //RotationY being an angle in degrees
mat4 mMVP = mProjection * mView * mModel * mModelRotation;

ただし、これにより、オブジェクトは中心ではなく、エッジの 1 つを中心に回転します。

たとえば、クォータニオンを適用して、パラメーターとして渡す任意のポイントを中心にオブジェクトを回転させる方法を知りたいです。

以前はglMatrix()関数を使用できたので避けていたので、マトリックスの経験がありません。そのため、空間位置とそれらの関係についてあまり理解していません。それらをクォータニオンに更新しようとすると、さらに見えます複雑。

クォータニオンのロジックと技術的な使用方法について読んだことがありますが、それらの値がどこから来るのかわかりません。

例えば:

//axis is a unit vector
local_rotation.w  = cosf( fAngle/2)
local_rotation.x = axis.x * sinf( fAngle/2 )
local_rotation.y = axis.y * sinf( fAngle/2 )
local_rotation.z = axis.z * sinf( fAngle/2 )
total = local_rotation * total

私はこれを読みましたが、これらの値が何であるかわかりません。軸は単位ベクトルです...何の?fAngle回転させたい角度だと思いますが、Quaternions は任意の軸を使用するため、XYZ 軸ごとの値をどのように取得し、Quaternion で指定するのですか?

だから、クォータニオンの実用的な例/チュートリアルを探しているので、何が起こっているのか理解できます。

オブジェクトを回転させたいときに私が持っている唯一の情報は、回転させたい軸 (x、y または z、すべてではなく、最終結果でのそれらの組み合わせ) と、度単位の値です。私は数学にあまり詳しくないので、ショートカットを使用しないチュートリアルは高く評価されます。

4

1 に答える 1

2

MLOK、モデル(モデルのポイントのセット) とPそれを回転させるポイントがあるとしましょうML

すべての回転は原点を参照するため、点MLP原点として点のセットを移動し、すべての点を回転させてから元に戻す必要があります。

これを行う方法は?, 簡単です, 各ポイントML(k)(セット内のポイント) に対して次のことを行います:

ML(k)-P --> with this you move the points, using the P point as origin

次に回転します:

ROT * (ML(k)-P)

そして最後に、それを元に戻します:

ROT(ML(k)-P) + P

qクォータニオンとして、行列 mult をおよび で置き換えます。-q

q * (ML(k)-p) * -q + p

それはうまくいくはずです。

于 2013-03-24T16:36:45.503 に答える