opengl旋转纹理偏离中心

时间:2013-09-15 06:38:34

标签: java opengl

我写了一些代码来获得一个普通的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();

1 个答案:

答案 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倍......