2014-10-18 116 views
0

我想让2个立方体以不同方式旋转。LWJGL旋转对象

设置旋转,我这样做。

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旋转,并且通过这三个方法在立方体类中进行更新。

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(等,等,等,等)和GL11.glRotatef(等* -1.0F,等,等,等)” 工作正常,但是当他们都在一起,奇怪的旋转发生。

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

在此先感谢。

回答

2

你的反演代码似乎是错误的。需要注意的是矩阵乘法是不可交换:

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

逆(这是simmilar到你的三个rotatef电话)是

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

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

0

首先应该停止使用旧的过时的固定功能管线

否则,你想要的是像这样:

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()恢复上次保存矩阵

+0

我将如何避免使用固定功能管道? – irishpatrick 2014-10-18 23:01:01

+0

了解基于着色器的方法,您直接管理矩阵而不是让openGL做到这一点 – 2014-10-18 23:02:50