Rotation Berechnen --> Irrlicht Projekt

  • Hi Leute!

    Wie die meisten wissen hab ich mein Projekt Flutch am Laufen.
    Ich bin dabei am einstellen der Standardeinstellungen fürs Herumlaufen des Charakters usw....
    Doch ich scheitere im Moment an einem Problem:
    --> Mein Charakter sieht immer in die gleiche Richtung..

    Ich müsste ihn genau in diese Richtung Rotieren in die er läuft.
    Ich hab mal eine Berechnung probiert, die anber nicht funkt...
    Könnt ihr mir weiterhelfen:

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    #include "../au3Irrlicht2.au3"
    #include <Misc.au3>
    #include <File.au3>

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

    opt("MustDeclareVars", True)
    HotKeySet("{ESC}", "_exit")

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

    Global $degree = -180
    Global $degZ = 70

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

    Global $BSPMesh, $BSPNode, $Camera, $MD2Mesh, $SceneNode, $MeshTexture, $MeshTexture2, $selector, $outHitPosition, $outFalling
    Global $screen_width, $screen_height, $gravity[3], $velocity[3], $ellipsoidRadius[3]
    Global $aMousePos[2], $aPoint[3], $aDirect[3], $aCamPos[3], $aDirectCha[3], $DifV[3], $DivL, $aAlpha, $Light[5]

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

    Global $dir = _PathFull( @ScriptDir & "\..\Meshes\md2\" ) ;

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

    $screen_width = 800
    $screen_height = 600

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

    _IrrStart( $IRR_EDT_OPENGL, $screen_width, $screen_height, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_NO_SHADOWS, $IRR_IGNORE_EVENTS, _
    $IRR_VERTICAL_SYNC_OFF )

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

    _IrrSetWindowCaption( "Flutch - Das neue Rollenspiel" )

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

    $MeshTexture = _IrrGetTexture( $dir & "test.bmp" )
    $BSPMesh = _IrrGetMesh( $dir & "_test7.obj" )
    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )
    _IrrSetNodeMaterialFlag( $BSPNode, $IRR_EMF_LIGHTING, $IRR_OFF )
    _IrrSetNodeScale( $BSPNode, 10, 10, 10 )
    _IrrSetNodeMaterialTexture( $BSPNode, $MeshTexture, 1 )
    _IrrSetNodeMaterialFlag( $BSPNode, $IRR_EMF_LIGHTING, $IRR_OFF )

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

    $MD2Mesh = _IrrGetMesh( $dir & "test6.obj" )
    $MeshTexture2 = _IrrGetTexture( $dir & "test5.pcx" )
    $SceneNode = _IrrAddMeshToScene( $MD2Mesh )
    _IrrSetNodeScale( $SceneNode, 2, 2, 2 )
    _IrrSetNodeMaterialTexture( $SceneNode, $MeshTexture2, 0 )
    _IrrSetNodeMaterialFlag( $SceneNode, $IRR_EMF_LIGHTING, $IRR_OFF )
    $selector = _IrrGetCollisionGroupFromComplexMesh( $BSPMesh, $BSPNode )

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

    $aPoint[0] = 1900.0
    $aPoint[1] = 100.0
    $aPoint[2] = 1300.0

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

    $gravity[0] = 0.0
    $gravity[1] = -2.8
    $gravity[2] = 0.0

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

    $velocity[0] = 0.0
    $velocity[1] = 2.0
    $velocity[2] = 0.0

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

    $aCamPos[0] = 1750.0
    $aCamPos[1] = 149.0
    $aCamPos[2] = 1369.0

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

    $aDirectCha[0] = 0.0
    $aDirectCha[1] = 0.0
    $aDirectCha[2] = 0.0

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

    $ellipsoidRadius[0] = 25.0
    $ellipsoidRadius[1] = 50.0
    $ellipsoidRadius[2] = 25.0

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

    $Camera = _IrrAddCamera( $aCamPos[0], $aCamPos[1], $aCamPos[2], $aPoint[0], $aPoint[1], $aPoint[2] )
    _IrrSetNodePosition($SceneNode, $aPoint[0], $aPoint[1], $aPoint[2])

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

    _IrrHideMouse()
    MouseMove( @DesktopWidth/2, @DesktopHeight/2, 0 )
    $aMousePos[0] = 0.0
    $aMousePos[1] = 0.0

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

    WHILE _IrrRunning()
    _IrrBeginScene( 55,55,55 )

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

    _Direction_calc()

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

    _IrrGetCollisionResultPosition ( _
    $selector, _
    $aPoint, _
    $ellipsoidRadius, _
    $velocity, _
    $gravity, _
    0.0005, _
    $aPoint, _
    $outHitPosition, _
    $outFalling )

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

    _move()

    _IrrSetCameraTarget( $Camera, $aPoint[0], $aPoint[1], $aPoint[2] )

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

    _IrrDrawScene()

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

    _IrrEndScene()
    WEND

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

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

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

    Func _Direction_calc()
    $aMousePos = MouseGetPos()
    MouseMove( @DesktopWidth/2, @DesktopHeight/2, 0 )
    $aMousePos[0] -= @DesktopWidth/2
    $aMousePos[1] -= @DesktopHeight/2

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

    If $aMousePos[0] < 0 Then
    $degree -= $aMousePos[0]/15
    If $degree >= 180 Then $degree = -180
    ElseIf $aMousePos[0] > 0 Then
    $degree -= $aMousePos[0]/15
    If $degree <= -180 Then $degree = 180
    EndIf

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

    If $aMousePos[1] < 0 Then
    If $degZ < 179 Then $degZ -= $aMousePos[1]/15
    ElseIf $aMousePos[1] > 0 Then
    If $degZ > 1 Then $degZ -= $aMousePos[1]/15
    EndIf

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

    $aDirect[0] = $aPoint[0] - $aCamPos[0]
    $aDirect[1] = $aPoint[1] - $aCamPos[1]
    $aDirect[2] = $aPoint[2] - $aCamPos[2]

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

    $velocity[0] = 0.0
    $velocity[2] = 0.0

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

    If _IsPressed("57") Then
    $velocity[0] = $aDirect[0]/100
    $velocity[2] = $aDirect[2]/100
    $DifV[0] = -$aDirectCha[0] + $aDirect[0]
    $DifV[2] = -$aDirectCha[2] + $aDirect[2]
    $DivL = (($DifV[0]^2 + $DifV[2]^2)^(1/2))/2
    $aAlpha = ASin( $DivL / ( ($aDirectCha[0]^2 + $aDirectCha[2]^2) ^ (1/2) ))
    $aDirectCha[0] = $aDirect[0]
    $aDirectCha[2] = $aDirect[2]
    ElseIf _IsPressed("53") Then
    $velocity[0] = -$aDirect[0]/100
    $velocity[2] = -$aDirect[2]/100
    EndIf

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

    If _IsPressed("41") Then
    $velocity[0] = -$aDirect[2]/100
    $velocity[2] = $aDirect[0]/100
    ElseIf _IsPressed("44") Then
    $velocity[0] = $aDirect[2]/100
    $velocity[2] = -$aDirect[0]/100
    EndIf
    EndFunc

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

    Func _move()
    Local Const $pi = 3.14159265358979323846264338327950288419716939937510582097
    Local Const $deg2rad = $pi/180
    Local $rad = $degree * $deg2rad
    $aCamPos[0] = 200 * Sin($degZ * $deg2rad) * Cos($rad) + $aPoint[0]
    $aCamPos[2] = 200 * Sin($degZ * $deg2rad) * Sin($rad) + $aPoint[2]
    $aCamPos[1] = 200 * Cos($degZ * $deg2rad) + $aPoint[1]
    $aAlpha = $aAlpha / $deg2rad

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

    _IrrSetNodePosition($Camera, $aCamPos[0], $aCamPos[1], $aCamPos[2])
    _IrrSetNodePosition($SceneNode, $aPoint[0], $aPoint[1], $aPoint[2])
    _IrrSetNodeRotation($SceneNode, 0, $aAlpha, 0)
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Schnacko (27. August 2011 um 12:53)

  • Hab jetzt mal einen möglichen Lösungsweg gemacht...
    Nur bewegt sich da garnichts..

    Das ist die Funktion die (wenn er gerade ausgeht) den Winkel berechnen soll:

    Spoiler anzeigen
    [autoit]

    Func _RotationCharacter()
    Local $Move[3], $MoveLength, $Direct[3], $aDirectLength, $Winkel
    Local Const $pi = 3.14159265358979323846264338327950288419716939937510582097
    Local Const $deg2rad = $pi/180
    Local $rad = $degree * $deg2rad

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

    $aDirectLength = ( $aDirect[0]^2 + $aDirect[2]^2 )^(1/2) ; Länge vom Vektor des Camera-Richtung (Draufsicht)
    $Direct[0] = $aDirect[0] / $aDirectLength ; Berechnung vom Einheitsvektor
    $Direct[2] = $aDirect[2] / $aDirectLength

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

    $Move[0] = $aDirectCha[0] - $Direct[0] ; Berechnung vom Differenz Vektor.. (Draufsicht: liegt gegenüber des gesuchten Winkels)
    $Move[2] = $aDirectCha[2] - $Direct[2]
    $MoveLength = ( $Move[0]^2 + $Move[2]^2 )^(1/2) ; Die Länge des Vektors berechnen
    $MoveLength /= 2 ; Halbieren, damit wir ein Rechtwinkeliges Dreieck aus dem gleichschenkeligen bekommen)

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

    $Winkel = ASin( $MoveLength) ; Sinussatz im Entstandenen Rechten Winkel (Hypotenuse = 1)
    $aAlpha = $Winkel*2/$deg2rad ; Winkel verdoppeln um deWinkel zu erhalten und in ° umwandeln
    EndFunc

    [/autoit]

    EDIT: Hab noch einen Fehler korrigiert.. So funkts jetzt .. nur manchmal steckt er.. warum??
    EDIT: Hab herausgefunden, dass es nur bis 90° funkt.. hmm..

    Einmal editiert, zuletzt von Schnacko (26. August 2011 um 23:40)

  • Hab noch ne andere Lösung in nem Irrlichtforum gefunden. War allerdings in C++ geschrieben und habs bis jetzt auch noch nicht ganz übersetzt.
    Zum Thread

    [autoit]

    ;Die Kamera hinter den Player setzen
    local $cam_Zoom = 70.0
    local $cam_angle = 1.0
    local $cam_offset= 0.0
    local const $pi= 3.14159265
    $player_pos=_irrgetnodeposition($player); Der Player ist in diesem Fall das Nodeobjekt
    $player_rot= _irrgetnoderotation($player)
    _irrsetcameratarget($camera, $player_pos[0], $player_pos[1]+75, $player_pos[2])
    $cam_distance= $cam_zoom*cos($cam_angle* $pi/180)
    _irrsetnodeposition($camera, $player_pos[0]- $cam_distance*cos(($player_rot[1]+ $cam_offset)*$pi/180),& _
    $player_pos[1]+ $cam_zoom * sin($cam_angle*$pi/180)+75,& _
    $player_pos[2]+ $cam_distance*sin(($player_rot[1]+$cam_offset)*$pi/180))

    [/autoit]


    ;Den Player drehen:

    [autoit]

    local $mouse_pos=Mousegetpos()
    local $cursor_delta_x= $mouse_pos[0]- $cursor_old_x
    local $cursor_delta_y= $mouse_pos[1]- $cursor_old_y
    $cursor_delta_x*=4
    $cursor_delta_y*=4
    If $cursor_delta_x>0 then
    $player_set_rot_y+=$cursor_delta_x*$framedeltatime; Hab die Deklarierung von $framedeltatime nicht gefunden
    endif
    Msgbox(0, "so", "2$billie hat ne halbe ewigkeit bis hierhin gearbeitet und schnacko meint jetzt, er hätte die richtige lösung -.-")

    [/autoit]

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

  • Die Kamera bewegt sich um den Charakter und man steuert mit WASD, ich muss dann noch einbauen, dass man Mit dem Mausrad zum Charakter hinund weg zoomen kann...

    Der Vektor von der Kamera zum Mittelpunkt des Charakters ist $aDirect (sprich die richtung in die die Kamera sieht)
    Diese Berechnung gilt vorerst nur für das Geradeausgehen... Sozusagen, dass der Charakter in die selbe richtung sieht wie die Kamera..
    Der Einheitsvektor, alos der Richtungsvektor vom CHarakter, ist $aDirectCha
    und nun berechne ich den Winkel zwischen diesen beiden Vektoren..
    Was noch nicht stimmt ist wegen der Periodizität vom Sin...

  • Also, die Kamera ist unabhängig. Dann ist das einfach.
    Nimm den Rotationvector. Die Y-Koordinate ist die Drehrichtung um die Y-Achse in Grad.

    Und das Mesh soll sich nun in Bewegungsrichtung geradeaus bewegen? In C++ hab ich das so gemacht:

    Code
    core::vector3df hlpvec = node->getAbsoluteTransformation().getRotationDegrees()*core::DEGTORAD;
    
    
    	core::vector3df speedvec;
    	speedvec.X = cosf(hlpvec.Y) * speed;
    	speedvec.Y = sinf(hlpvec.Z) * speed;
    	speedvec.Z = -sinf(hlpvec.Y) * speed;

    In AutoIt müsse das so sein:

    [autoit]


    global const $DEGTORAD = 4*Atan(1)/180

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

    $player_rot= _irrgetnoderotation($player)
    Local $move_x = Cos($player_rot[1]*$DEGTORAD)*$speed
    Local $move_y = Sin($player_rot[2]*$DEGTORAD)*$speed
    Local $move_z = -Sin($player_rot[1]*$DEGTORAD)*$speed

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

    $player_rot[0] += $move_x
    $player_rot[1] += $move_y
    $player_rot[2] += $move_z

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

    IrrSetNodeRotation($player, $player_rot)

    [/autoit]
  • nicht schlecht.. aber...
    wenn ich gerade aus meine.. dann meine ich immer von der Kamera weg...

    Vorher hab ich den ganzen Ordner hochgeladen... damit du verstehst was ich meine..
    Nun richtet er sich an der X-Achse aus und sieht immer in diese Richtung..
    EDIT: Er soll sich aber nicht an der X-Achse ausrichten sondern and dem Richtungsvektor der Kamera..

  • Warum denn so kompliziert.. wenn es so einfach gehen kann..

    Vielen Dank Marthog.. jetzt Funkts...