Como posso evitar a deformação ao girar em torno da linha de visão no OpenGL?

StackOverflow https://stackoverflow.com/questions/79360

  •  09-06-2019
  •  | 
  •  

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 .

ellipse

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).

rotated ellipse

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)?

Foi útil?

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.

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