【问题标题】:Why is my cube distorted?为什么我的立方体变形了?
【发布时间】:2013-03-12 06:53:35
【问题描述】:

使用四元数,如果我将立方体沿轴旋转 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;
}

知道这里发生了什么吗?

【问题讨论】:

  • 我猜您的深度测试存在某种问题。检查它可能会付出代价!
  • 不相关,我不认为,但我看不出if (v0 == -v1) 子句应该如何工作。如果我想将 (1,0,0) 旋转到 (-1,0,0) 上,围绕 (1,0,0) 的旋转如何产生正确的方向?就此而言,它如何适用于不垂直于任意 (1,0,0) 轴的任何向量?
  • @JasonD 好问题。这不是我的向量库,而是一个被广泛使用的向量库。
  • @SebbyJohanns 被广泛使用?这很令人担忧,如果那里有这样的错误。有链接吗?
  • @SebbyJohanns 原始对输入向量进行了归一化,并说明如果您知道您的输入已经归一化(在您的示例中至少有一个不是),则可以跳过此操作跨度>

标签: opengl-es 3d quaternions


【解决方案1】:

你的截锥体是什么样的?如果您有一个扭曲的“镜头”,例如超广角视野,那么实际显示深度的角度(例如任意旋转)可能看起来不像您预期​​的那样。 (就像相机上的鱼眼镜头使透视看起来不切实际一样)。

如果您想看到逼真的图像,请确保您使用的是逼真的平截头体。

【讨论】:

    猜你喜欢
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多