3

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

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

我想以 Vector3f“方向”表示的特定方向滚动球。我将如何根据我希望球滚动的方向计算适当的轴旋转矢量(见上文)?

我尝试了以下方法:

  1. 将rotation.x 设置为direction.z
  2. 将rotation.z 设置为direction.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. 球通过rotation.x 沿X 轴旋转
  2. 然后球沿第 1 步创建的“新”X 轴旋转。

有什么建议可以改变这种行为,以便每次旋转都相互独立计算?

4

1 回答 1

0

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

为球存储的属性

  • 位置
  • 旋转矩阵

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

移动算法

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

  2. 旋转现在只是一个matrix.rotate( rotationSpeed, rotationAxis), 应用于现有的旋转矩阵。

如果允许球向上/向下滚动表面,请将标准向上矢量替换为适当的表面法线。

于 2013-03-17T06:32:43.430 回答