0

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

1 回答 1

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 轴,因此第三个参数将为 1,这意味着您正在围绕图像旋转图像单位向量 z。角度应该是度数,可以是正数或负数。

尝试根据文档更改代码,您的问题将得到解决。同样使用您的四边形,您正在绘制一个 2 倍缩放的四边形,您从 -imageWidth 到 +imageWidth 开始,这意味着宽度的 2 倍......

于 2013-09-15T09:06:40.050 回答