Lenkraketen



  • Hi!

    Ich bin grad dabei, meinem Spiel Lenkraketen zu verpassen, die auf ein bestimmtes Flugzeug fliegen sollen, welches sich auch bewegt. Mein Code für das Bewegen für die Raketen it bisher so:

    meResult Move(float PassedSecs)
    {
        mePoint aim = m_AimedShip->GetPos();
    
        mePoint vec1 = aim - m_Pos;
        mePoint vec2 = m_MoveDir;
        meNormalize(vec1);
        meNormalize(vec2);
    
        float angle = acosf(vec1.x*vec2.x + vec1.y*vec2.y);
        if(angle > m_RotSpeed * PassedSecs)
            angle = m_RotSpeed * PassedSecs;
        angle = -angle;
    
        // MoveDir drehen
        float x = m_MoveDir.x;
        float y = m_MoveDir.y;
        m_MoveDir.x = x * cosf(angle) - y * sinf(angle);
        m_MoveDir.y = x * sinf(angle) + y * cosf(angle);
    
        m_Pos = m_Pos + m_MoveDir * m_Speed * PassedSecs;
    
        return ME_OK;
    }
    

    Das funktioniert auch fast, nur, wenn der Winkel so gegen 180° geht, weiß die Rakete nicht, ob sie sich nu nach oben oder nach unten drehen soll, weil der acosf eben immer den kleinsten Winkel von den beiden möglichen zurückgibt. Wie kann man es machen, dass die Raketen immer die richtige Drehrichtung finden?Ich steh da zur Zeit ziemlich aufm Schlauch 😉

    Gruß, Maxi



  • Als ich Anfang des Jahres damit anfing mich näher mit Vektoren zu beschäftigen stand ich vor dem selben Problem 🙂
    Im Mathe-Forum hat man mir sehr gut weitergeholfen. Hier ist der alte Thread von damals:

    http://www.matheraum.de/read?t=44495



  • Danke für den Link!

    Ich versuchs mal, aber ich finds blöd, dass man da vier fälle unterscheiden muss...
    Aber ich werds ma versuchen


  • Mod

    ich würde erwarten, dass eine rakete auch mal ihr ziel verliert ;), besonders wenn es hinter der rakete ist.

    rapso->greets();



  • ich fänd das verhalten so wie es ist auch in ordnung. dann macht die rakete halt nen kleinen schwenker bis sie ihr ziel wieder "erfasst" hat. sieht bestimmt auch ganz gut aus 😉



  • hm, also richtig hinbekommen hab ichs noch nicht, ich machs zZ noch so:

    ich rechne den winkel aus, drehe die richtung um den halben winkel. Wenn der Winel danach größer ist, muss ich den winkel negativ machen, ansonsten bleibt er so, aber das ist keine sehr elegante lösung...

    mit dem ziel verlieren ist ne idee, steht aber erstmal nicht im vordergurnd, die soll erstmal richtig fliegen 😉



  • so, habs jetzt etwas besser hinbekommen, dabei ist mir aber noch ne Frage gekommen:

    Was machen lenkraketen, wenn ihr Ziel schon vor ihrem eintreffen zerstört wird?
    Wie fliegen die, wenn sie ihr ziel verlieren?


  • Mod

    das hängt vom der software der rakete ab.

    aber erstmal: lenkraketen merken sich oft eine eigenschaft ihres zieles, bei IR-raketen z.b. die wärme und folgen dieser dann. dabei kann es natürlich passieren, dass das ziel außerhalb des sichtwinkels gerät (ich glaube der betrug ca 60°), durch andere wärmequellen überdeckt wird (z.b. sonne) oder mit störquellen verrauscht wird (sollte jeder jäger haben 😉 ).

    dann muss die software erstmal entscheiden, ob das ziel verloren wurde (ist aus der sicht einer rakete, die einem punkt nachjagt, garnicht so einfach!)

    dann hängt es von der software der rakete ab, was passiert wenn das ziel als verloren gilt. manche zerstören sich selbst um nicht ein "friendly-target" anzugreifen (sie zerstören sich dann auch, wenn der treibstoff alle ist), manche stürzen ab. manche fliegen auf das nächste ziel zu das innerhalb der tolleranz dem ziel entspricht (war früher oft die sonne).

    rapso->greets();


Anmelden zum Antworten