答案很简单,但需要理解一个复杂的背景。
OpenGL 总是不围绕其中心旋转一些东西,而是以点 (0;0) 为中心。
这可能是一个问题,因为如果您将对象平移到某个地方然后旋转它,它不会在其中心旋转,而是围绕 (0;0) 点(原点)旋转,从而产生大的旋转,我会说是围绕太阳。
OpenGL也与矩阵一起工作,非常野蛮的简化意味着操作是从下到上执行的。
// store the current model matrix
GL11.glPushMatrix();
// bind to the appropriate texture for this image
this.texture.bind();
// translate to the right location and prepare to draw
GL11.glColor3f(1, 1, 1);
GL11.glTranslated(x + (this.texture.getImageWidth() / 2), y + (this.texture.getImageHeight() / 2), 0);
GL11.glRotated(this.angle, 0, 0, 1);
GL11.glTranslated(-this.texture.getImageWidth() / 2, -this.texture.getImageHeight() / 2, 0);
// draw a quad textured to match the sprite
GL11.glBegin(GL11.GL_QUADS);
{
GL11.glTexCoord2f(0, 0);
GL11.glVertex2f(0, 0);
GL11.glTexCoord2f(0, this.texture.getHeight());
GL11.glVertex2f(0, this.texture.getImageHeight());
GL11.glTexCoord2f(this.texture.getWidth(), this.texture.getHeight());
GL11.glVertex2f(this.texture.getImageWidth(), this.texture.getImageHeight());
GL11.glTexCoord2f(this.texture.getWidth(), 0);
GL11.glVertex2f(this.texture.getImageWidth(), 0);
}
GL11.glEnd();
// restore the model view matrix to prevent contamination
GL11.glPopMatrix();
这意味着首先我要移动纹理使其中心位于 (0;0) 处,这意味着将其向后平移一半尺寸。然后我旋转它,这是关键点,因为你使用一种奇怪的方式旋转它,可能是它的问题,看一下javadoc:
SPECIFICATION
void glRotated( GLdouble angle,<br>
GLdouble x,<br>
GLdouble y,<br>
GLdouble z )<br>
void glRotatef( GLfloat angle,<br>
GLfloat x,<br>
GLfloat y,<br>
GLfloat z )<br>
PARAMETERS<br>
angle Specifies the angle of rotation, in degrees.
x, y, z<br>
Specify the x, y, and z coordinates of a vector, respectively.
DESCRIPTION<br>
glRotate produces a rotation of angle degrees around the<br>
vector (x,y,z).
首先,x,y,z 值应该在 0 和 1 之间,如果要旋转 2d 图像,则应使用 z 轴,因此第三个参数将为 1,这意味着您正在围绕图像旋转图像单位向量 z。角度应该是度数,可以是正数或负数。
尝试根据文档更改代码,您的问题将得到解决。同样使用您的四边形,您正在绘制一个 2 倍缩放的四边形,您从 -imageWidth 到 +imageWidth 开始,这意味着宽度的 2 倍......