Drehwinkel aus Vektor (3D)
Übersicht

barratatorBetreff: Drehwinkel aus Vektor (3D) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? ![]() Vielen Dank im Voraus! Gruß Bastian |
||
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich würde spontan sagen, dass du einfach ATan2![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du hast recht, es funktioniert ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
barratator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() |
||
- Zuletzt bearbeitet von barratator am Di, Dez 29, 2009 17:58, insgesamt einmal bearbeitet
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Achso, das wusste ich nicht.
Float oder Double ist egal - nur nichts ganzzahliges halt. |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group