Pergunta

Usando OpenGL Eu estou tentando desenhar um mapa primitiva do meu campus.

Alguém pode me explicar como panorâmica, zoom e rotação é normalmente implementado?

Por exemplo, com panorâmica e zoom, é que simplesmente me ajustar a minha janela? Então eu traçar e tirar todas as minhas linhas que compõem o meu mapa, e depois como o usuário clica e arrasta ajusta minha janela?

Para panning, não é mudar os x / y valores da minha janela e para zoom isso aumentar / diminuir minha janela por alguns montante? E sobre a rotação?

Para rotação, que eu tenho que fazer as transformações afins para cada polilinha que representa o meu mapa do campus? Isso não vai ser caro para fazer na mosca em um mapa de tamanho decente?

Ou, é a porta de visualização deixou a mesma e visão panorâmica / zoom / rotação é feita em algum otherway?


Por exemplo, se você ir a este link você vai vê-lo descrevem panorâmica e zoom exatamente como eu tenho acima, modificando a janela.

Não é isto correto?

Foi útil?

Solução

Eles estão alcançado através da aplicação de uma série de glTranslate, comandos glRotate (que representam a posição da câmera e orientação) antes de desenhar a cena. (Tecnicamente, você está girando toda a cena!)

Existem funções de serviços públicos como gluLookAt que Sorta abstratas alguns detalhes sobre isso.

Para simplyify coisas, suponha que você tem dois vetores representando sua câmera: posição e direção.

gluLookAt assume a posição, vector destino, e para cima.

Se você implementar uma classe vector, destinaion = position + direction deve dar-lhe um ponto de destino.

Mais uma vez para tornar as coisas simples, você pode assumir o vetor de estar sempre (0,1,0)

Então, antes de exibir qualquer coisa na sua cena, carregar a matriz identidade e chamar gluLookAt

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0 );

Em seguida, começar a desenhar seus objetos

Você pode deixar o espaço do usuário, alterando a posição ligeiramente para a direita ou para a esquerda. A rotação é um pouco mais complicado, pois você tem que girar o vetor de direção. Assumindo que o que você está girando é a câmera, e não algum objeto na cena.

Um problema é, se você tiver apenas um vetor de direção "forward" como você movê-lo? onde está a direita e esquerda?

A minha abordagem neste caso é apenas para levar o produto cruzado de "direção" e (0,1,0).

Agora você pode mover a câmera para a esquerda e para a direita com algo como:

position = position + right * amount; //amount < 0 moves to the left

Você pode avançar usando o "vetor de direção", mas IMO é melhor para restringir o movimento a um plano horizontal, de modo a obter o vector para a frente da mesma forma temos o vector direita:

forward = cross( up, right )

Para ser honesto, isso é um pouco de uma abordagem hackish.

A abordagem adequada é usar uma estrutura mais dados "sofisticada" para representar a "orientação" da câmera, não apenas a frente. No entanto, desde que você está apenas começando, é bom levar as coisas um passo de cada vez.

Outras dicas

Todas estas "ações" pode ser conseguido usando Model-View funções de transformação da matriz. Você deve ler sobre glTranslatef (panning), glScalef (zoom), glRotatef (rotação). Você também deve precisa ler algum tutorial básico sobre OpenGL, você pode encontrar este link útil.

Geralmente, existem três passos que são aplicadas sempre que você faz referência a qualquer ponto no espaço 3D dentro OpenGL.

Dado um ponto local

  • Local -> Mundo Transform
  • Mundo -> Camera Transform
  • Camera -> Tela Transform (. Geralmente uma projeção depende se você estiver usando perspectiva ou ortogonal)

Cada uma dessas transformações está tomando seu ponto 3d, e multiplicando por uma matriz.

Quando você está girando a câmera, é geralmente mudar o mundo -> câmera transformar multiplicando a matriz de transformação por sua rotação / pan / zoom afim transformação. Desde todos os seus pontos são re-processado cada quadro, a nova matriz é aplicada a seus pontos, e dá a aparência de uma rotação.

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