我写了一些代码来获得一个普通的2D盒子来面对鼠标。它在中心周围旋转得很好,一切都很好,但是当我在盒子上放一个纹理时,它不再围绕中心旋转。
代码:
float imgWidth = texture.getImageWidth()*scale;
float imgHeight = texture.getImageHeight()*scale;
glLoadIdentity();
texture.bind();
glTranslatef(x, y, 0);
glRotated(rotation - 90, 0, 0, 360);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(-imgWidth, -imgHeight);
glTexCoord2f(1, 0);
glVertex2f(imgWidth, -imgHeight);
glTexCoord2f(1,1);
glVertex2f(imgWidth, imgHeight);
glTexCoord2f(0, 1);
glVertex2f(-imgWidth, imgHeight);
glEnd();
答案 0 :(得分:1)
答案很简单,但背景复杂,必须要理解。
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轴,因此第3个参数将为1表示您正在旋转单位矢量z周围的图像。 角度应该是度,可以是正的也可以是负的。
尝试根据文档更改代码,您将解决问题。 另外你的四边形你正在绘制一个2倍缩放的四边形,你从-imageWidth开始到+ imageWidth意味着宽度的2倍......