向きを変えようとすると、カメラがポイントを中心に回転します。たとえば、カメラを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は逆クォータニオンです。
[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]
その後、マトリックスの変換コンポーネントを設定します。
[... ... ... -x]
|... ... ... -y|
|... ... ... -z|
[0 0 0 1]
そして最後に、それをモデルビューマトリックススタックに乗算してから、すべてのオブジェクトをレンダリングします。この計算は正しいと確信していますが、期待した結果は得られません。明らかに順ベクトルと右ベクトルが問題なので、私の唯一の質問は、なぜそれらが間違っているのか、そして私が期待する結果を得たい場合、それらをどのように設定する必要があるのかということです。ありがとう。
編集:私はこの男のクォータニオンカメラクラスから解決策を見つけました。最初に、以前と同じように回転行列を作成しますが、次に、行列の列ベクトルを1番目、2番目、3番目の列(それぞれxa、ya、za)から取得します。次に、マトリックスの並進コンポーネントを次のように設定します。
[... ... ... -xa.dotProduct(cameraPos)]
|... ... ... -ya.dotProduct(cameraPos)|
|... ... ... -za.dotProduct(cameraPos)|
[... ... ... ... ]
次に、結果のマトリックスをmodelviewマトリックススタックに乗算でき、完全に機能します。