Drehwinkel aus Vektor (3D)

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

barratator

Betreff: Drehwinkel aus Vektor (3D)

BeitragDi, Dez 29, 2009 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich arbeite zurzeit etwas mit Irrlicht in Blitzmax.
Momentan habe ich ein (kleines?) Problem: Ihr kennt ja sicher die Funktionen PointEntity und AlignToVector aus B3D. Diese brauche ich nun auch in BMax.

Ich habe schon einige Ansätze, die schon fast funktionierten, dann jedoch doch immerwieder irgendwelche Mängel aufweißten.
Kleines Beispiel:

Ich habe einen Vektor (5,2,-4) und jetzt soll sich das Objekt (0,0,0) dorthin ausrichten. Dazu brauche ich 2 Drehwinkel (Pitch, Yaw) (Roll sollte ja eigentlich nicht entscheidend sein.

Hätte jemand vielleicht einen passenden Algorythmus zufällig dort rumliegen? Smile

Vielen Dank im Voraus!

Gruß
Bastian

Der Eisvogel

BeitragDi, Dez 29, 2009 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich würde spontan sagen, dass du einfach ATan2 verwenden solltest.

Code: [AUSKLAPPEN]
pitch=ATan2(0-2,0-5)
yaw=ATan2(0-(-4),0-5


Ich hab das allerdings nnoch nie ausprobiert.

EDIT: Jetzt hab ich es aus langeweil ausprobiert, geht nicht.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

barratator

BeitragDi, Dez 29, 2009 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast recht, es funktioniert Wink
Nur, dass man einfach den negativen Wert von Yaw nehmen muss.

Das nächste Problem ist folgendes: Also ich richte ein Objekt über diese Funktion immer zu einem Wegpunkt aus. Jetzt möchte ich, dass das Objekt sich den nächsten Wegpunkt holt, sobald es angekommen ist.

Momentan mache ich es so:

Wenn die Distanz zwischen Objekt und Punkt unter der Geschwindigkeit des Objektes ist (+toleranz), soll sich das Objekt neu ausrichten. Das Problem: Selbst wenn ich das Objekt mit einer Geschwindigkeit von 0,1 Einheiten pro Frame bewege kommt das Objekt niemals an o.O

Ein paar Einheiten vor dem Wegpunkt (mal 4, mal 7,...) dreht das Objekt scheinbar wieder und dreht sich wieder und wieder,....Nunja, es erreicht den Wegpunkt einfach nie. Verwenden tue ich für alle Variable Double-Werte...Was könnte das sein?!


Gruß
Bastian

Der Eisvogel

BeitragDi, Dez 29, 2009 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Moment mal, das soll funktionieren? wieso hat das bei mir nicht geklappt? Kannst du mir mal deinen Code geben?

EDIT: Und dein Problem hab ich auch nicht ganz verstanden. Vlt solltest du mal die Toleranz runtersetzten.
EDIT: Der negative Wert von Yaw ist übrigends ATan2(z,-x)
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

barratator

BeitragDi, Dez 29, 2009 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Also den ganzen Code zu geben ist etwas schwer -> Das ist in ein paar 1000 Zeilen Code untergejubelt :S

Also so setzte ich die Richtung:

Code: [AUSKLAPPEN]

  Method Point(target:vector3df)
     Local dx:Double = target.getx() - Self.getx() 'SPEED
     Local dy:Double = target.gety() - Self.gety()
     Local dz:Double = target.getz() - Self.getz()

     Local rot:vector3df = _vector3df(ATan2(-dy,-dx),-ATan2(-dz,-dx),0)     
     node.SetRotation(rot)
  End Method 


Und wenn man jetzt die Distanz immer zum Wegpunkt misst wird diese immer kleiner...Und sobald das Objekt ein paar Einheiten davor ist wird es scheinbar nichtmehr richtig ausgerichtet, sodass es nichtmehr auf das Objekt zeigt, sondern scheinbar in die entgegengesetzte Richtung, dann fährt es für den Frame wieder ein Stück zurück und im nächsten wieder nach vorne.

Holzchopf

Meisterpacker

BeitragDi, Dez 29, 2009 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Verwendest du auch für die GetX/Y/Z-Methoden Double als Datentyp? Sonst sind nämlich bei kleinen Abständen dx etc 0, was dann zu unbrauchbaren Werten bei ATan2 führt.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

barratator

BeitragDi, Dez 29, 2009 17:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja, also die getx,...() methoden sind vom Irrlicht-Wrapper.
Laut Sourcecode geben diese einen Float zurück. Ich änder die mal kurz.

Edit: Ich habe jetzt alle Teile in meinem Programm von Double zu Float geändert, die etwas damit zutun haben könnten -> Das selbe Ergebnis. Sad
  • Zuletzt bearbeitet von barratator am Di, Dez 29, 2009 17:58, insgesamt einmal bearbeitet

Holzchopf

Meisterpacker

BeitragDi, Dez 29, 2009 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, das wusste ich nicht.

Float oder Double ist egal - nur nichts ganzzahliges halt.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group