Oblivion:Kreisförmige Bewegung
Inhaltsverzeichnis
Thema
Kreisförmige kontinuierliche Bewegungen eines Objektes sind mittels Script zu simulieren.
Anwendung
Aufgabenstellung
Ein Apfel soll sich 60 Sekunden lang um einen festen Punkt (dem Mittelpunkt) bewegen, der Radius soll 100 cm betragend, die Höhe soll etwas über Kopfhöhe sein und der Apfel soll in 10 Sekunden einen Kreis vollenden. Der Mittelpunkt wird beim Start aus der Position des Players bestimmt. Nach den 60 Sekunden soll der Apfel herunter fallen.
Theorie
Zur Theorie von Bewegungen s. die Lineare Bewegung
Kollisionen werden mit dem vorgestellten Algorithmus nicht bearbeitet.
Aufwändig ist die Berechnung der Postionen auf einem Kreis (Kreisgleichung). Wenn man keine Winkelfunktionen nutzen kann oder will (sie sind in der Erweiterung ESM Math Library vorhanden), müssen sie über eine Taylorreihe angenähert werden.
Realisierung
Umgebung
Ein neues Apfelobjekt mit Script ist in der Welt
Script
<tesscript>ScriptName AppleCircuit
- Written by keris
- 11.06.09
short Init float xPos float yPos float zPos float zPosStart float xPosStart float yPosStart float phi float dz float Radius Float Angle float Pi float TwoPi float Period float AngularVelocity float Timer short Start short Movement short PeriodCount float Duration short xSign short ySign
Begin GameMode
if Init == 0 ; setting up constants
Set dz to 126;(ca. 180 cm wie vorgegeben )
Set Radius to 70 ;(ca. 100 cm wie vorgegeben ) Set pi to 3.1415926 Set twopi to 6.2531852 Set Period to 10 ; (10 s. wie vorgegeben) Set Duration to 60 Set Start to 1 Set xPosStart to Player.GetPos x Set yPosStart to Player.GetPos y Set zPosStart to Player.GetPos z Set xSign to 1 Set ySign to 1
; die Koordinaten auf einem Kreis sind gegeben durch: ; x = X(Mittelpunkt) + Radius cos(phi) ; y = Y(Mittelpunkt) + Radius sin(phi) set Init to 1 set Start to 1 Endif
- Näherungsformeln für die Winkelfunktionen (Taylorreihe)
- sin(phi) = phi - phi*phi*phi / 6.0
- cos(phi) = (phi*phi /12.0 -1)* phi*phi /2.0 +1
if Start == 1 Set Start to 0 Set Movement to 1 Set Timer to 0 endif
if Movement == 1 ; Startposition
Set phi to 0 Set xPos to xPosStart Set yPos to yPosStart + Radius Set zPos to zPosStart + dz
SetPos X XPos SetPos Y YPos SetPos Z ZPos
Set Movement to 2 elseif Movement == 2 ; neue Position Set Timer to Timer + GetSecondsPassed Set PeriodCount to Timer / Period Set phi to (TwoPi / Period * Timer) - (PeriodCount * TwoPi ) if Phi > pi Set Phi to Phi - pi Set xSign to -1 Set ySign to -1 else Set xSign to 1 Set ySign to 1 endif if Phi < pi/4.0 Set Xpos to XposStart + Radius * ((phi*phi/12-1)*phi*phi/2 + 1) * xSign Set Ypos to YposStart + Radius * (-phi*phi*phi/6 + phi) *ySign elseif Phi < pi/2 Set Phi to pi/2.0 -Phi Set Xpos to XposStart + Radius * (-phi*phi*phi/6 + phi) * xSign Set Ypos to YposStart + Radius * ((phi*phi/12-1)*phi*phi/2 + 1) * ySign elseif Phi < pi/1.5 Set Phi to Phi - pi/2.0 Set Xpos to XposStart - Radius * (-phi*phi*phi/6 + phi) * xSign Set Ypos to YposStart + Radius * ((phi*phi/12-1)*phi*phi/2 + 1) * ySign else Set Phi to pi -Phi Set Xpos to XposStart - Radius * ((phi*phi/12-1)*phi*phi/2 + 1) * xSign Set Ypos to YposStart + Radius * (-phi*phi*phi/6 + phi) *ySign endif
SetPos X XPos SetPos Y YPos SetPos Z ZPos If Timer >= Duration Set Movement to 3 endif endif
End</tesscript>
Handhabung
Das Script liegt auf einem neuen Apfel-Objekt. Es wird in obigem Script nicht bei jeder Bewegung ein Inkrement zur aktuellen Position addiert sondern die neue Position von der Ausgangsposition aus bestimmt. Dies Script ist in der Struktur dem für die Lineare Bewegung vergleichbar. Nur die Berechung der Positionen macht das Script lang. Dies ist aber kein implizites CS-Problem sondern reine Mathematik.
Weiterführende Hinweise
Weitere Scripts aus dieser Kategorie
Level 1
{{#if: Bewegung | }}
{{#if: Level_2_Scripts | }}