Problem mit Bewegung und Irrlicht



  • Hoi! 🙂

    Da ich ein paar Defizite in Sachen Vektorgeometrie habe, komme ich hier gerade auf keine befriedigende Lösung.

    Also, ich habe eine 3D-Figur an Position (0, 0, 0) mit einer Rotation von (0, 0, 0) in Grad.
    Verschiebe ich die Figur mit dieser Rotation rein auf der Z-Achse, dann sieht das Ganze noch super aus, also die Figur zeigt in die richtige Richtung. Also schaut die Figur mit der Rotation von (0, 0, 0) wohl gegen (0, 0, Unendlich).

    Jetzt möchte ich die Figur allerdings auch mal zur Seite drehen (also entlang der Y-Achse) ... passt so super, nur möchte ich mich mit dieser veränderten Rotation auch nach "vorne" bewegen können ... wie kann ich hierbei die Zielkoordinaten berechnen, wenn ich mich mit Distanz A und Rotation (0, 0, 0) bewegen möchte?

    Würde mich über einen Hinweis in die richtige Richtung und einen Buchtipp in Sachen Geometrie und 3D-Programmierung freuen! 🙂

    Danke und Grüße,
    Ethon



  • Ich weiß jetz nicht genau was du meinst, kannst du villeciht ein bisschen code zeigen ?
    Für Irrlicht gibt es auch ein buch, habs mir schon runtergeladen 👍



  • Eine Weile rumprobiert, mit einem bischen Rotieren hats dann sofort geklappt:

    void player_mover::update(irr::ITimer* timer)
    {
       // Get the frame delta time in seconds.
       std::uint32_t const now = timer->getRealTime();
       float const delta = static_cast<float>(now - m_last_update) / 1000.f;
    
       // Get position and rotation of the node.
       irr::core::vector3df pos(m_node->getPosition());
       irr::core::vector3df rot(m_node->getRotation());
    
       // Update the current action.
       switch(m_action_in_progress)
       {
          case player_action::no_action:
          break;
    
          case player_action::move_forward:
          {
             irr::core::vector3df pos(m_node->getPosition());
             pos.Z += m_speed_forward * delta;
             pos.rotateXZBy(-rot.Y, m_node->getPosition());
             m_node->setPosition(pos);
             break;
          }
    
       case player_action::move_backwards:
          {
             irr::core::vector3df pos(m_node->getPosition());
             pos.Z -= m_speed_backward * delta;
             pos.rotateXZBy(-rot.Y, m_node->getPosition());
             m_node->setPosition(pos);
             break;
          }
    
       case player_action::turn_left:
          rot.Y -= m_speed_turn * delta;
          m_node->setRotation(rot);
          break;
    
       case player_action::turn_right:
          rot.Y += m_speed_turn * delta;
          m_node->setRotation(rot);
          break;
       };
    
       m_last_update = now;
    }
    

    Für Irrlicht gibt es auch ein buch, habs mir schon runtergeladen

    Naja, Irrlicht ist doch sehr einfach zu benutzen, mir geht es eher um meine mathematischen Grundlagen. 😉



  • Du solltest erst mal preisgeben auf welche Art du die Rotation speicherst. (Vektoren, Matrizen, Quaternonen?)


Anmelden zum Antworten