旋转滚动3d球

时间:2013-03-17 05:05:26

标签: java opengl 3d rotation

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

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

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

我尝试了以下内容:

  1. 将rotation.x设置为direction.z
  2. 将rotation.z设置为direction.x
  3. 将球的变换矩阵计算为:

    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轴旋转旋转。
    2. 然后通过rotation.z沿着步骤1创建的“新”X轴旋转。
    3. 有关如何更改此行为以便每个轮换彼此独立计算的任何建议吗?

1 个答案:

答案 0 :(得分:0)

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

为球存储的属性

  • 位置
  • 旋转矩阵

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

移动的算法

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

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

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