OpenGL rotativa uma câmara em torno de um ponto
Pergunta
Em OpenGL estou tentando girar uma câmera em torno de um ponto, com a câmera sendo distância r do ponto e de frente para o ponto quando ele gira. Em outras palavras, eu quero que a câmera se mova ao longo da circunferência de um círculo com um raio r do centro, com a câmera de frente para o centro em qualquer ponto ao longo da circunferência.
Vamos dizer que no espaço 3D no centro do círculo é (3, 0, 3);
Eu tentei:
// move to center of circle
glTranslatef(-3, 0, -3)
// move a distance away from the circle
glTranslatef(0, 0, r);
// rotate along the y "up" axis
glRotatef(CameraAngle, 0, 1, 0);
onde é CameraAngle os graus sendo movido em torno do círculo.
O meu resultado final é a câmera ainda está girando ao longo da origem, não o centro do círculo. Alguém pode me ajudar a resolver este problema? Obrigado!
Solução
Você precisa se quer:
- girar a câmera em torno da origem e, em seguida, traduzi-lo (*)
ou
- uso
gluLookAt
para manter a apontar câmera para o centro do círculo
(*) normalmente giram em torno da origem. Para girar em torno de outra P
ponto você tem que:
- traduzir (-P)
- rotate
- traduzir (P)
Outras dicas
é um pouco confuso, mas eu acho que você deveria:
// move camera a distance r away from the center
glTranslatef(0, 0, -r);
// rotate
glRotatef(angley, 0, 1, 0);
glRotatef(anglex, 1, 0, 0);
// move to center of circle
glTranslatef(-cx, -cy, -cz)
Observe a ordem NÃO deve ser alterado.
Por que se preocupar com todos os problemas de girar a câmera e não girar a cena em si?
É muito mais para a frente. basta girar a matriz de modelagem em torno da origem. Você vai ter exatamente o mesmo resultado.
I encontrar problemas como este muito mais fácil de resolver com gluLookAt (). Você definir um caminho para a câmera (um círculo é fácil!) E manter o ponto de "centro" fixo (ou seja, a coisa que você está olhando).
A única possível truque é definir um bom vetor - mas geralmente não muito trabalho. Se o caminho eo ponto de destino estão no mesmo plano, você pode usar o mesmo vetor de cada vez!