0

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();
4

2 に答える 2

2

2 次元で OpenGL を使用している場合でも、さまざまな変換関数を使用できます。の場合glRotate()、(0,0,1) の軸を渡す必要があります。

glRotate(angle,0,0,1);
于 2012-04-28T19:12:31.097 に答える
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前者から後者に自動的にマップされます。

于 2012-04-28T22:23:27.160 に答える