Hallo Leute.
Wie ihr wisst arbeite ich an meinem Projekt Flutch
Ich will, dass meine Kamera um einen Bestimmten Punkt kreist.
Aber ich will sie während der While beinflussen können. (Das geht mit _IrrAddFlyCircleAnimator() nicht!
Da es keine Funktionen in Irrlicht gibt die ich für diese Aufgabenstellung brauche habe ich mir selbst eine Berechnung gemacht..
Ich habe sie auskommentiert da ansonsten mir wahrscheinlich niemand folgen kann..
Das Problem seht ihr eindeutig wenn ihr das Script laufen lässt:
Spoiler anzeigen
#include "../au3Irrlicht2.au3"
#include <Misc.au3>
opt("MustDeclareVars", True)
HotKeySet("{ESC}", "_exit")
Global $BSPMesh, $BSPNode, $Camera, $chrMesh, $chrNode
Global $screen_width, $screen_height
Global $aMousePos[2], $aPoint[3], $aDirect[3], $aCamPos[3], $aSpeed, $aAnimator
Global $bAlpha, $bBeta, $bVektorL, $bVekXL, $bVekYL, $bVekX[2], $bVekY[2]
$screen_width = 800
$screen_height = 600
Global Const $pi = 3.14159265358979
[/autoit] [autoit][/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 )
_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] = 1900.0
$aPoint[1] = 150.0
$aPoint[2] = 1400.0
$aCamPos[0] = 1750.0
$aCamPos[1] = 149.0
$aCamPos[2] = 1369.0
$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]
Global Const $alength = ($aDirect[0]^2 + $aDirect[1]^2 + $aDirect[2]^2)^(1/2)
[/autoit] [autoit][/autoit] [autoit]_IrrHideMouse()
[/autoit] [autoit][/autoit] [autoit]WHILE _IrrRunning()
_IrrBeginScene( 255,255,255 )
;Um es einfacher zu machen hab ich mich fürs erse auf die 2-dimensionale Ebene beschränkt
[/autoit] [autoit][/autoit] [autoit]; Winkel berechnung "0.05" soll später die Bewegung des Mauszeigers in die X-Richtung sein,
; $alength ist der Radius, Alpha ist der Winkel der für die Bogenlänge des zurückgelegten Weges
; der Kamera entspricht
$bAlpha = ATan(0.05 / $alength)
; Wenn man es von oben betrachtet sieht man nun ein Dreieck bestehend aus dem Vektor den die
; Kamera zurücklegen soll und zweimal dem Radius (= $alength) dadurch entstehen zwei weitere
; gleichgroße Wikel (= $bBeta)
$bBeta = ($pi-$bAlpha) / 2
; Jetzt zeichnen wir eine Höhe auf einem dem Vektor ein, die die Kamera zurücklegen soll
$bVektorL = 2 * cos($bBeta) * $alength
; Nun wird der X und der Y Wert des Vektors bestimmt, bezogen auf den Radius-Vektor auf
; Auf dem wir die Höhe gezeichnet haben (Radius-Vektor = $aDirect)
$bVekXL = sin($bBeta) * $bVektorL
$bVekYL = cos($bBeta) * $bVektorL
; um das ganz nun auf das echte Koordinatensystem zu beziehen holen wir uns den Einheitsvektor
; vom Radiusvektur und Multiplizieren ihn mit der X-Wert ([0]=X, [1]=Y)
$bVekX[0] = $aDirect[0] / $alength * $bVekXL
$bVekX[1] = $aDirect[1] / $alength * $bVekXL
; Das selbe mit dem Y-Wert. aber dazu müssen wir einen Einheitsvektor nehmen der orthogonal
; zum anderen Einheitsvektor stehe, da ja das Koordinatensystem auch orthogonal zueinander
; steht ([0]=X, [1]=Y)
$bVekY[0] = -$aDirect[1] / $alength * $bVekYL
$bVekY[1] = $aDirect[0] / $alength * $bVekYL
; nun werden die ergebnise in X und in Y Richtung zur Kameraposition dazu gerechnet
$aCamPos[0] += $bVekX[0] + $bVekY[0]
$aCamPos[1] += $bVekX[1] + $bVekY[1]
; $aDirect aktualisieren, da es sich ändert, weil es ja der Vektor vom Punkt zur Position
; der Kamera ist
$aDirect[0] = $aPoint[0] - $aCamPos[0]
$aDirect[1] = $aPoint[1] - $aCamPos[1]
$aDirect[2] = $aPoint[2] - $aCamPos[2]
_IrrSetNodePosition( $Camera, $aCamPos[0], $aCamPos[1], $aCamPos[2] )
_IrrSetCameraTarget( $Camera, $aPoint[0], $aPoint[1], $aPoint[2] )
_IrrDrawScene()
[/autoit] [autoit][/autoit] [autoit]_IrrEndScene()
WEND
Func _exit()
_IrrStop()
Exit
EndFunc ; _exit
Zum Besseren Verständnis hab ich noch zwei Bilder gezeichnet