Einfach im GameMode pro frame die rotation um eine bestimmte Konstante addieren?
Du musst dir das etwas anders vorstellen: Als Grundlage für die zweite (und dritte) Rotationsachse die du änderst, dient nicht wie du vielleicht denkst, das Objekt selbst, sondern das normale Koordinatensystem von Oblivion. Soll heißen, es macht einen Unterschied (in Bezug auf das Objekt), ob es Parallel zu einer Achse ist, oder nicht. Hierbei ist ja entscheidend, dass sich dieses Verhätniss ständig ändert.
Die Grundlage dieses Scriptes kommt vom Wiki, und f.fin1 übergibt der Mathlibrary den Kreispositionswinkel. f.fout und f.fout2 geben sinus und cosinus zurück.
Code:
ScriptName CirclingAroundThePlayerScript
short constantsset ; did we set the constants?
float rspeed ; in degrees/s
float hdist ; horizontal distance from the player
float rpos ; position on the circle
float mod_x ; positions relative to the player
float mod_y
float mod_z
float org_x ; position of the player
float org_y
float org_z
float ang_x ; rotation of the dagger
float ang_y
float ang_z
Begin GameMode
; setting up constants
if constantsset == 0
set rspeed to 100 ; constant radial speed
set mod_z to 110 ; constant height
set hdist to 50 ; constant distance
set constantsset to 1 ; done setting up the constants
endif
; updating the position on the circle (rpos)
set rpos to rpos + ( rspeed * getSecondsPassed )
if rpos > 360
set rpos to rpos - 360
endif
; setting the mods, via the SinCosTan function
set f.fin1 to rpos
setStage f 15 ; SinCosTan(rpos) function call
set mod_x to f.fout * hdist ; sin(rpos) * hdist
set mod_y to f.fout2 * hdist ; cos(rpos) * hdist
; getting the player's position
set org_x to player.getPos X
set org_y to player.getPos Y
set org_z to player.getPos Z
; setting my own position
set org_x to org_x + mod_x
setPos X, org_x
set org_y to org_y + mod_y
setPos Y, org_y
set org_z to org_z + mod_z
setPos Z, org_z
[B] ; setting my own z-rotation
set ang_z to rpos + 90
setAngle z ang_z
; setting my own y-rotation
;set ang_y to ...
;setAngle y ang_y
; setting my own x-rotation
;set ang_x to ...
;setAngle x ang_x[/B]
End
Das Fette ist der Entscheidende Teil.
Die z-Rotation sorgt dafür, dass immer die gleiche Stelle nach vorne zeigt.
Die y- und x-Rotationen müssen jetzt irgentwie in abhängigkeit von der Kreisposition geändert werden, sodass sie diese "Rolle" erzeugen.
Vielleicht hilft es zu wissen, dass bei den Winkeln 0 und 180 sowie 90 und 270, jeweils eine Rotation allein geändert werden muss, um diese Rotation zu erzeugen.
Müsste das dann nicht das Verhältnis von mod_y zu mod_x dasselbe sein, wie zwischen der Änderung von ang_y zu ang_x?