Zielen - Ausrichten



  • Hi!
    Ich baue gerade ein kleines TowerDefenseGame und versuche seit einiger Zeit dahinterzukommen wie ich es schaffe den Winkel der Waffe zu berechnen.

    Facts:
    Die Ziele können überall (2D - eigentlich 3D aber auf x,y(bzw z) beschränkt) um die Waffe herum plaziert werden.
    Einen Vektor für die Schüsse rechne ich einfach aus:

    if(Position.x-target.x>=0){
    		xBuf=Position.x-target.x;
    	}
    	else{
    		xBuf=target.x-Position.x;
    	}
    	if(Position.z-target.z>=0){
    		yBuf=Position.z-target.z;
    	}
    	else{
    		yBuf=target.z-Position.z;
    	}
    

    Wobei Position die Position der Waffe ist und target (wie sollts auch anders sein) das Ziel.

    Diesen Vektor dann so umzugestalten dass sich daraus ein anderer ergibt den ich pro Bewegung dazu addiere ist kein Problem (einfach durch die Länge dividieren)
    ABER die Schüsse sollen ja nicht einfach irgendwo herkommen sondern aus dem Lauf der Waffe, welche auch schon in alle Richtungen (2D) rotieren kann; nur um die Schüsse selbst (also nicht die Richtund in die sie fliegen) so auszurichten dass sie gerade fliegen...

    also so:

    o= - - - - - - - - x
    

    und nicht irgendwie (z.b. so)

    o= / / / / / / / / x
    

    ...brauche ich den Winkel auf den die Waffe ausgerichtet werden muss und somit dann auch die Schüsse selbst.

    Jetzt habe ich schon einiges ausprobiert aber (mag an der Uhrzeit liegen - glaub ich aber eher nicht) dabei kam eigentlich nichts brauchbares heraus.

    Ich hab unter anderem versucht den Winkel mit dieser Formel zu berechnen:

    angle=1/tanf(xBuf/yBuf);
    

    Aber es will nicht funktionieren.

    Daher meine Frage: Könnt ihr mir da helfen?
    Ich weiß auch nicht ob es da Probleme gibt weil D3DXMATRIXROTATIONX(...) den Winkel in RAD erwartet

    Hoffe ihr könnt mir da helfen!

    MfG Kuldren



  • Mach's Dir doch nicht so schwer. Nimm statt Strichen Punkte 🙂 für Schüsse.

    Diese Berechnung ist falsch

    angle=1/tanf(xBuf/yBuf);
    

    Du dachtest wohl aus der Schulmathematik, dass tan^-1
    1 / tan ist.
    Nimm den Arkustangens:

    angle=atanf(yBuf/xBuf);
    

    Das liefert dir den Winkel im Bogenmaß, also genauso wie du es brauchst.

    Noch was:

    Statt

    if(Position.x-target.x>=0){
            xBuf=Position.x-target.x;
        }
        else{
            xBuf=target.x-Position.x;
        }
        if(Position.z-target.z>=0){
            yBuf=Position.z-target.z;
        }
        else{
            yBuf=target.z-Position.z;
        }
    

    machs einfacher

    xBuf=fabs(target.x-Position.x);
        yBuf=fabs(target.z-Position.z);
    


  • angle=atanf(yBuf/xBuf);
    

    Da musst Du anhand der Vorzeichen von x,y noch erschliessen, in welchem Kreisesquadranten der Winkel liegt; oder atan2 benutzen.



  • Du musst auch noch die Bewegung des Ziels einberechnen!
    Artikel:

    http://www.spieleprogrammierer.de/index.php?option=com_docman&task=docclick&Itemid=50&bid=32



  • Erstmal Danke für die Antworten!

    Das Ausrichten klappt jetzt zu 1/4, denn die Waffe verhält sich jetzt immer so als würde sie sich im Nullpunkt befinden.
    D.h. selbst wenn ich sie an den Koordinaten 1000,0,1000 platzieren würde, würde sie so rotieren und die Schüsse sich dementsprechend bewegen als wäre sie im Ursprungspunkt.

    D.h. anstatt so:

    |
    |  x      
    |     
    |     \
    |      O
    +-------------
    

    ist die waffe so ausgerichtet

    |
    |  x      
    |     
    |       /
    |      O
    +-------------
    

    Als wäre die Waffe (O-) im Ursprung +

    Wie sollte ich das am Besten lösen?
    einfach die Koordinaten von einander abziehen und dann PI/2 PI oder 3 PI/2 dazu addieren?

    @

    Du musst auch noch die Bewegung des Ziels einberechnen!

    Danke für den Link (hab ich mir schon letzte Woche mehrmals angesehen)
    Aber de Schüsse bewegen sich mit so großer Geschwindigkeit dass sie praktisch direkt nach dem abfeuern einschlagen und da wäre es überflüssig wegen ca 1-5° zusätzliche Berechnungen anzustellen 😉



  • Du berechnest ja die Differenz zwischen den beiden Ortsvektoren mit

    xBuf=fabs(target.x-Position.x);
        yBuf=fabs(target.z-Position.z);
    

    Also ist der Winkel den du mit atan2 berechnest auch richtig. hellihjb hat schon recht damit.
    Rechne mal bissl von Hand die Winkel aus und schaue wie du es am besten machst.
    Es kommt eben darauf an welches Vorzeichen x und y, die du atan2 übergibst, haben.



  • Danke...
    Habs jetzt hinbekommen.
    Muss mich nur mit einer seltsamen Fehlermeldung auseinandersetzen...
    Beim Abfeuern der Schüsse frage ich die vergangene Zeit ab damit die Kugeln regelmäßig abgefeuert werden.

    error C3861: "timeGetTime": Bezeichner wurde nicht gefunden
    
    shotStartTime=(unsigned) timeGetTime();
    

    Dabei habe ich windows.h eingebunden und in der main.cpp verwende ich timeGetTime() auch mehrfach genau so und es funktioniert...
    Hab auch probiert alle Header aus main.cpp in GunFire.cpp zu verwenden aber will einfach nicht funktionieren.



  • Hast du zufällig über dem #include <windows.h> ein #define WIN32_LEAN_AND_MEAN? Wenn ja, dann musst du das rausnehmen damit über windows.h die timeGetTime-Deklaration inkludiert wird.



  • S.T.A.L.K.E.R. schrieb:

    Hast du zufällig über dem #include <windows.h> ein #define WIN32_LEAN_AND_MEAN? Wenn ja, dann musst du das rausnehmen damit über windows.h die timeGetTime-Deklaration inkludiert wird.

    Danke...habs mittlerweile schon gelöst

    Ich hatte keine #define Win32... drin aber hab dann einfach die <mmsystem.h> inkludiert.

    windows.h reicht anscheinend nicht.


Anmelden zum Antworten