java - 滚动 3d 球的旋转

标签 java opengl 3d rotation

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

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

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

我尝试过以下方法:

  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 创建的"new"X 轴旋转rotation.z。

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

最佳答案

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

为球存储的属性

  • 位置
  • 旋转矩阵

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

移动算法

  1. 给定球方向和标准向上 vector (0, 1, 0),使用以下公式计算旋转轴叉积。 (即它垂直于方向和上轴)

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

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

关于java - 滚动 3d 球的旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15457735/

相关文章:

java - 遍历期间从图中删除节点

javascript - 如何获得 AABB 顶点的三 Angular 形?

opengl - 获取变换后OpenGL 3D对象的屏幕坐标和大小

java - 对 MBean 进行版本控制的最佳方式?

java - Cobertura 和 jetty

java - 创建自定义计划作业监视器 ATG

c# - 'CsGL.OSLib' 抛出异常

C++ 性能异常 w/OpenGL

opengl - 如何使用 glGenTextures

opengl - 处理大量图像