Autor Wątek: przeksztalcenia kamery i obiektu  (Przeczytany 735 razy)

Offline smajler

  • Użytkownik

# Maj 25, 2010, 19:15:19
Mam taki problem, mianowicie mam kamere ktora porusza sie jak w grach FPP, mam tez obiekt, ktory sobie gdzies tam stoi i nim tez jest mozliwosc poruszania sie. Problem polega na tym, ze poruszanie kamera dziala jak trzeba, ale obiektem juz nie.

Tak rysuje obiekt:
void CWheelChair::Draw(void)
{
glBindBuffer(GL_ARRAY_BUFFER,vboId[0]);

    glVertexPointer(3,GL_FLOAT,0,0);
glEnableClientState(GL_VERTEX_ARRAY);

glPushMatrix();
                glRotatef(-rotAngle,0,1.0f,0);
        glTranslatef(-xPos,-yPos,-zPos);


glColor3f(1,0,0);
glDrawArrays(GL_QUADS,0,24);

glPushMatrix();
glTranslatef(0.25f,0.2f,0.38f);
glColor3f(0,1,0);
glDrawArrays(GL_QUADS,24,128);
glColor3f(0,0,1);
glDrawArrays(GL_TRIANGLES,152,96);
glDrawArrays(GL_TRIANGLES,248,96);
glPopMatrix();

glPushMatrix();
glTranslatef(0.25f,0.2f,-0.3f);
glColor3f(0,1,0);
glDrawArrays(GL_QUADS,24,128);
glColor3f(0,0,1);
glDrawArrays(GL_TRIANGLES,152,96);
glDrawArrays(GL_TRIANGLES,248,96);
glPopMatrix();

glPushMatrix();
glTranslatef(-0.25f,0.2f,0.38f);
glColor3f(0,1,0);
glDrawArrays(GL_QUADS,24,128);
glColor3f(0,0,1);
glDrawArrays(GL_TRIANGLES,152,96);
glDrawArrays(GL_TRIANGLES,248,96);
glPopMatrix();

glPushMatrix();
glTranslatef(-0.25f,0.2f,-0.3f);
glColor3f(0,1,0);
glDrawArrays(GL_QUADS,24,128);
glColor3f(0,0,1);
glDrawArrays(GL_TRIANGLES,152,96);
glDrawArrays(GL_TRIANGLES,248,96);
glPopMatrix();

glPopMatrix();

glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER,0);
}
A tak wyglada glowna funkcja rysujaca:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glLoadIdentity();
glRotatef(-cameraAngle,0,1.0f,0);
glTranslatef(-cameraXPos,-cameraYPos,-cameraZPos);

wozek.Draw();

Nowe wspolrzedne kamery i obiektu obliczam tak:
if (keys['S'])
{
cameraRotAngle-=25.0f*deltaTime;
}
else if (keys['X'])
{
cameraRotAngle+=25.0f*deltaTime;
}

if (keys[VK_UP])
{
zPos-=(float)cos((cameraRotAngle*PI)/180.0f)*2.0f*deltaTime;
xPos-=(float)sin((cameraRotAngle*PI)/180.0f)*2.0f*deltaTime;
}
else if (keys[VK_DOWN])
{
zPos+=(float)cos((cameraRotAngle*PI)/180.0f)*2.0f*deltaTime;
xPos+=(float)sin((cameraRotAngle*PI)/180.0f)*2.0f*deltaTime;
}
if (keys[VK_LEFT])
{
zPos+=(float)cos(((cameraRotAngle-90.0f)*PI)/180.0f)*2.0f*deltaTime;
xPos+=(float)sin(((cameraRotAngle-90.0f)*PI)/180.0f)*2.0f*deltaTime;
}
else if (keys[VK_RIGHT])
{
zPos-=(float)cos(((cameraRotAngle-90.0f)*PI)/180.0f)*2.0f*deltaTime;
xPos-=(float)sin(((cameraRotAngle-90.0f)*PI)/180.0f)*2.0f*deltaTime;
}
if (keys['J'])
{
wheelRotAngle-=25.0f*deltaTime;
}
else if (keys['L'])
{
wheelRotAngle+=25.0f*deltaTime;
}
if (keys['I'])
{
wheelZPos-=(float)cos(((wheelRotAngle)*PI)/180.0f)*2.0f*deltaTime;
wheelXPos-=(float)sin(((wheelRotAngle)*PI)/180.0f)*2.0f*deltaTime;
//wheelXPos+=0.1*deltaTime;
}
else if (keys['K'])
{
wheelZPos+=(float)cos(((wheelRotAngle)*PI)/180.0f)*2.0f*deltaTime;
wheelXPos+=(float)sin(((wheelRotAngle)*PI)/180.0f)*2.0f*deltaTime;
}
Poruszanie kamera jest ok, ale gdy sie przesunie obiekt, to pozniej nie obraza sie on wzgledem siebie( srodek obrotu nie jest w jego srodku) tylko jest calkiem gdzie indziej, tak samo gdy chce zeby przesunal sie do przodu, to on idzie calkiem gdzie indziej

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Vipa

  • Gość
# Maj 25, 2010, 19:19:01
glPushMatrix();
                glRotatef(-rotAngle,0,1.0f,0);
        glTranslatef(-xPos,-yPos,-zPos);
A zamień przy rysowaniu obiektu glRotate i glTranslate miejscami?

Offline _OskaR

  • Użytkownik

# Maj 25, 2010, 19:19:24
glTranslatef/glRotatef etc. to już starocie - już od dawna można korzystać z shaderów. Wystarczy tylko zacząć.

Offline smajler

  • Użytkownik

# Maj 25, 2010, 19:21:34
Vipa:
probowalem, ale i tak nie jest tak jak powinno, a co do shaderow to wiem ze istnieje cos takiego, narazie jednak z nich nie korzystam

Offline Oti

  • Użytkownik

# Maj 25, 2010, 19:36:07
a co do shaderow to wiem ze istnieje cos takiego, narazie jednak z nich nie korzystam
Im wcześniej zaczniesz tym lepiej. :)

Offline smajler

  • Użytkownik

# Maj 25, 2010, 19:37:08
nie pomagaja w moim problemie odpowiedzi o shaderach

Vipa

  • Gość
# Maj 25, 2010, 19:37:43
Vipa:
probowalem, ale i tak nie jest tak jak powinno...
Ale co się dokładnie zmienia?

Offline smajler

  • Użytkownik

# Maj 25, 2010, 20:01:20
Vipa:
dzieki, pomoglo, musialem jedynie do tego zmienic obliczenia: sin na cos zamienic, bo mialem model obrocony i to mnie mylilo.