私のカメラは、向きを変えようとするとポイントを中心に回転します。私のカメラを回転させると、Y軸で30度のように、カメラが右に30度の角度を向くのではなく、見ていたポイントを中心にカメラが回転します。カメラがこの数式でポイントを中心に回転するのはなぜですか?
o is the camera, A and B are 3D models. The lines show line-of-sight.
This is what I expect:
A B
| >/
|/
|/
|/
o
This is what actually happens:
A B
|\
| \
| \
| > \
o
私の理解から、カメラを動かすためには、その量の逆数で世界を動かす必要があります。ですから、私がZ軸で+1を動かしたいのであれば、私はZ軸の世界-1を変換します。私は方位を表現するために四元数を使用しているので、カメラの四元数の逆数を使います(方位は常に単位四元数であるため、逆数を計算する代わりに共役を使って最適化します)。ここで
私はqが反転四元で行列に四元数を変換する方法である:
[... ... ... -x]
|... ... ... -y|
|... ... ... -z|
[0 0 0 1]
そして最後に:その後
[1 - 2 * (q.y * q.y + q.z * q.z) 2 * (q.x * q.y - q.w * q.z) 2 * (q.x * q.z + q.w * q.y) 0]
|2 * (q.x * q.y + q.w * q.z) 1 - 2 * (q.x * q.x + q.z * q.z) 2 * (q.y * q.z - q.w * q.x) 0|
|2 * (q.x * q.z - q.w * q.y) 2 * (q.y * q.z + q.w * q.z) 1 - 2 * (q.x * q.x + q.y * q.y) 0|
[0 0 0 1]
、私は行列の変換コンポーネントを設定しますこれをモデルビューの行列スタックに乗算し、すべてのオブジェクトをレンダリングします。 私はこの数学が正しいと確信していますが、私が期待していた結果は得られません。明らかに前方ベクトルと右側ベクトルが問題なので、私の唯一の疑問はなぜ彼らが間違っているのか、そして私が期待している結果を得るためにはどうすればそれらを設定すべきかということです。ありがとう。
編集: 解決策はthis guy's quaternion camera classです。まず、私が前に行っていたような回転行列を作成しますが、その後、最初、2番目、3番目の列(xa、ya、za)から行列の列ベクトルを取り出します。
次に、結果の行列をmodelview行列スタックに乗算すると、完全に動作します。
編集を行い、それを受け入れます。それがここで解決された質問に印を付ける方法です。また、あなたは何が起こっているのか説明するに値すると思います。私はこれに対する答えを書くだろう。 – datenwolf