Hallo,
zur Zeit arbeite ich an einem neuen 3D Spiel (mit Irrlicht) . In diesem Spiel gibts eben ne first-person-shooter camera und diverse monster (-> objekte). Wenn man sich den Monstern auf eine gewisse Entfernung nähert, laufen sie in Richtung Kamera und greifen dann an. Nur stimmt die Rotation der Objekte noch nicht-> Gesicht des Monsters muss beim Angriff immer in die camera schauen. Hab bis jetzt sowohl was mit Schnittwinkeln von Vektoren als auch was mit dem Einheitskreis probiert. Die Versuche waren leider nicht von Erfolg gekrönt. Wäre nett, wenn mir jemand helfen könnte. ANbei noch eine Skizze [Blockierte Grafik: http://www10.pic-upload.de/13.02.12/d5dkhg7u6rwt.png]
Edit: Gegeben sind Position der Camera, Target der Camera Rotation der Camera , Position des Monsters, Rotation des Monsters
Geändert werden muss natürlich die Rotation des Monsters.
Winkelfunktionen o.a.: Rotation eines Objekts in Richtung Kamera
-
- [ gelöst ]
-
Irrlicht -
13. Februar 2012 um 20:26 -
Geschlossen -
Erledigt
-
-
Da du einen rechtwinklichen Dreieck hast, kannst du die Winkel berechnen und davon dann um wieviel grad sich die Einheit drehen muss: http://www.mathematik.de/ger/fragenantw…kel/winkel.html
[Blockierte Grafik: http://www13.picfront.org/token/CKQe/2012/02/14/2031050.png]
-
Stimmt demnach folgende Berechnung?
[autoit]func _calcrotat()
[/autoit][autoit][/autoit][autoit]$pos_cam= _irrgetnodeposition($camera)
[/autoit]
$pos_mob= _irrgetnodeposition($monster_node)
$gegenkathete= $pos_mob[2]-$pos_cam[2]
If $gegenkathete<0 then $gegenkathete=$gegenkathete*-1
$ankathete= $pos_mob[0]- $pos_cam[0]
If $ankathete<0 then $ankathete= $ankathete*-1
$hypotenuse= sqrt((($pos_mob[0]-$pos_cam[0])^2) + (($pos_mob[2]-$pos_cam[2])^2))
If $hypotenuse<0 then $hypotenuse= $hypotenuse*-1
$bruch= ($gegenkathete/$hypotenuse)
$winkel= sin($bruch*$deg)
Msgbox(0, "", $winkel)
endfunc
Ich glaub, dass das ziemlich falsch ist -> Winkel sind nicht korrekt -
Ich hab dir mal das ganze "neu" aufgemalt.
Ankathete 2 & 1 hast du gegeben, die Hypothenuse errechnest du durch den Pythagoras.
Dann berechnest du die Winkel mit dem Sinus / Cosinus und SCHWUPS fertig -
Ähm genau nach dem Muster hab ichs ja gemacht [Blockierte Grafik: http://www10.pic-upload.de/14.02.12/jueky1mdzq8k.png]
-
- Super ...
$winkel = asin(bruch)Probier das mal
-
Was hast du denn für Informationen vorliegen und welche Information soll in welcher Form dabei herauskommen?
Hast du kartesische 3D-Koordinaten oder ebene 2D-Koordinaten?
Willst du die 3 räumlichen Drehwinkel oder nur den ebenen Richtungswinkel zwischen 2 Punkten?
Wo ist die Nullrichtung für eine entsprechende Richtung festgelegt?
Werden Richtungswinkel im Bereich 0..2Pi benötigt oder doch zwischen -Pi..Pi?Ebene Richtungen zwischen 2 Punkten berechnet man in der Regel über den quadrantenkorrekten Arcustangens - die atan2-Funktion.
Wenn es das ist was du willst (und der Wertebereich zwischen 0..2Pi liegen soll) dann würde man es so berechnen:Spoiler anzeigen
[autoit]Global Const $PI = ACos(-1)
[/autoit] [autoit][/autoit] [autoit]Global $a_Standpunkt[2] = [5, 4] ; Koordinaten des Standpunktes
[/autoit] [autoit][/autoit] [autoit]
Global $a_Zielpunkt[2] = [1, 3] ; Koordinaten des Zielpunktes (der Punkt auf den man schaut); Koordinatendifferenzen
[/autoit] [autoit][/autoit] [autoit]
$dX = $a_Zielpunkt[0] - $a_Standpunkt[0]
$dy = $a_Zielpunkt[1] - $a_Standpunkt[1]MsgBox(0, "", "Blickrichtung: " & Atan2($dX, $dy) & " [rad]")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]; Berechnet den quadrantenkorrekten ArcusTangens
[/autoit] [autoit][/autoit] [autoit]
; je nach gewünschter Lage der Nullrichtung y und x vertauschen
Func ATan2(Const $nY, Const $nX)
Local $nResultIf IsNumber($nY) = 0 Then
[/autoit]
SetError(1)
Return 0
ElseIf IsNumber($nX) = 0 Then
SetError(1)
Return 0
EndIf
If $nX = 0 Then
If $nY > 0 Then
$nResult = $PI / 2.0
ElseIf $nY < 0 Then
$nResult = 3.0 * $PI / 2.0
Else
SetError(2)
Return 0
EndIf
ElseIf $nX < 0 Then
$nResult = ATan($nY / $nX) + $PI
Else
$nResult = ATan($nY / $nX)
EndIf
While $nResult < 0
$nResult += 2.0 * $PI
WEnd
Return $nResult
EndFunc ;==>ATan2 -
Also hab das mit deiner Lösung mal ausprobiert.
Eigentlich hab ich kartesische 3dkoordinaten, wobei man die vertikale koordinaten außer betracht lassen kann, da diese konstant ist.
Hab dein Skript mal angewandt, und dabei kommen Werte wie 5,2 raus, die für die bestimmte Lage der zwei Objekte völlig unpassend sind -
Hab dein Skript mal angewandt, und dabei kommen Werte wie 5,2 raus, die für die bestimmte Lage der zwei Objekte völlig unpassend sind
Das wäre ein Winkel von 298° zwischen Nullrichtung und dem Zielpunkt.
Warum ist das unpassend?
Du hast meine Fragen ohnehin immer noch nicht beantwortet. -
ok vorhandene Informationen:<-- für die nachwelt noch nicht gelöscht
- Position Monster(/x/y/z)
- Position Kamera(x/y/z)
- Rotation Kamera(x/y/z)
- Rotation Kamera (x/y/z)
gewünschtes ergebnis:
- um wie viel grad sich das objekt auf der x und auf der z-achse drehen muss
koordinaten:
- habe logischerweise ein dreidimensionales, kartesisches Koordinatensystem
- y-Koordinate dürfte aber nicht relevant sein, da sich diese nicht ändert
- Daher spielt sich alles auf der x-z-Ebene ab
nullrichtung
- das target des objekts ist nicht klar von irrlicht definiert, kann nicht so leicht definiert werden
- die richtung kann man doch im nachhinein je nach dem regulieren?
richtungswinkel
-ich denke doch von 0 bis 2*PiZitatDas wäre ein Winkel von 298° zwischen Nullrichtung und dem Zielpunkt.
Uh man, hatte vergessen, das Ergebnis des atan mit 180/pi zu multiplizieren. Jetzt läufts...astrein. Erstklassiger Support, vielen, vielen dank!!! -
Was bleibt da noch zu sagen ausser: "LOL"
-
weil ichs nich umgerechnet hab oder was?