簡體   English   中英

使用旋轉矩陣旋轉Texture2d

[英]Rotate Texture2d using rotation matrix

我想在cocos2d-x(opengl es)中旋轉2d紋理,因為我搜索了應使用旋轉矩陣,如下所示:

(x = cos(度)* x-sin(度)* yy = sin(度)* x + cos(度)* 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();

如果在二維中使用OpenGL,則仍可以使用各種轉換函數。 對於glRotate() ,您必須向其傳遞(0,0,1)的軸:

glRotate(angle,0,0,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將自動從前者映射到后者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM