滚动3D球的旋转

3

我在3D空间中有一个球,具有以下属性:

位置 - 代表球的Vector3f 旋转 - 代表x、y和z轴旋转角度的Vector3f

我想让球按照指定的方向滚动,该方向由Vector3f“direction”表示。如何根据我希望球往哪个方向滚动来计算适当的轴旋转向量(见上文)?

我已经尝试了以下方法:

  1. 将旋转.x设为方向.z
  2. 将旋转.z设为方向.x

计算球的变换矩阵如下:

private Matrix4f calculateEntityMatrix(EEntity entity)
{
    Matrix4f matrix = new Matrix4f();
    matrix.translate(new Vector3f(entity.getXLocation(), entity.getYLocation(), entity.getZLocation()));

    if(entity.getXRotation()>0)
    {
        matrix = matrix.rotate(entity.getXRotation(), new Vector3f(1f, 0f, 0f));
    }
    if(entity.getYRotation()>0)
    {
        matrix = matrix.rotate(entity.getYRotation(), new Vector3f(0f, 1f, 0f));
    }
    if(entity.getZRotation()>0)
    {
        matrix = matrix.rotate(entity.getZRotation(), new Vector3f(0f, 0f, 1f));
    }
    if(entity.getXScale()!=1 || entity.getYScale()!=1 || entity.getZScale()!=1)
    {
        matrix = matrix.scale(new Vector3f(entity.getXScale(), entity.getYScale(), entity.getZScale()));
    }

    return matrix;
}

这在沿x或z轴滚动时有效,但当我朝两个轴之间的方向滚动时,旋转似乎不正确。我的假设是这是由于旋转计算如下所示引起的:
  1. 球体沿X轴旋转rotation.x
  2. 球体沿步骤1创建的“新”X轴旋转rotation.z。
有什么建议可以改变这种行为,使得每个旋转独立于另一个计算?

确保防止发生万向节锁定。或者使用四元数。 - Vorac
1个回答

0

除非您想要实现滑动和/或回旋,否则我认为您应该稍微不同地解决这个问题。您已经有一个支持绕任意轴旋转的Matrix.rotate()使用它

存储球的属性

  • 位置
  • 旋转矩阵

注意:在基于矩阵的系统/场景图中,弹球通常会被存储在单个4x4变换矩阵中。这可能更方便,也可能不方便,具体取决于您当前代码库的其余部分。

移动算法

  1. 给定球的direction和标准上向量(0, 1, 0),使用叉积计算rotation axis。(即它垂直于方向和上轴)

  2. 现在旋转就是简单的matrix.rotate(rotationSpeed, rotationAxis),应用于现有的旋转矩阵。

如果允许球在表面上卷起/下滚,则将标准上向量替换为适当的表面法线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接