Oblivion:Kreisförmige Bewegung

Aus Skript-Wiki
Wechseln zu: Navigation, Suche

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 | }}