ViktorMedlem sedan aug. 20021 752 inlägg En fråga angående hur man vet hur stor det som man ritar blir.
Jag har den här koden
glTranslatef(0.0f, 0.0f, -20.0f);
glBindTexture(GL_TEXTURE_2D, bg[txr]);
glBegin(GL_QUADS);
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-20.0f, -15.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f( 20.0f, -15.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f( 20.0f, 15.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-20.0f, 15.0f, 0.0f);
glEnd();
glTranslatef(0.0f, 0.0f, 20.0f);
Den ska altså rita en bakgrundsbild, zooma in 20 och sedan rita den över hela skärmen. Men hur vet jag vad jag ska sätta glVertex3f's x och y till? Jag vet att skärmen är 640x480, det är så stor jag vill att denna fyrkant ska bli.
Hur kan jag översätta x,y och z värdena till pixlar, eller rättare sagt, hur översätter jag pixlar till x,y och z värden?
/Viktor
Alpha IIMedlem sedan maj 20002 993 inlägg Du måste använda ortho projektion om du vill kunna rita nånting över hela skärmen, då blir det som att rita i directdraw ungefär, fast du använder textured quads istället för att bara rita bilder!
Lite delphi kod:
procedure SwitchOrtho();
begin
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0,scrWidth,0,ScrHeight,-1, 100);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
end;
procedure SwitchPerspective();
begin
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glLoadIdentity();
gluPerspective(0, ScrWidth/ScrHeight, 1.0, 120.0);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glLoadIdentity();
end;
ViktorMedlem sedan aug. 20021 752 inlägg Då anroppar jag SwitchOrtho innan jag ritar bakgrunden och sedan SwitchPerspective när jag är klar med den och vill rita alla andra delar?
Du vet inte hur man kan översätt pixlar till xyz? Någon formel måste det finnas :)
/Viktor
ModelMatrix*PerspectiveMatrix*Vertex=ScreenCoord
Tror det är den formeln du söker. Du måste hämta båda matriserna via glGet med GL_MODELVIEW_MATRIX och GL_PROJECTION_MATRIX, sedan räkna ut inverserna utav dom för att kunna köra hela grejan baklänges. mao JOBBIGT!
Hett tips är att göra som Alpha II säger fast lite anorlunda.
void PushMatrices()
{
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
}
void PopMatrices()
{
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}
void SetOrtho()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,scrWidth,0,ScrHeight,-1, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void SetPerspective()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(0, ScrWidth/ScrHeight, 1.0, 120.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
Säg att du vill rita lite 2d lite snabbt utan att sabba några 3d saker så gör du bara:
PushMatrices();
SetOrtho();
// Render your stuff
PopMatrices();
Så så sätt sabbar du inget.
ViktorMedlem sedan aug. 20021 752 inlägg Jag kom på en lösning så att jag inte behöver pixel data och nu i efterhand så är det nog så som jag gör nu som man ska göra, inte som jag hade tänkt mig.
/Viktor