Irrlicht Beispiel Sicht-Berechnung

  • Hallo ich mach gerade für mein Projekt Flutch Flutch
    ein script.
    Dieses Script soll die Kamera um einen Punkt in einem bestimmten abstand rotieren lassen, wobei die Kamera immer in richtung Punkt sieht.
    Doch wenn ich die Kamera jetzt neu platziere sieht man nichts mehr von der Map..
    Warum ??

    "Sicht berechnung"
    [autoit]

    #include "../au3Irrlicht2.au3"

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

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

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

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $aMousePos[2], $aPoint[3], $aDirect[3], $aCamPos[3]

    [/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( "Irrlicht Tutorial" )

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

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )

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

    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )

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

    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

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

    $aPoint[0] = 4.0
    $aPoint[1] = -461.63
    $aPoint[2] = 0.0

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

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

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

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

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

    $aDirect = $aPoint - $aCamPos
    Global Const $alength = ($aDirect[0]^2 + $aDirect[1]^2 + $aDirect[2]^2)^(1/2)

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

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

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

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

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

    _IrrDrawScene()

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

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

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

    $aCamPos[1] += $aMousePos[0]
    $aCamPos[2] += $aMousePos[1]

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

    $aDirect = $aPoint - $aCamPos

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

    $aDirect[0] = ($alength^2 + $aDirect[1]^2 + $aDirect[2]^2)^(1/2)
    $aCamPos = $aPoint - $aDirect

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

    _IrrSetNodePosition( $Camera, $aCamPos[0], $aCamPos[1], $aCamPos[2] )

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

    _IrrEndScene()
    WEND

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

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]
  • [autoit]

    $aCamPos = $aPoint - $aDirect

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

    _IrrSetNodePosition( $Camera, $aCamPos[0], $aCamPos[1], $aCamPos[2] )

    [/autoit]

    $aCampPos ist ein Array, du kannst es nicht wie eine Variable deklarieren. Aber auch wenn du [0], [1], oder [2] als Index benutzt bewegt sich die Kamera nicht richtig, das musst du noch anpassen.

    Außerdem: $aPoint ist auch ein Array, so wie $aDirect auch.

  • Soll ich es also ersetztn durch

    [autoit]

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

    [/autoit]

    oder funkt das auch nicht?

  • wow!!!!
    also es funkt zwar noch nicht ganz so wie ich das wollte .. aber es reagiert schon hammermäßg stark..

    "Sicht: zu weit weg"
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include "../au3Irrlicht2.au3"

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

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

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

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $aMousePos[2], $aPoint[3], $aDirect[3], $aCamPos[3]

    [/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( "Irrlicht Tutorial" )

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

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )

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

    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )

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

    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

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

    $aPoint[0] = 4.0
    $aPoint[1] = -461.63
    $aPoint[2] = 0.0

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

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

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

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

    [/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]

    Global Const $alength = ($aDirect[0]^2 + $aDirect[1]^2 + $aDirect[2]^2)^(1/2)

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

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

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

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

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

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

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

    $aCamPos[1] += $aMousePos[0]
    $aCamPos[2] += $aMousePos[1]

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

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

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

    $aDirect[0] = ($alength^2 + $aDirect[1]^2 + $aDirect[2]^2)^(1/2)
    $aCamPos[0] = $aPoint[0] - $aDirect[0]
    $aCamPos[1] = $aPoint[1] - $aDirect[1]
    $aCamPos[2] = $aPoint[2] - $aDirect[2]

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

    _IrrSetNodePosition( $Camera, $aCamPos[0], $aCamPos[1], $aCamPos[2] )
    _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]

    Jetzt weiß ich nicht ganz was ich ändern mss um näher zu sein.. vielleicht der Punkt..??
    Was muss ich eigentlich bei _IrrSetCameraTarget( ) als Parameter eingeben? Stimmt es wenn ich den Punkt eingebe auf den die Kamera sehen soll??


  • Jetzt weiß ich nicht ganz was ich ändern mss um näher zu sein.. vielleicht der Punkt..??
    Was muss ich eigentlich bei _IrrSetCameraTarget( ) als Parameter eingeben? Stimmt es wenn ich den Punkt eingebe auf den die Kamera sehen soll??


    Du musst den Punkt in Richtung des Meshes bewegen.
    Und Target ist der Punkt auf den die Camera zeigt. Standart ist [0,0,1].

    Ind er Irrlichtengine selber wird zum Rotieren um einen Mittelpunkt diese Funktion verwendet:

    [autoit]

    Global $PI = 4*ATan(1)

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

    Func _Vec3d_RotateXZBy(ByRef $vec, $degrees, Const ByRef $center)
    $degrees *= ($PI/180)
    Local $cs = Cos($degrees)
    Local $sn = Sin($degrees)
    $vec[0] -= $center[0]
    $vec[2] -= $center[2]
    $vec[0] = ($vec[0]*$cs - $vec[2]*$sn)
    $vec[2] = ($vec[0]*$sn + $vec[2]*$cs)
    $vec[0] += $center[0]
    $vec[2] += $center[2]
    EndFunc

    [/autoit]

  • Wenns um die Kreisbewegung geht, empfehle ich

    AutoIt-QuellcodeCode kopieren
    _IrrAddRotationAnimator($h_Node, $f_RotX, $f_RotY, $f_RotZ)

    Aber.. was sind da jetzt die Parameter...? Was macht das jetzt genau...??

  • aktuelle version:

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include "../au3Irrlicht2.au3"

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

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

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

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $aMousePos[2], $aPoint[3], $aDirect[3], $aCamPos[3]

    [/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( "Irrlicht Tutorial" )

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

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )

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

    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )

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

    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

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

    $aPoint[0] = 1800.0
    $aPoint[1] = 200.0
    $aPoint[2] = 1500.0

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

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

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

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

    [/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]

    Global Const $alength = ($aDirect[0]^2 + $aDirect[1]^2 + $aDirect[2]^2)^(1/2)

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

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

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

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

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

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

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

    $aCamPos[1] += $aMousePos[0]
    $aCamPos[2] += $aMousePos[1]

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

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

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

    $aDirect[0] = ($alength^2 + $aDirect[1]^2 + $aDirect[2]^2)^(1/2)
    $aCamPos[0] = $aPoint[0] - $aDirect[0]
    $aCamPos[1] = $aPoint[1] - $aDirect[1]
    $aCamPos[2] = $aPoint[2] - $aDirect[2]

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

    _IrrSetNodePosition( $Camera, $aCamPos[0], $aCamPos[1], $aCamPos[2] )
    _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]

  • Aber.. was sind da jetzt die Parameter...? Was macht das jetzt genau...??

    Die Funktion erstellt einen SceneNodeAnimator. Der Animator lässt die Objekte bewegen. In diesem Fall im Kreis.
    Der 1. Parameter ist das SceneNode, also die Camera.
    Die anderen drei Parameter geben an, um wieviel Grad pro 10 Millisekunden sich die Camera um die X, Y und Z-Achse dreht.

  • aha.. das kann ich mit meinem kombinieren...

    danke ^^

    muss ich das jetzt noch mit irgendwas kombinieren ??
    weil so wie ich es jetzt habe bewegt sich garnichts mehr..

  • Also ich würde einfach einen Rotationsanimator auf die Camera setzen und zur sicherheit das Target der camera immer neu bestimmen.

    Hab ich probiert aber das funkt nicht.. wenn ich die Kamerea rotieren lasse geschieht nichts..
    Wenn ich aber die Map rotieren lasse funkt es ...

    erstens: Wie kann ich jetzt die Kammera zu rotieren bringen?
    zweitens: Wie kann ich bestimmen dass es sich um einen bestimmten punkt dreht...

    wärs nicht einfacher wenn man immer den Nullpunkt verschiebt die Kammera um den Nullpunkt rotieren lässt und mein Charakter sich immer im Nullpunkt befindet und die Map sozusagen immer verschoben wird?? 8o
    oder wird das wesentlich zu komplex?

  • Naja ich sehe die Kamera als ein Objekt an (wie zb md2). Dieses kann man auch durch einen Rotationsanimator drehen lassen.
    Und wie gesagt, damit die Kamera immer auf das eigentliche Objekt gerichtet ist, verwendet man ...settarget..

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

  • Ja.. das hab ich eigentlich gemacht aber das funkt nicht ganz....
    Da bewegt sich garnichts.. sieh mal nach bitte..

    "...RotationAnimator"
    [autoit]

    #include "../au3Irrlicht2.au3"

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

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

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

    Global $BSPMesh, $BSPNode, $Camera
    Global $screen_width, $screen_height
    Global $aMousePos[2], $aPoint[3], $aDirect[3], $aCamPos[3]

    [/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( "Irrlicht Tutorial" )

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

    _IrrAddZipFile( "../media/map-20kdm2.pk3", $IRR_IGNORE_CASE, $IRR_IGNORE_PATHS )

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

    $BSPMesh = _IrrGetMesh( "20kdm2.bsp" )

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

    $BSPNode = _IrrAddMeshToSceneAsOcttree( $BSPMesh )

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

    $aPoint[0] = 1800.0
    $aPoint[1] = 200.0
    $aPoint[2] = 1500.0

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

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

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

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

    [/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]

    Global Const $alength = ($aDirect[0]^2 + $aDirect[1]^2 + $aDirect[2]^2)^(1/2)

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

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

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

    _IrrAddRotationAnimator( $Camera, 0, 0.01, 0.02 )

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

    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )

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

    _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]
  • Mr Irrlicht (<- ich :D) hats geschafft:

    [autoit]

    #include "au3Irrlicht2.au3"

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

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

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

    Global $Camera
    Global $screen_width, $screen_height
    Global $aMousePos[2], $aPoint[3], $aDirect[3], $aCamPos[3], $mesh, $node

    [/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( "Irrlicht Tutorial" )
    $camera= _irraddcamera( 0, 0, 0, 0, 0, 0)
    $mesh= _irrgetmesh("C:\untitled.obj")
    $node= _irraddmeshtoscene($mesh)
    _IrrAddFlyCircleAnimator($camera,0, 0, 0, 10, 0.001)
    WHILE _IrrRunning()
    _IrrBeginScene( 255,255,255 )
    _IrrDrawScene()

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

    _IrrEndScene()
    WEND

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

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit]

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