2010-06-08 6 views
5

Mam kwadrat wyrównany na ekranie i chciałbym powiększyć dowolny prostokąt w tym kwadracie, ale nie dostaję matematyki dobrze.Próba przybliżenia prostego prostokąta w kwadracie wyrównanym do kwadratu

Wydaje mi się, że mam już przetłumaczone tłumaczenie, ale nie skalowanie. Zasadniczo mój kod jest następujący:

// 
// render once zoomed in 
glPushMatrix(); 
glTranslatef(offX, offY, 0); 
glScalef(?wtf?, ?wtf?, 1.0f); 

RenderQuad(); 

glPopMatrix(); 

// 
// render PIP display 
glPushMatrix(); 
glTranslatef(0.7f, 0.7f, 0); 
glScalef(0.175f, 0.175f, 1.0f); 

RenderQuad(); 

glPopMatrix(); 

Ktoś ma jakieś wskazówki? Użytkownik wybiera obszar prostokątu, a następnie te wartości są przekazywane do mojego obiektu renderującego jako [x, y, w, h], gdzie wartości te są procentami szerokości i wysokości okna roboczego.

Odpowiedz

0

Kiedy muszę to zrobić, zawsze zmieniłem parametry, które przekazałem do glOrtho, glFrustrum, gluPerspective lub cokolwiek (w zależności od tego, z czego korzystałem).

+0

Używam glOrtho (0, 1, 0, 1, 0, 1). Próbowałem zmienić to na glOrtho (0, 0,5, 0, 0,5, 0, 1), aby symulować powiększanie dolnego lewego prawego prostokąta, ale właśnie dostałem czarny ekran śmierci. – moswald

+0

@mos: Trochę zagubiłem się, jak to się mogło stać, chyba że zmieniłbyś również coś innego (lub, oczywiście, nie narysowałeś niczego w tym kwadrancie). Prawdopodobnie nazywasz to po 'glMatrixMode (GL_Projection); glLoadIdentity(); '? –

+0

Ack! Przepraszam, kiedy zrobiłem mój test, skomentowałem mój obecny kod. ... W tym wezwanie do RenderQuad. Przywrócenie tej części sprawiło, że zadziałało. – moswald

0

Z Twojego komentarza wygląda na to, że chcesz narysować ten sam quad (RenderQuad()) jako pełny obraz i tryb PIP.

Zakładając, że masz szerokośćPIP i wysokośćPIP i pozycję startXY okna PIP, użyj widthPIP/totalWidth, heightPIP/totalHeight, aby skalować oryginalny quad i renderuj ponownie przy zadanym startXY.

Czy tego właśnie szukasz?

1

Biorąc pod uwagę, że twoje wartości są przekazywane jako [x, y, w, h], myślę, że najpierw chcesz przetłumaczyć w kierunku ujemnym, aby uzyskać górny lewy róg o 0,0, a następnie skalować o 1/w i 1/h, aby wypełnić go na ekranie. W ten sposób:

// 
// render once zoomed in 
glPushMatrix(); 
glTranslatef(-x, -y, 0); 
glScalef(1.0/w, 1.0/h, 1.0f); 

RenderQuad(); 

glPopMatrix(); 

Czy to działa?