Como posso evitar a deformação ao girar em torno da linha de visão no OpenGL?
Pergunta
Desenhei uma elipse no plano XZ e configurei minha perspectiva ligeiramente para cima no eixo Y e de volta para Z, olhando para o centro da elipse de um ângulo de 45 graus, usando gluPerspective() para definir meu frustração de visualização .
Não girado, o eixo principal da elipse abrange a largura da minha janela de visualização.Quando giro 90 graus em torno da minha linha de visão, o eixo principal da elipse agora abrange a altura da minha janela de visualização, deformando assim a elipse (nesse caso, fazendo com que pareça menos excêntrica).
O que preciso fazer para evitar essa deformação (ou pelo menos levá-la em conta), para que a rotação em torno da linha de visão preserve o eixo principal percebido da elipse (neste caso, fazendo com que ela ultrapasse a janela de visualização)?
Solução
Parece que você está usando 1.0 como aspecto ao chamar gluPerspective().Você deve usar largura/altura.Por exemplo, se sua janela de visualização for 640x480, você usaria 1,33333 como argumento de aspecto.
Outras dicas
De acordo com as especificações do OpenGL:
void gluPerspective( GLdouble fovy,
GLdouble aspect,
GLdouble zNear,
GLdouble zFar )
O aspecto deve ser uma função da largura e altura da janela.Especificamente largura dividida por altura (mas cuidado com a divisão por zero).
Talvez você esteja usando 1 como aspecto que não é preciso, a menos que sua janela seja quadrada.
Parece que o parâmetro de aspecto na sua chamada gluPerspective precisa de ajustes.Ver A página de manual.Se sua janela fosse fisicamente quadrada, a proporção seria 1 e seu problema desapareceria.Porém, sua janela é retangular, então o tronco de visualização precisa ser não quadrado.
Defina a proporção para window_width / window_height e sua elipse deve parecer correta.Observe que você precisará atualizar isso sempre que a janela for redimensionada;se você estiver usando GLUT, defina um glutReshapeFunc e recalcular a matriz de projeção ali.