2012-03-05 37 views
13

Mam scenę z jednym prostym trójkątem. I używam rzutowania perspektywicznego. Mam matryca MVP skonfigurować (za pomocą GLM) tak:Zmiana z perspektywy na macierz ortograficzną

glm::mat4 Projection = glm::perspective(45.0f, 4.0f/3.0f, 0.1f, 100.0f); 
glm::mat4 View  = glm::lookAt(
    glm::vec3(0,0,5), // Camera is at (0,0,5), in World Space 
    glm::vec3(0,0,0), // and looks at the origin 
    glm::vec3(0,1,0) // Head is up (set to 0,-1,0 to look upside-down) 
); 
glm::mat4 Model  = glm::mat4(1.0f); 
glm::mat4 MVP  = Projection * View * Model; 

I to wszystko działa ok, mogę zmienić wartości aparatu i trójkąt jest nadal wyświetlany prawidłowo.

Ale chcę użyć rzutowania ortograficznego. A kiedy zmieniam matrycę projekcji na ortograficzną, działa nieprzewidywalnie, nie mogę wyświetlać trójkąta, lub widzę tylko niewielką jego część w rogu ekranu. Aby użyć rzutowania ortogonalnego, robię to:

glm::mat4 Projection = glm::ortho(0.0f, 800.0f, 600.0f, 0.0f,-5.0f, 5.0f); 

, podczas gdy ja nie zmieniam niczego w macierzy Widok i Model. I po prostu nie działa poprawnie.

Po prostu potrzebuję popchnąć we właściwym kierunku, czy robię coś nie tak? Czego mi brakuje, co powinienem zrobić, żeby poprawnie ustawić projekcję ortograficzną?

PS I nie wiem, czy jest to potrzebne, ale są to współrzędne trójkąta:

static const GLfloat g_triangle[] = { 
    -1.0f, 0.0f, 0.0f, 
    1.0f, 0.0f, 0.0f, 
    0.0f, 2.0f, 0.0f, 
}; 

Odpowiedz

14

Twój trójkąta wynosi około 1 jednostka duża. Jeśli używasz ortograficznej matrycy projekcyjnej o szerokości 800/600 jednostek, to naturalne, że trójkąt wydaje się bardzo mały. Wystarczy zmniejszyć granice macierzy ortograficznej i upewnić się, że trójkąt znajduje się wewnątrz tego obszaru (np. Pierwszy wierzchołek znajduje się poza widokiem, ponieważ jego współrzędna x jest mniejsza niż 0).

Ponadto należy się upewnić, że trójkąt nie zostanie usunięty przez ucięcie lub przycięcie z tyłu. Btw .. wartości ujemne dla ZNear są nieco nietypowe, ale powinny działać dla rzutów ortograficznych.

+0

@Nico_Schertler Dzięki, jestem naprawdę głupi: \ To działało! gdybym mógł prosić o jeszcze jedną rzecz - próbowałem całkowicie usunąć model i wyświetlić matryce i wszystko jest nadal wyświetlane poprawnie! Czy potrzebuję tylko matrycy projekcyjnej, gdy używam ortografii? Przepraszam, jeśli pytanie jest trochę mylące, właśnie zacząłem z OpenGL kilka dni temu. Wielkie dzięki! – IanDess

+1

Domyślny nieprzetworzony układ współrzędnych to lewy górny róg (-1,1), dolny prawy róg (1, -1). Współrzędna z zależy od tego, czy korzystasz z układu współrzędnych RH czy LH. Jeśli zakres ten pasuje do twoich potrzeb, możesz pozostawić matrycę projekcji na tożsamości i używać tylko matrycy widoku do nawigacji po scenie. W przeciwnym razie możesz użyć macierzy projekcji, aby skalować scenę itp. –