Implementuję ruch obiektu sterowanego klawiszami w OpenGL.
Co działa: Jazda w przód i w tył bez skręcania
Co się sypie: Samo skręcanie i jazda, gdy obiekt jest skręcony
Po włączeniu programu mogę obracać obiektem bez przeszkód. Problem pojawia się wtedy, gdy:
- Pojadę naprzód lub do tyłu, a następnie obrócę - zmienia się jego położenie na osi X i Y
- Po obrocie próbuję jechać - obiekt zachowuje się dziwnie, a nawet jeździ jak w ruchu drgającym
Jak poprawnie zaimplementować ruch pojazdu?
#define FPS 30
#define PRZYSPIESZENIE 0.01f
struct obiekt
{
GLfloat x;
GLfloat y;
GLfloat z;
GLfloat a;
GLfloat v;
};
// Tu tworzymy obiekt, wszystkie własności są zerami
struct obiekt bat = {0.0f,0.0f,0.0f,0.0f,0.0f};
void rysuj()
{
glPushMatrix();
glRotatef(bat.a, 0.0f, 1.0f, 0.0f);
glTranslatef(bat.x, bat.y, bat.z);
//dalsze rysowanie pominięto
}
void timer()
{
if(GetAsyncKeyState('W') & 0x8000)
{
bat.v -= PRZYSPIESZENIE; //Jazda w przód
}
else if(GetAsyncKeyState('S') & 0x8000)
{
bat.v += PRZYSPIESZENIE; //Jazda w tył
}
else
{
bat.v *= 0.95; // Siła oporu
}
if(GetAsyncKeyState('A') & 0x8000)
{
bat.a += 0.1f; // Skręcamy w lewo - WAŻNY FRAGMENT
}
if(GetAsyncKeyState('D') & 0x8000)
{
bat.a -= 0.1f; // Skręcamy w prawo - WAŻNY FRAGMENT
}
bat.z += cosf(bat.a) * bat.v; // Tu pewnie coś jest nie tak
bat.x += sinf(bat.a) * bat.v; // Tu pewnie coś jest nie tak
}