使用旋转矩阵旋转Texture2d

时间:2012-04-28 18:48:44

标签: c++ opengl-es

我想在cocos2d-x(opengl es)中旋转2d纹理,因为我搜索了我应该使用旋转矩阵 这样:

  

(x = cos(deg)* x - sin(deg)* y y = sin(deg)* x + cos(deg)* y)

但是当我想实现这个公式时我失败可能代码就像(我希望原始x和y相同): 我将我的代码更新为此但仍无效!

     GLfloat    coordinates[] = {
        0.0f,   text->getMaxS(),
        text->getMaxS(),text->getMaxT(),
        0.0f,   0.0f,
        text->getMaxS(),0.0f };
     glMatrixMode(GL_MODELVIEW);
    glPushMatrix();


    GLfloat vertices[] = {  rect.origin.x,      rect.origin.y,                          1.0f,
                            rect.origin.x + rect.size.width,        rect.origin.y,                          1.0f,
                            rect.origin.x,                          rect.origin.y + rect.size.height,       1.0f,
                            rect.origin.x + rect.size.width,        rect.origin.y + rect.size.height,       1.0f };

    glMultMatrixf(vertices);
    glTranslatef(p1.x, p1.y, 0.0f);
    glRotatef(a,0,0,1);
    glBindTexture(GL_TEXTURE_2D, text->getName());
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
    glColor4f( 0, 0, 250, 1);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    glRotatef(-a, 0.0f, 0.0f, -1.0f);
    glPopMatrix();

2 个答案:

答案 0 :(得分:2)

如果您在二维中使用OpenGL,您仍然可以使用各种转换功能。对于glRotate(),您必须传递轴(0,0,1):

glRotate(angle,0,0,1);

答案 1 :(得分:1)

您似乎对OpenGL的几个方面感到困惑。在你得到这个的那一刻:

glMultMatrixf(vertices);
glTranslatef(p1.x, p1.y, 0.0f);
glRotatef(a,0,0,1);
glBindTexture(GL_TEXTURE_2D, text->getName());
glVertexPointer(3, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
glColor4f( 0, 0, 250, 1);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glRotatef(-a, 0.0f, 0.0f, -1.0f);
glPopMatrix();

表面上可能是这样:

// reinterpret your vertices as a matrix; multiply the
// current matrix by the one formed from your vertices
glMultMatrixf(vertices);

// rotate by a degrees, then translate to p1
glTranslatef(p1.x, p1.y, 0.0f);
glRotatef(a,0,0,1);

// bind the relevant texture, supply the vertices
// as vertices this time, supply texture coordinates
glBindTexture(GL_TEXTURE_2D, text->getName());
glVertexPointer(3, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, coordinates);

// set a colour of (0, 0, 1, 1) — probably you
// wanted glColor4ub to set a colour of (0, 0, 250/255, 1)?
glColor4f( 0, 0, 250, 1);

// draw some geometry
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

// perform the same rotation as before a second time;
// giving either a and -1, or -a and 1 would have been
// the opposite rotation
glRotatef(-a, 0.0f, 0.0f, -1.0f);

// remove the current matrix from the stack
glPopMatrix();

你可能想要的是:

// push the current matrix, so that the following
// transformations can be undone with a pop
glPushMatrix();

// rotate by a degrees, then translate to p1
glTranslatef(p1.x, p1.y, 0.0f);
glRotatef(a,0,0,1);

// bind the relevant texture, supply the vertices
// as vertices this time, supply texture coordinates
glBindTexture(GL_TEXTURE_2D, text->getName());
glVertexPointer(3, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, coordinates);

// set a colour of (0, 0, 250/255, 1)
glColor4ub( 0, 0, 250, 1);

// draw some geometry
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

// remove the current matrix from the stack
glPopMatrix();

当前的变换矩阵应用于所有几何体。您没有标记它们适用于哪种几何体以及它们不适用的几何体。推送和弹出应该配对,并且当你想要的时候,你可以通过影响先前转换的方式来影响转换。因此,您不需要手动执行反向旋转,并且需要在执行更改矩阵的所有内容之前进行推送。由于上面给出的原因,我也将你切换到glColor4ub - 您似乎使用无符号字节来推送颜色,但OpenGL使用0.0到1.0的范围来表示颜色。 glColor4ub会自动从前者映射到后者。