2009-02-25 8 views
6

Używanie OpenGL Próbuję narysować prymitywną mapę mojego kampusu.Jak działa powiększanie, przesuwanie i obracanie?

Czy ktoś może mi wyjaśnić, w jaki sposób przesuwanie, powiększanie i obracanie jest zwykle realizowane?

Na przykład, przy panoramowaniu i powiększaniu, czy to po prostu ja dostosowuję moją rzutnię? Więc rysuję i rysuję wszystkie moje linie, które tworzą moją mapę, a następnie, gdy użytkownik klika i przeciąga, dostosowuje moją widoczność?

Aby przesuwać obraz, przesuwa on wartości X/Y w mojej rzutni, a powiększanie powoduje zwiększenie/zmniejszenie okna podglądu o określoną wartość? A co z rotacją?

Czy muszę wykonywać transformacje afiniczne dla każdej polilinii reprezentującej moją mapę kampusu? Czy nie będzie to kosztowne zrobić w locie na przyzwoitej mapie?

Czy ekran jest taki sam, a przesuwanie/powiększanie/obracanie odbywa się w inny sposób?


Na przykład, jeśli pójdziesz do tej link zobaczysz go opisać panoramowanie i powiększanie dokładnie jak mam powyżej, poprzez modyfikowanie rzutni.

Czy to nie jest poprawne?

Odpowiedz

7

Osiąga się to przez zastosowanie serii poleceń glTranslate, glRotate (reprezentujących położenie i orientację kamery) przed narysowaniem sceny. (technicznie, obracasz całą scenę!)

Istnieją funkcje użytkowe, takie jak gluLookAt, które sortują niektóre szczegóły na ten temat.

Aby usprawiedliwić rzeczy, załóżmy, że masz dwa wektory reprezentujące kamerę: położenie i kierunek.

gluLookAt przyjmuje położenie, miejsce docelowe i w górę wektor.

Jeśli zaimplementujesz klasę wektorową, destinaion = position + direction powinien podać punkt docelowy.

ponownie, aby rzeczy proste, można zakładać się wektor, aby zawsze być (0,1,0)

Następnie przed renderowania wszystko na swojej scenie załadować macierz jednostkową i nazywają gluLookAt

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

Następnie zacznij rysować obiekty

Możesz pozwolić użytkownikowi na zmianę poprzez zmianę pozycji lekko w prawo lub w lewo. Rotacja jest nieco bardziej skomplikowana, ponieważ trzeba obrócić wektor kierunkowy. Zakładając, że to, co obracasz, to kamera, a nie jakiś obiekt na scenie.

Jednym z problemów jest to, że jeśli wektor kierunkowy ma tylko kierunek "do przodu", jak go przesunąć? gdzie jest prawo i lewo?

Moje podejście w tym przypadku polega na wybraniu iloczynu "kierunku" i (0,1,0).

Teraz możesz przesuwać aparat w lewo i w prawo za pomocą czegoś podobnego:

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

można iść do przodu za pomocą „wektor kierunku”, ale IMO to lepiej, aby ograniczyć ruch do płaszczyzny poziomej , więc dostać się do wektora do przodu w taki sam sposób dostaliśmy właściwej vector:

forward = cross(up, right) 

być szczery, to jest w pewnym sensie hackish podejścia.

Właściwe podejście polega na użyciu bardziej "wyrafinowanej" struktury danych, która reprezentuje "orientację" kamery, a nie tylko kierunek do przodu. Ponieważ jednak dopiero zaczynasz, dobrze jest robić rzeczy krok po kroku.

+2

Pozwolę sobie dodać, że w żadnym momencie nie pojawia się "widok" (ustawiony przez glViewport). Okna podglądu określają, w jakim regionie okna będzie renderowany (to nie jest prawda, ale na razie tak myślę) i zazwyczaj obejmuje całe okno. – Thomas

1

Generalnie są trzy kroki, które są stosowane za każdym razem, gdy odwołujesz się do dowolnego punktu w przestrzeni 3D w obrębie OpenGL.

otrzymuje punktu lokalnego

  • lokalny -> Świat Transform
  • World -> Kamera Transform
  • Camera -.> Ekran Transform (zwykle projekcję zależy jeśli używasz perspektywy lub prostopadłe)

Każda z tych transformacji przyjmuje swój punkt 3D i mnoży przez macierz.

Kiedy obracasz kamerę, zmienia się świat -> transformacja kamery poprzez pomnożenie macierzy przekształceń przez transformację afiniczną/panoramiczną/zoom afiniczną. Ponieważ wszystkie twoje punkty są ponownie renderowane w każdej klatce, nowa macierz zostaje zastosowana do twoich punktów i daje wygląd rotacji.

4

Wszystkie te "działania" można uzyskać za pomocą funkcji transformacji macierzy widoku modelu. Powinieneś przeczytać o glTranslatef (przesuwanie), glScalef (zoom), glRotatef (obrót). Powinieneś także przeczytać kilka podstawowych poradników na temat OpenGL, może się okazać, że przydatne będzie this link.

Powiązane problemy