2014-10-18 153 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