Computação Gráfica
Prof. Márcio Sarroglia Pinho


Navegação em Ambientes Virtuais

A navegação em OpenGL ou, em outras palavras, o posicionamento do observador é feito normalmente com a função gluLookAt. Nesta função define-se a posição do observador e o seu ponto de interesse, além do vetor que aponta para o "lado de cima" do cenário 3D.

Andando "para frente" com a glLookAt

Para permitir que um observador ande na direção em que ele está olhando é necessário somar à posiçõa atual do observador um vetor que tenha a mesma direção que vetor que vai do observador até o alvo. A mesma soma deve ser fetia ao ponto alvo.

É interessante que este vetor seja unitário pois assim se pode controlar a velocidade do deslocamento.
A fórmula a seguir demonstra como pode ser feito o deslocamento descrito acima.

PosicaoNova = PosicaoAtual + VetorAlvoUnitario * TamanhoDoPasso
AlvoNovo = AlvoAtual + + VetorAlvoUnitario * TamanhoDoPasso

Olhando "para os lados" com a glLookAt

Para permitir que um observador "olhe para os lados" é preciso recalcular o ponto Alvo, aplicando sobre ele uma rotação ao redor do eixo Y.

Para rotacionar um ponto ao redor deste eixo usa-se a seguinte fórmula:

AlvoNovo.X = AlvoAtual.X*cos(alfa) + AlvoAtual.Z*sen(alfa)
AlvoNovo.Y =  AlvoAtual.Y
AlvoNovo.Z = -AlvoAtual.X*sen(alfa) + AlvoAtual.Z*cos(alfa)
Note, entretanto que esta fórmula rotaciona o ponto ao redor do ponto (0,0,0).

Como fazer para rotacioná-lo corretamente ?

Uma alternativa é executar os seguintes passos:
 

 


 


Para tanto, calcule um novo "ALVO", fazendo

NOVO_ALVO = ALVO-OBS;
 


AlvoNovoROT.X =  NOVO_ALVO.X*cos(alfa) + NOVO_ALVO.Z*sen(alfa)
AlvoNovo
ROT.Y =  NOVO_ALVO.Y
AlvoNovo
ROT.Z = -NOVO_ALVO.X*sen(alfa) + NOVO_ALVO.Z*cos(alfa) 

 


Para tanto, calcule um novo alvo, fazendo

ALVO_FINAL = AlvoNovoROT + OBS;

Exercício

A partir do exemplo básico, construa um programa que mova o observador para frente e permita que ele olhe para os lados. Faça o controle dos movimentos por teclas.