virtual-talk.de
Fahrzeug Scripting mit Physik Engine verstehen - Druckversion

+- virtual-talk.de (http://virtual-talk.de)
+-- Forum: Programmierung (http://virtual-talk.de/forumdisplay.php?fid=15)
+--- Forum: Scripten (http://virtual-talk.de/forumdisplay.php?fid=16)
+--- Thema: Fahrzeug Scripting mit Physik Engine verstehen (/showthread.php?tid=1522)



Fahrzeug Scripting mit Physik Engine verstehen - Tron Mcp - 25.07.2019

Diese Info ist zum Verständnis gedacht für diejenigen die sich interessieren wie physisch bewegte Objekte in Opensim funktionieren.
Es ist nicht Ziel einen Programmierkurs zu halten.
 

Was man zum scripten braucht findet man im Secondlife Wiki-    "http://wiki.secondlife.com/wiki/LSL_Portal"

jedoch fehlt eine Anleitung zum Verständnis. Diese Lücke versuche ich nun hier zu schliessen.


Grundlagen des Antriebs- und Steuerungs- Prinzips:
 
In Opensim gibt es keine echte Physik die ein Fahrzeug realistisch bewegt. Man muss selbst dafür sorgen das sich dies Fahrzeug so verhält.
 
Beispiele:
- Es fehlt an echter Reibung und Haftung: Ein Opensim Reifen eines Autos bringt in der Kurve keine Seitenkraft auf um das Fahrzeug in der Spur zu halten.
- es fehlt an echten Auftrieb im Wasser: Ein Boot geht unter bis zum Simboden oder einem anderen Hindernis, wenn man das nicht im Script durch entsprechende Motor Parameter verhindert.
Dies sind nur 2 Beispiele, aber sie zeigen das Dilemma wenn man mal eben schnell was fahrbares, fliegendes, etc. bauen will.
 
Da es keine Reibung gibt, braucht man auch keine rollenden Reifen um diese zu minimieren. Eine Umstellung also wenn man aus der realen Welt kommt.
Für Opensim reicht für die Bewegung ein grob auf Kollisionsform gebrachter Primwürfel aus.
Dieser ist genauso vielseitig wie in der Fernsehwerbung vor 20 Jahren beschriebene Tampons. Damit kann man Reiten, Schwimmen, Auto & Bootfahren, Fliegen,...
 
ROOTPRIM:
Dieser Würfen stellt das (meist transparente) Rootprim aller Fahrzeuge dar. In diesem befinden sich die Fahrscripte, Animationen und vieles mehr.
Was man dagegen siehst ist ein hinzu gelinktes Mesh. Dieses dient ausschließlich der Optik und ist dringend per Script auf Phantom zu setzten.
In diesem Zusammenhang muss dringend auf absolute Minimierung der kollisionstragenden Physik Hülle hingewiesen werden, wenn man ein gut steuerbares performantes Fahrzeug erstellen will. Wer mit einem Würfel mit abgeschrägten Frontflächen auskommt liegt hier am Besten.
Da Bewegung quasi als Schieben eines Würfels auf dem Untergrund gerechnet wird, ist es wichtig das sich die Kanten nicht verhängen. Folglich sehen die meisten Physikformen wie ein Schlitten aus.
Nun widmen wir uns der Bewegung dieses "PrimWürfel" Fahrzeugs:
 
BEWEGUNG:
- Physische Objekte werden periodisch mit Impulsen versorgt die eine gewünschte Bewegung herbeiführen sollen.
Am besten lässt sich das mit einer Impuls Kraft beschreiben die in 6 verschiedenen Richtungen ausgeübt werden kann.  Jede Kraft kennt dabei mögliche 2 Richtungen.
 
VEKTORKRÄFTE:
Zunächst gibt es die 3 Vektor Kräfte im Kartesischen Koordinaten System - also X, Y, Z Achse.
Diese wirken als Vektoren bezogen auf die Ausrichtung des Fahrzeuges.
Da jeder Vektor positiv, Null, oder negativ sein kann, lassen sich damit 6 Kräfte (jeweils bezogen auf Ausrichtung des Fahrzeugs) erzeugen:
Die Vektorkräfte werden über den LINEAR MOTOR dargestellt.
Alle diese Vektorkräfte wirken nur als Parallelverschiebung  des Fahrzeugs (Objektes)  ohne eine Drehung herbeizuführen.
 
vector LinearMotor  =  < Linearmotor.x  , Linearmotor.y  , Linearmotor.z >;
 
Laengskraft: Linearmotor.x - Führt eine Bewegung in Objektachse aus
- Beschleunigungs Impuls vorwärts  ( Linearmotor.x > 0 )
- Brems Impuls rückwärts  ( Linearmotor.x < 0 )
Anwendung als Vortriebsmotor jedes Fahrzeugs.
 
Wer übrigens stehen bleiben will sollte mehrfach Linearmotor.x = 0  an das Fahrzeug übergeben. Das dauert zwar länger, führt aber nicht zum Rückwärtsfahren.
 
Querkraft: Linearmotor.y - Führt eine seitliche Verschiebung quer zur Objektachse durch
- Querverschiebe Impuls nach Links
- Querverschiebe Impuls nach Rechts
Anwendung:  Lokomotiven Schiebebühne, die Lokomotive wird quer zur Schiene zum nächsten Anschlußgleis bewegt.
 
Man muss sich aber zuerst über die reale Bewegung des nachzubauenden Fahrzeugs klar werden.
Zum Beispiel fliegt ein Flugzeug nicht nach links, sondern rollt über die Längsachse (AngularMotor.x) und gibt dann Schub auf der Z Achse (AngularMotor.z).
Wenn man dazu noch die Nase des Jets leicht anhebt (AngularMotor.y) dann sieht es realistisch aus.
Ein Auto hingegen würde nur über die AngularMotor.z Achse gedreht, weil ja die Straße ein fester Untergrund ist.
Nutze ich hingegen Linearmotor.y kann ich das seitliche einschieben einer Ladung mit dem Gabelstapler nachbilden.
 
Steigkraft: Linearmotor.z - Führt eine Parallelverschiebung in Höhenachse des Objektes aus.
- Impuls zum Gewinnen von Höhe
- Impuls zum Verlieren von Höhe
Anwendung zum Beispiel für einen Aufzug.
 
Ausübung der linearen Vektor Kraft:
Wann immer im Script folgender Befehl aufgerufen wird, wird das Fahrzeug neu mit VektorKraft versorgt:
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <laengskraft, querkraft, steigkraft>);
oder in vorheriger Notation:
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, < Linearmotor.x, Linearmotor.y, Linearmotor.z >);
 
Danach setzt ein stetiger Verfall der Kräfte ein. Erfolgt das Auffrischen der Kräfte zu selten, bleibt das Fahrzeug stehen.
Umgekehrt ist aber auch ein zu häufiger Aufruf der Impuls Routinen schädlich weil die Scriptlast hochgeht. Je nach Fahrzeug sollte alle 1 Sekunde ausreichen. Fährt das Fahrzeug nicht sollte die Kraft erhöht werden. Ziel ist ein gut auf Lenkbefehle ansprechendes Fahrzeug das möglichst wenig Last erzeugt.
Damit ein Impuls nicht zu ruckartiger Beschleunigung führt gibt es einen Dämpfungs Mechanismus wie schnell das Fahrzeug auf den Impuls reagiert.
Am besten stellt man sich das mit Bremsen durch Massenträgheit bei Beschleunigung vor. Trotzdem wird irgendwann die eingestellte Höchstgeschwindigkeit erreicht.
Die erzielbare Geschwindigkeit hängt also von der Kraft und der Häufigkeit des Aufrufs ab.
 
ROTATIONSKRÄFTE:
 
Im Gegensatz dazu dient der ANGULAR MOTOR zur Beschreibung der Rotationskräfte.
Auch dieser hat 3 Parameter die jeweils positiv, Null, oder negativ sein können.
 
Mit dem Angular Motor beschreibt man in 3 RotationsAchsen den Impuls um eine entsprechende Drehbewegung auszulösen.
 
Drehung quer zur Längsrichtung:
AngularMotor.x - Führt eine nach links oder rechts zur Objektrichtung verlaufende Drehung durch.
Anwendung: Schlagseite eines Bootes. Seitliches Schwanken eines Brettes auf dem man läuft.
 
Drehung in Längsachse:
AngularMotor.y - Führt eine als Abtauschen oder Auftauchen zu erkennende Drehbewegung des Objektes durch.
Anwendung: Flugzeug Nase anheben für Steigflug, oder Spitze eines Snowbords absenken wenn es bergab geht.
 
AngularMotor.z - Führt eine Drehbewegung eines Objektes nach rechts oder links aus, das als Lenkung eines Autos wahrgenommen wird. Das Auto dreht sich mit.
Anwendung: typische Lenkung eines an Untergrund gebundenen Fahrzeugs.


Versorgt das Fahrzeug mit Drehbewegung:
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, AngularMotor);
 
Auch hier gilt das zu Linearen Vektoren gesagte: Es gibt eine einstellbare Dämpfung bis die Kraft wirkt, und eine einstellbare Nachwirkdauer bis die Kraft auf 0 gefallen ist.
 
Wichtiges Lernziel bei Physik Engines ist das Energie verbraucht wird, und sich automatisch der stabile Ruhezustand wieder einstellt wenn die Energie Zufuhr unterbrochen wird.
 
 
 
Deklaration:
 
vector LinearMotor;      // am besten Global
vector AngularMotor;   // am besten lokal im Control Bereich
 
Vorsicht es ist für das Fahrzeug entscheidend wo die Deklaration erfolgt.
Erfolgt sie global am Scriptanfang, so kann Energie "erhalten" bleiben, und bei der nächsten Tastenauswertung als Restenergie genutzt werden.
Dies ermöglicht reales Anfahren und Auslaufen ohne Abrupte Beschleunigung.
Der LinearMotor Aufruf gehört bei Motorgetriebenen Fahrzeugen mit gleicher Periode aufgerufen. Am besten eignet sich da die Timer Sektion.
 
Bei Lenkbewegung hingegen ist diese Verhalten oft unerwünscht.
Hier empfehle ich die Deklaration des Angular Motors direkt in der "control" Sektion.
Das wirkt wie eine automatische Lenkrad Rückstellung auf statisch geradeaus.
Der AngularMotor Aufruf gehört daher in die Control Routine damit er nur bei tatsächlicher Lenkbewegung erfolgt.
 
Alle diese Empfehlungen gelten für den „Normalfall“. es gibt durchaus Gründe das im Einzelfall anders zu machen.
 
Viel Spaß
 
Tron