之前已经多次询问这个问题,而且我已经在互联网上阅读了很多关于它的帖子和论坛,但我无法让一个对象围绕它自己的轴旋转。 我有几个这样的对象:
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
.....
gl.glPushMatrix();
gl.glRotatef(angle, 0.0f, 1.0f, 0.0f);
gl.glTranslatef(0.0f, 0.0f, 0.0f);
texture.bind(gl);
gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, textureRLt);
gl.glNormalPointer(GL2.GL_FLOAT, 0, normalRLt);
gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vertexRLt);
gl.glDrawElements(GL2.GL_TRIANGLES, countI, GL2.GL_UNSIGNED_SHORT, indexRLt);
gl.glPopMatrix();
这是正确绘制的,应用了所有纹理和法线。
我知道OpenGL反向执行命令,这就是为什么glRotatef是第一个。我也知道所有旋转都在原点周围,所以我需要将对象转换为该原点(不是我认为我必须,因为“笔”已经在原点,因为我在绘制每个对象之前保存了矩阵然后弹出它)。它是glDrawElements的东西吗?有些事似乎不对。
任何帮助将不胜感激。 :)
编辑:我可以看到对象围绕主x轴旋转的方式,但我希望它们围绕局部x轴旋转。
答案 0 :(得分:0)
“OpenGL反向执行命令”,意味着它将变换矩阵从右边而不是左边相乘。这是什么意思?
想象一下转型A和B:
y = Ax
按x
转换A
并生成y
这相当于:
// sudo code:
glA()
glDraw(x)
现在,通常,在编程中,您认为您可以按照编写它们的方式进行转换。所以,你认为那个
glA()
glB()
glDraw(x)
会给你
y = BAx
但这是错误的。你真的得到:
y = ABx
这意味着,首先B
应用于x
,然后A
应用于结果。
用英语说,看看这个例子:
glScalef(...) // third, scale the whole thing
glTranslatef(...) // second, translate it somewhere
glRotatef(...) // first, rotate the object (or course,
// around its own axes, because the object is at origin)
glDrawElements(...) // draw everything at origin
所以,你需要做的是写:
// When everything is drawn, move them to destination:
gl.glTranslatef(destination[0], destination[1], destination[2]);
// For every object, rotate it the way it should, then restore transformation matrix
// object: RLt
gl.glPushMatrix();
gl.glRotatef(angle, 0.0f, 1.0f, 0.0f);
texture.bind(gl);
gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, textureRLt);
gl.glNormalPointer(GL2.GL_FLOAT, 0, normalRLt);
gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vertexRLt);
gl.glDrawElements(GL2.GL_TRIANGLES, countI, GL2.GL_UNSIGNED_SHORT, indexRLt);
gl.glPopMatrix();
// object: RLt2
gl.glPushMatrix();
gl.glRotatef(angle2, 0.0f, 1.0f, 0.0f);
texture.bind(gl);
gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, textureRLt2);
gl.glNormalPointer(GL2.GL_FLOAT, 0, normalRLt2);
gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vertexRLt2);
gl.glDrawElements(GL2.GL_TRIANGLES, countI2, GL2.GL_UNSIGNED_SHORT, indexRLt2);
gl.glPopMatrix();
答案 1 :(得分:0)
我不确定,您是否定期更新'angle'变量。如果你不是,那么就不会有任何轮换。伪代码如下。您可以使用gluttimerfunc定期更新变量。
for(每个opengl循环)
角度+ = 5.0F
萨蒂什南比亚