Witam. Przerabiam sobie książkę "OpenGL Programowanie Gier" i obecnie jestem na zadaniu z robotem z rodziału 5-ego. Mam problem ze zrozumieniem kodu generowania robota. Dlaczego w funkcji void DrawRobot(float xPos, float yPos, float zPos)
wywoływane jest na początku glPushMatrix()
??
void DrawCube(float xPos, float yPos, float zPos)
{
glPushMatrix();
glTranslatef(xPos, yPos, zPos);
glBegin(GL_POLYGON);
glVertex3f(0.0f, 0.0f, 0.0f); // górna œciana
glVertex3f(0.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f); // przednia œciana
glVertex3f(-1.0f, 0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(0.0f, -1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f); // œciana po prawej
glVertex3f(0.0f, -1.0f, 0.0f);
glVertex3f(0.0f, -1.0f, -1.0f);
glVertex3f(0.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, 0.0f, 0.0f); // œciana po lewej
glVertex3f(-1.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f); // dolna œciana
glVertex3f(0.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f); // tylnia œciana
glVertex3f(-1.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(0.0f, -1.0f, -1.0f);
glEnd();
glPopMatrix();
}
// DrawArm
// opis: rysuje pojedyncze ramiê robota
void DrawArm(float xPos, float yPos, float zPos)
{
glPushMatrix();
glColor3f(1.0f, 0.0f, 0.0f); // kolor czerwony
glTranslatef(xPos, yPos, zPos);
glScalef(1.0f, 4.0f, 1.0f); // ramiê jest prostopad³oœcianem 1x4x1
DrawCube(0.0f, 0.0f, 0.0f);
glPopMatrix();
}
// DrawHead
// opis: rysuje g³owê robota
void DrawHead(float xPos, float yPos, float zPos)
{
glPushMatrix();
glColor3f(1.0f, 1.0f, 1.0f); // kolor bia³y
glTranslatef(xPos, yPos, zPos);
glScalef(2.0f, 2.0f, 2.0f); // g³owa jest szeœcianem 2x2x2
DrawCube(0.0f, 0.0f, 0.0f);
glPopMatrix();
}
// DrawTorso
// opis: rysuje korpus robota
void DrawTorso(float xPos, float yPos, float zPos)
{
glPushMatrix();
glColor3f(0.0f, 0.0f, 1.0f); // kolor niebieski
glTranslatef(xPos, yPos, zPos);
glScalef(3.0f, 5.0f, 2.0f); // korpus jest prostopad³oœcianem 3x5x2
DrawCube(0.0f, 0.0f, 0.0f);
glPopMatrix();
}
// DrawLeg
// opis: rysuje pojedyncz¹ nogê robota
void DrawLeg(float xPos, float yPos, float zPos)
{
glPushMatrix();
glColor3f(1.0f, 1.0f, 0.0f); // kolor ¿ó³ty
glTranslatef(xPos, yPos, zPos);
glScalef(1.0f, 5.0f, 1.0f); // noga jest prostopad³oœcianem 1x5x1
DrawCube(0.0f, 0.0f, 0.0f);
glPopMatrix();
}
// DrawRobot
// opis: rysuje model robota w punkcie (xpos,ypos,zpos)
void DrawRobot(float xPos, float yPos, float zPos)
{
static bool leg1 = true; // zmienne okreœlaj¹ce po³o¿enie nóg i ramion
static bool leg2 = false; // true = przednie, false = tylnie
static bool arm1 = true;
static bool arm2 = false;
glPushMatrix(); // dlaczego ??
glTranslatef(xPos, yPos, zPos); // rysuje model robota w okreœlonym punkcie
// rysuje elementy robota
DrawHead(1.0f, 2.0f, 0.0f);
DrawTorso(1.5f, 0.0f, 0.0f);
glPushMatrix();
// w zale¿noœci od po³o¿enia ramienia zwiêksza lub zmniejsza jego k¹t
if (arm1)
armAngle[0] = armAngle[0] + 0.1f;
else
armAngle[0] = armAngle[0] - 0.1f;
// jeœli ramiê osiagnê³o maksymalny k¹t,
// to zmienia kierunek
if (armAngle[0] >= 15.0f)
arm1 = false;
if (armAngle[0] <= -15.0f)
arm1 = true;
// przesuwa ramiê i obraca je w celu uzyskania efektu ruchu
glTranslatef(0.0f, -0.5f, 0.0f);
glRotatef(armAngle[0], 1.0f, 0.0f, 0.0f);
DrawArm(2.5f, 0.0f, -0.5f);
glPopMatrix();
glPushMatrix();
// jeœli ramiê porusza siê do przodu, zwiêksza k¹t
// w przeciwnym razie zmniejsza
if (arm2)
armAngle[1] = armAngle[1] + 0.1f;
else
armAngle[1] = armAngle[1] - 0.1f;
// jeœli ramiê osiagnê³o maksymalny k¹t,
// to zmienia kierunek
if (armAngle[1] >= 15.0f)
arm2 = false;
if (armAngle[1] <= -15.0f)
arm2 = true;
// przesuwa ramiê i obraca je w celu uzyskania efektu ruchu
glTranslatef(0.0f, -0.5f, 0.0f);
glRotatef(armAngle[1], 1.0f, 0.0f, 0.0f);
DrawArm(-1.5f, 0.0f, -0.5f);
glPopMatrix();
//DrawArm(-1.5f, 0.0f, -0.5f);
// nogi poruszamy wzglêdem korpusu robota
// noga 1, czyli prawa noga robota
glPushMatrix();
// w zale¿noœci od po³o¿enia nogi zwiêksza lub zmniejsza k¹t
if (leg1)
legAngle[0] = legAngle[0] + 0.1f;
else
legAngle[0] = legAngle[0] - 0.1f;
// jeœli noga osiagnê³a maksymalny k¹t,
// to zmienia kierunek
if (legAngle[0] >= 15.0f)
leg1 = false;
if (legAngle[0] <= -15.0f)
leg1 = true;
// przesuwa nogê i obraca j¹ w celu uzyskania efektu ruchu // przesuwa nogê i obraca j¹ w celu uzyskania efektu ruchu
glTranslatef(0.0f, -0.5f, 0.0f);
glRotatef(legAngle[0], 1.0f, 0.0f, 0.0f);
// rysuje nogê
DrawLeg(-0.5f, -5.0f, -0.5f);
glPopMatrix();
// to samo dla nogi, lewej nogi robota
glPushMatrix();
if (leg2)
legAngle[1] = legAngle[1] + 0.1f;
else
legAngle[1] = legAngle[1] - 0.1f;
if (legAngle[1] >= 15.0f)
leg2 = false;
if (legAngle[1] <= -15.0f)
leg2 = true;
glTranslatef(0.0f, -0.5f, 0.0f);
glRotatef(legAngle[1], 1.0f, 0.0f, 0.0f);
DrawLeg(1.5f, -5.0f, -0.5f);
glPopMatrix();
glPopMatrix();
}