1

クォータニオンを使用して、キューブを軸に沿って 90 度回転させると、正面を向いた別のキューブ面が得られ、単色のまっすぐな正方形として表示されます。私の立方体は側面の色が異なるため、回転軸を変更すると、期待どおりにこれらの異なる色が得られます。

任意の量だけ回転しようとすると、非常に見事な混乱が生じます。角度に関係なくクォータニオン プロセスが適切に機能すると予想されるため、その理由はわかりません。

ここに画像の説明を入力

これを使用して、2 つのベクトルからクォータニオンを作成しています。

inline QuaternionT<T> QuaternionT<T>::CreateFromVectors(const Vector3<T>& v0, const    Vector3<T>& v1)
 {
if (v0 == -v1)
    return QuaternionT<T>::CreateFromAxisAngle(vec3(1, 0, 0), Pi);

Vector3<T> c = v0.Cross(v1);
T d = v0.Dot(v1);
T s = std::sqrt((1 + d) * 2);

QuaternionT<T> q;
q.x = c.x / s;
q.y = c.y / s;
q.z = c.z / s;
q.w = s / 2.0f;
return q;
}

上記の方法を正しく使用しているサンプル コードがたくさんあるので、この方法で問題ないと思います。

上記の方法で、私はこれを行います:

    Quaternion quat1=Quaternion::CreateFromVectors(vec3(0,1,0), vec3(0,0,1));

それは機能し、90 度の回転です。

しかし、もっと 45 度の回転が必要だとします。

    Quaternion quat1=Quaternion::CreateFromVectors(vec3(0,1,0), vec3(0,1,1));

これにより、上記の混乱が生じます。quat1また、同様に歪んだ結果とは異なるが提供する正規化も試みました。

これを使用して、モデルビュー回転行列として四元数を使用しています。

inline Matrix3<T> QuaternionT<T>::ToMatrix() const
{
const T s = 2;
T xs, ys, zs;
T wx, wy, wz;
T xx, xy, xz;
T yy, yz, zz;
xs = x * s;  ys = y * s;  zs = z * s;
wx = w * xs; wy = w * ys; wz = w * zs;
xx = x * xs; xy = x * ys; xz = x * zs;
yy = y * ys; yz = y * zs; zz = z * zs;
Matrix3<T> m;
m.x.x = 1 - (yy + zz); m.y.x = xy - wz;  m.z.x = xz + wy;
m.x.y = xy + wz; m.y.y = 1 - (xx + zz); m.z.y = yz - wx;
m.x.z = xz - wy; m.y.z = yz + wx;  m.z.z = 1 - (xx + yy);
return m;
}

ここで何が起こっているのか分かりますか?

4

1 に答える 1

0

あなたの視錐台はどのように見えますか?非常に広角の視野など、歪んだ「レンズ」がある場合、実際に深さを示す角度 (任意の回転など) は、期待どおりに見えない場合があります。(カメラの魚眼レンズが遠近感を非現実的に見せるのと同じように)。

リアルな画像を見たい場合は、リアルな錐台を使用していることを確認してください。

于 2013-03-12T09:40:57.807 に答える