Autor Wątek: Ruch obiektu uwzględniając rotacje  (Przeczytany 755 razy)

Offline Rect Code

  • Użytkownik

# Marzec 27, 2011, 20:53:37
Witam,
tak jak w temacie mam z tym problem z 3godziny się z tym męcze to co narazie wymyśliłem
        if( receiver.IsKeyDown( KEY_KEY_W ) )
        {

   StanStatek = 1;
   CalculatePosShip();
            core::vector3df v = ship->getPosition();
            v.Z += PozycjaZ;
             v.X += PozycjaX;
            ship->setPosition( v );
             _sleep(100);
        }
        if( receiver.IsKeyDown( KEY_KEY_S ) )
        {
  StanStatek = -1;
  CalculatePosShip();
       core::vector3df v = ship->getPosition();
            v.Z -= PozycjaZ;
             v.X -= PozycjaX;
            ship->setPosition( v );
            _sleep(100);
        }
        if( receiver.IsKeyDown( KEY_KEY_A ) )
        {

  ObrotX = ObrotX - 0.1;
    CalculatePosShip();
            v = ship->getRotation();
            v.Y -= ObrotX;
            ship->setRotation( v );

        }
        if( receiver.IsKeyDown( KEY_KEY_D ) )
        {

  ObrotX = ObrotX + 0.1;
   CalculatePosShip();
     v = ship->getRotation();
            v.Y += ObrotX;
           ship->setRotation( v );

        }else StanStatek = 0;

double cosx, siny, sinx;
float CelX, CelY, CelZ;
float PozycjaX, PozycjaY, PozycjaZ;
double StanStatek;
double ObrotY,ObrotX;
core::vector3df v;
void CalculatePosShip()
{
siny = sin(ObrotY);
cosx = cos(ObrotX);
sinx = sin(ObrotX);

PozycjaX += cosx*StanStatek;
PozycjaY += siny*StanStatek;
PozycjaZ += sinx*StanStatek;

CelX = PozycjaX+cosx;
CelY = PozycjaY+siny;
CelZ = PozycjaZ+sinx;
}
Działa to tak na pół tj.wariuje często
Ma ktoś pomysł?
z góry dzięki. (:
« Ostatnia zmiana: Marzec 27, 2011, 20:57:30 wysłana przez Rect Code »

Offline Mr. Spam

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

Offline Avaj

  • Użytkownik

# Marzec 27, 2011, 21:17:17
jeśli chcesz sobie ułatwić, to zamiast wplatać sinusy i kosinusy jak leci, to patrz na to tak:

masz wektor "do przodu", zależy od tego jak na początku jest obiekt ustawiony, załóżmy że 0,0,-1 i ten wektor obracasz o macierz obrotu odpowiednią. teraz kwestia tylko przemnożenia wektora o prędkość statku i dodania wynikowego wektora go do położenia statku

Offline Rect Code

  • Użytkownik

# Marzec 28, 2011, 16:32:25
Ok,rozumiem mniej więcej o co ci chodzi ale mam problem z implementacją,mógł byś podać jakiś kod,pseudokod(irrlicht) ? Nie mogę się połapać jak to pododawać (:

Offline Rect Code

  • Użytkownik

# Marzec 28, 2011, 22:02:51
//poza pętlą:
core::vector3df Position(0,0,-1);
//w pętli:
core::vector3df rot=game.pud->getRotation();
core::vector3df pos=game.pud->getPosition();
   Position = Position * 0.95f;
core::vector3df Position(0,0,-1);
   Position.rotateXZBy(rot.Y,vector3df(0,1,0));
if(receiver.IsKeyDown(irr::KEY_UP))
        {

              pos.Z += Position.Z;
              pos.X += Position.X;

              game.pud->setPosition(pos);
        }

if(receiver.IsKeyDown(irr::KEY_DOWN))
      {

              pos.Z -= Position.Z;
              pos.X -= Position.X;

              game.pud->setPosition(pos);
      }

if(receiver.IsKeyDown(irr::KEY_LEFT))
        {rot.Y -= 0.1;  game.pud->setRotation(rot);}
else if(receiver.IsKeyDown(irr::KEY_RIGHT))
        {rot.Y += 0.1; game.pud->setRotation(rot);}

Co zrobiłem źle ? Bo cały czas nie działa,cały dzień się z tym męczę ):

Offline Rect Code

  • Użytkownik

# Marzec 29, 2011, 16:20:31
Już nikt nie wie jak to zrobić !!!?

EDIT:
Udało mi się w końcu,tu jest kod:
core::vector3df rot=game.pud->getRotation();
core::vector3df pos=game.pud->getPosition();


if(receiver.IsKeyDown(irr::KEY_UP))
        {
              pos.Z += cos((rot.Y*(PI/90)))*MOVEMENT_SPEED;
              pos.X += sin((rot.Y*(PI/90)))*MOVEMENT_SPEED;

              game.pud->setPosition(pos);
        }

if(receiver.IsKeyDown(irr::KEY_DOWN))
      {
              pos.Z -= cos((rot.Y*(PI/90)))*MOVEMENT_SPEED;
              pos.X -= sin((rot.Y*(PI/90)))*MOVEMENT_SPEED;

game.pud->setPosition(pos);
      }

if(receiver.IsKeyDown(irr::KEY_LEFT))
        {rot.Y -= 4*MOVEMENT_SPEED;  game.pud->setRotation(rot);}
else if(receiver.IsKeyDown(irr::KEY_RIGHT))
        {rot.Y += 4*MOVEMENT_SPEED; game.pud->setRotation(rot);}
« Ostatnia zmiana: Marzec 29, 2011, 19:10:59 wysłana przez Rect Code »