【问题标题】:LWJGL Rotating ObjectsLWJGL 旋转物体
【发布时间】:2014-10-18 22:10:47
【问题描述】:

我试图让 2 个立方体以不同的方式旋转。

要设置旋转,我这样做。

GL11.glRotatef(rot[0], 1.0f, 0.0f, 0.0f);
GL11.glRotatef(rot[1], 0.0f, 1.0f, 0.0f);
GL11.glRotatef(rot[2], 0.0f, 0.0f, 1.0f);

我没有使用 GL11.glLoadIdentity() 来重置旋转,而是在多维数据集类中执行了类似的操作。

GL11.glRotatef(rot[0] * -1.0f, 1.0f, 0.0f, 0.0f);
GL11.glRotatef(rot[1] * -1.0f, 0.0f, 1.0f, 0.0f);
GL11.glRotatef(rot[2] * -1.0f, 0.0f, 0.0f, 1.0f);

这应该重置每个轴的旋转。

数组“rot”保存了x、y、z的旋转,并通过cube类中的这3个方法进行更新。

public void pitch(float angle) {
    rot[0] = angle;
}

public void yaw(float angle) {
    rot[1] = angle;
}

public void roll (float angle) {
    rot[2] = angle;
}

单独地,每个“GL11.glRotatef(etc,etc,etc,etc) 和 GL11.glRotatef(etc * -1.0f, etc,etc,etc)”都可以正常工作,但是当它们都在一起时,会发生奇怪的旋转.

我不确定这是否与 Gimbal Lock 或我的代码有关,请帮忙。

提前致谢。

【问题讨论】:

    标签: java opengl rotation lwjgl


    【解决方案1】:

    您的反演代码似乎是错误的。请注意,矩阵乘法不可交换:

    倒数

    R(x) * R(y) * R(z)
    

    (类似于您的三个 rotatef 调用)是

    R(-z) * R(-y) * R(-x)
    

    。这意味着您必须更改调用第二个 glRotatef 命令的顺序。

    【讨论】:

      【解决方案2】:

      首先你应该停止使用旧的不推荐使用的固定功能管道

      否则你想要的是这样的:

      GL11.pushMatrix();
      GL11.glRotatef(rot[0], 1.0f, 0.0f, 0.0f);
      GL11.glRotatef(rot[1], 0.0f, 1.0f, 0.0f);
      GL11.glRotatef(rot[2], 0.0f, 0.0f, 1.0f);
      
      //render
      
      GL11.popMatrix();
      

      pushMatrix() 保存当前矩阵,popMatrix() 恢复上次保存的矩阵

      【讨论】:

      • 如何避免使用固定功能管道?
      • 学习基于着色器的方法,您可以在其中直接管理矩阵,而不是让 openGL 这样做
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多