Winkelfunktionen o.a.: Rotation eines Objekts in Richtung Kamera

  • 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.

    [align=center]Meine Werke mit der Irrlicht Engine
    AutoIt Picture Viewer Dreidimensionaler Bildbetrachter
    Mr Bubble 3D Neue Interpretation des Flashklassikers Bubble trouble

    Einmal editiert, zuletzt von Twodollarbillie (15. Februar 2012 um 23:28)

  • Stimmt demnach folgende Berechnung?

    [autoit]

    func _calcrotat()

    [/autoit][autoit][/autoit][autoit]

    $pos_cam= _irrgetnodeposition($camera)
    $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

    [/autoit]


    Ich glaub, dass das ziemlich falsch ist :D -> Winkel sind nicht korrekt

    [align=center]Meine Werke mit der Irrlicht Engine
    AutoIt Picture Viewer Dreidimensionaler Bildbetrachter
    Mr Bubble 3D Neue Interpretation des Flashklassikers Bubble trouble

    2 Mal editiert, zuletzt von Twodollarbillie (14. Februar 2012 um 19:16)

  • 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

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • 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
    Global $a_Zielpunkt[2] = [1, 3] ; Koordinaten des Zielpunktes (der Punkt auf den man schaut)

    [/autoit] [autoit][/autoit] [autoit]

    ; Koordinatendifferenzen
    $dX = $a_Zielpunkt[0] - $a_Standpunkt[0]
    $dy = $a_Zielpunkt[1] - $a_Standpunkt[1]

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "", "Blickrichtung: " & Atan2($dX, $dy) & " [rad]")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Berechnet den quadrantenkorrekten ArcusTangens
    ; je nach gewünschter Lage der Nullrichtung y und x vertauschen
    Func ATan2(Const $nY, Const $nX)
    Local $nResult

    [/autoit] [autoit][/autoit] [autoit]

    If IsNumber($nY) = 0 Then
    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

    [/autoit]
  • 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 8|8|8|

    [align=center]Meine Werke mit der Irrlicht Engine
    AutoIt Picture Viewer Dreidimensionaler Bildbetrachter
    Mr Bubble 3D Neue Interpretation des Flashklassikers Bubble trouble

  • ok vorhandene Informationen:
    - 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*Pi
    <-- für die nachwelt noch nicht gelöscht ;)

    Zitat

    Das 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!!!

    [align=center]Meine Werke mit der Irrlicht Engine
    AutoIt Picture Viewer Dreidimensionaler Bildbetrachter
    Mr Bubble 3D Neue Interpretation des Flashklassikers Bubble trouble