使用四元数,如果我沿着轴旋转我的立方体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
,它提供了不同但同样失真的结果。
我使用四元数作为Modelview旋转矩阵,使用:
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;
}
知道这里发生了什么吗?
答案 0 :(得分:0)
你的视锥体是什么样的?如果您有一个扭曲的“镜头”,例如特殊的广角视野,那么实际显示深度的角度(例如任意旋转)可能看起来不像您期望的那样。 (就像相机上的鱼眼镜头使视角看起来不切实际)。
如果你想看到逼真的图像,请确保使用逼真的平截头体。