Pergunta

Para o meu projeto eu precisava para rodar um retângulo. Eu pensei que seria fácil, mas eu estou recebendo um comportamento imprevisível quando executá-lo ..

Aqui está o código:

    glPushMatrix();
    glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBegin(GL_QUADS);

        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(0, 0);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(width_sprite_, 0);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(width_sprite_, height_sprite_);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(0, height_sprite_);

    glEnd();
    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
    glPopMatrix();

O problema com isso, é que a minha retângulo está fazendo um lugar de tradução na janela durante a rotação. Em outras palavras, o retângulo não manter a posição: vec_vehicle_position_.x e vec_vehicle_position_.y

.

Qual é o problema?

Graças

Foi útil?

Solução

Você precisa virar a ordem das suas transformações:

glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);

se torna

glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);

Outras dicas

Para elaborar as respostas anteriores.

Transformações em OpenGL são realizadas via multiplicação de matrizes. No seu exemplo você tem:

M_r_ - transformar a rotação

M_t_ - transformar a tradução

v - um vértice

e que tinha os aplicados na ordem:

M_r_ * M_t_ * v

Usando parênteses para esclarecer:

(M_r_ * (M_t_ * v))

Vemos que o vértice é transformado pela matriz mais perto em primeiro lugar, que é, neste caso, a tradução. Pode ser um pouco contra-intuitivo porque isso requer que você especifique as transformações no oposto ordem daquilo que você quer que eles aplicada. Mas se você pensar em como as transformações são colocados na pilha matriz deve esperamos fazer um pouco mais sentido (a pilha está em conjunto pré-multiplicado).

Daí porque, a fim de obter o resultado desejado que você precisava para especificar as transformações na ordem oposta.

Inertiatic forneceu uma resposta muito boa. De uma perspectiva de código, as suas transformações acontecerá na ordem inversa em que aparecem. Em outras palavras, as transformações mais perto do código de desenho real será aplicada pela primeira vez.

Por exemplo:
glRotate();
glTranslate();
glScale();
drawMyThing();

Será primeira escala de sua coisa, então traduzi-lo, em seguida, girá-lo. Você efetivamente precisa "ler seus trás de código" para descobrir o que transforma estão sendo aplicados em que ordem. Também tenha em mente o que o estado dessas transformações é quando você empurrar e pop a pilha modelo-view.

Certifique-se a rotação é aplicada antes da tradução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top