2010-11-14 13 views
5

Chcę wyświetlać modele o różnych rozmiarach dopasowanych do widoku, tak aby cały model był widoczny na ekranie.
Jaki jest najlepszy sposób na zrobienie tego? Próbowałem skalowanie (przy użyciu glScale) model używając tej formułyDopasuj model 3D wewnątrz okna

scaleFactor = (screenSize/(maxModelSize * constant)) 

Jeżeli rozmiar jest wysokość lub szerokość, w zależności od tego, co jest większe.
Constant jest 1/(length of one screen pixel in OpenGL units)
Istnieją dwa problemy z tym:
1. po wykonaniu pewnych przekształceń, chcę być w stanie powrócić do tej pierwotnej skali (model jest skalowany do rozmiaru okna) za pomocą tożsamość. Obecna identyfikacja wywoła model do oryginalnych rozmiarów (przed skalą "fixing").
2. "Stała" jest czymś, co otrzymałem metodą prób i błędów, mam dla mnie niewłaściwą metodę. Podejrzewam też, że to wcale nie jest stałe i zależy od rozdzielczości ekranu, a Bóg wie, co jeszcze.

+0

„Po jakiejś przemiany, chcę być w stanie powrócić do tej pierwotnej skali (model przeskalowane do rozmiaru okna) za pomocą Tożsamości. Wywołanie tożsamości spowoduje przeniesienie modelu do jego pierwotnych rozmiarów (przed "skorygowaniem"). " To dla mnie sugeruje skalowanie matrycy ModelView. Może powinieneś zamiast tego spróbować skalować matrycę projekcyjną? Innymi słowy, stwórz większy aparat, a nie mniejszy model. – Zecc

Odpowiedz

9

Section 8.070:

Poniżej z delegowania przez Dave Shreiner na utworzenie podstawowego systemu oglądasz:

Najpierw obliczyć obwiedni kuli dla wszystkich obiektów w scenie. To powinno być dostarczyć dwa bity z informacji: środek kuli (niech (c.x, c.y, c.z) być ten punkt) i jego średnica (nazwij ją "diam").

Następnie wybierz wartość płaszczyzny przycięcia zNear . Ogólne wytyczne to , aby wybrać coś większego niż, ale blisko 1,0. Więc powiedzmy, że ustawiony

zNear = 1.0; zFar = zNear + diam; 

Struktura Twój matryca wzywa w tym kolejności (za Orthographic projekcji):

GLdouble left = c.x - diam; 
GLdouble right = c.x + diam; 
GLdouble bottom c.y - diam; 
GLdouble top = c.y + diam; 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(left, right, bottom, top, zNear, zFar); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

Takie podejście należy skupiać swoje obiekty w środku okna i rozciągnij je, aby pasowały (tj. , zakładając, że używasz okna z proporcjami = 1,0). Jeśli okno nie jest kwadratowy, obliczyć w lewo, prawo, dołu i góry, jak wyżej, a umieścić w następującej logiki przed wywołaniem do glOrtho():

GLdouble aspect = (GLdouble) windowWidth/windowHeight; 
if (aspect < 1.0) { 
    // window taller than wide 
    bottom /= aspect; 
    top /= aspect; 
} else { 
    left *= aspect; 
    right *= aspect; 
} 

Powyższy kod powinien odpowiednio ustaw obiekty w swojej scenie. Jeśli zamierzasz manipulować (tj. obrócić itp.), Musisz dodać do niego przekształcenie wyświetlania .

Typowym wejść przekształcić pójdzie na matryca ModelView i może wyglądać takiego:

GluLookAt (0., 0., 2.*diam, c.x, c.y, c.z, 0.0, 1.0, 0.0); 
+0

Co z przypadkiem, w którym projekcja jest perspektywiczna? – elect