This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

Fahrzeug Scripting in Opensim und SL GRUNDLAGEN
#1
Diese Info dient dem Grundverständnis, wie physisch bewegte Objekte / Fahrzeuge in Opensim und SL funktionieren.


 
Es ist nicht das Ziel, einen Programmierkurs zu halten.
 
 
Was Sie für das Scripting benötigen, finden Sie im Secondlife-Wiki - "http://wiki.secondlife.com/wiki/LSL_Portal", jedoch fehlt eine Anleitung zum Verständnis. Diese Lücke versuche ich jetzt hier zu schließen.
 
 
Grundlagen des Antriebs- und Steuerungsprinzips:
 
In Opensim / SL gibt es keine echte Physik, die ein Fahrzeug realistisch bewegt. Sie müssen sicherstellen, dass sich dieses Fahrzeug so verhält.
 
Beispiele:
 
- Es gibt keine echte Reibung und keine Seitenführung: Ein Open-Sim-Reifen eines Autos übt in der Kurve keine Seitenkraft aus, um das Fahrzeug in der Spur zu halten.
- Es gibt keinen wirklichen Auftrieb im Wasser: Ein Boot sinkt auf den Grund der Sim oder bis auf ein anderer Hinderniß, wenn Sie dies nicht im Skript durch entsprechende Motorparameter verhindern.
 
Dies sind nur 2 Beispiele, aber sie zeigen das Dilemma, wenn Sie schnell etwas bauen möchten, das beweglich, fliegend usw. ist.
 
Da es keine Reibung gibt, benötigen Sie keine rollenden Reifen, um sie zu minimieren. Eine Umstellung, wenn Sie aus der realen Welt kommen.
Für Opensim reicht für die Bewegung ein Primwürfel in grober Form für die Kollision.
Dieser ist genauso vielseitig wie die Tampons, die vor 20 Jahren in der Fernsehwerbung beschrieben wurden. Es kann zum Reiten, Schwimmen, Auto- und Bootfahren, Fliegen, ... verwendet werden.
 
Rootprim:
 
Das Rootprim (in einem Linkset das Prim mit der Linknummer 1) stellt den (meist transparenten) Grundbaustein aller Fahrzeuge dar. Dieses enthält die Fahrskripte, Animationen und vieles mehr.
Was Sie dagegen sehen, ist ein verknüpftes Mesh. Das nur der Optik dient, und dringend per Skript auf Phantom gestellt werden muss.
 
In diesem Zusammenhang muss unbedingt auf die absolute Minimierung der Kollisionbestimmenden Physikhülle hingewiesen werden, wenn man ein gut beherrschbares Hochleistungsfahrzeug schaffen will. Wer mit einem Würfel mit schrägen Frontflächen auskommt, hat hier die beste Wahl getroffen.
 
Da eine Bewegung als Schieben eines Würfels auf einer Oberfläche stattfindet, ist es wichtig, dass die Kanten nicht hängen bleiben. Infolgedessen sehen die meisten Formen der Physik wie ein Schlitten aus.
Schauen wir uns nun die Bewegung dieses "Prim Würfel"-Fahrzeugs an:
 
 
BEWEGUNG:
 
- Physische Objekte werden periodisch mit Impulsen versorgt, die eine gewünschte Bewegung bewirken sollen.
Dies lässt sich am besten mit einer Impulskraft beschreiben, die in 6 verschiedene Richtungen ausgeübt werden kann. Jede Kraft kennt 2 mögliche Richtungen.
 
 
 
VEKTORKRÄFTE:
 
Zuerst gibt es die 3 Vektorkräfte im kartesischen Koordinatensystem - also X-, Y-, Z-Achse. Diese wirken als Vektoren bezogen auf die Orientierung des Fahrzeugs.
Da jeder Vektor positiv, null oder negativ sein kann, können 6 Kräfte (jeweils bezogen auf die Ausrichtung des Fahrzeugs) erzeugt werden:
Die Vektorkräfte werden am LINEARMOTOR eingestellt.
Alle diese Vektorkräfte wirken nur als Parallelverschiebung des Fahrzeugs (Objekts) ohne eine Drehung zu verursachen.
 
 
Längskraft: Linearmotor.x - Führt eine Bewegung in der Objektachse aus
- Beschleunigungsimpuls vorwärts (Linearmotor.x> 0)
- Bremsimpuls rückwärts (Linearmotor.x <0)
Einsatz als Antriebsmotor für jedes Fahrzeug.
 
Wenn Sie anhalten möchten, sollten Sie Linearmotor.x = 0 mehrmals an das Fahrzeug übergeben. Das dauert länger, führt aber nicht zum Rückwärtsfahren.
 
Querkraft: Linearmotor.y - Führt eine Querverschiebung über die Objektachse aus
- Schubkraft für Parallelverschiebung nach links
- Schubkraft für Parallelverschiebung nach rechts
Anwendung: Lokomotivschiebebühne, die Lokomotive wird über die Schiene zum nächsten Abstellgleis seitlich bewegt.
Eine weitere Anwendung wäre eine Schiebetüre. Allerdings würde man die einfacher realisieren als mit einem physischen Objekt.
 
 
Zuerst muss man sich über die wirkliche Bewegung des zu bauenden Fahrzeugs im Klaren sein.
Ein Flugzeug fliegt beispielsweise nicht nach links, sondern rollt über die Längsachse (AngularMotor.x) und gibt dann Schub auf der Z-Achse (AngularMotor.z).
Hebt man zusätzlich die Nase des Jets leicht an (AngularMotor.y), dann sieht es realistisch aus.
Ein Auto hingegen würde nur auf der AngularMotor.z-Achse gedreht werden, da die Straße fester Untergrund ist.
Wenn ich jedoch einen Linearmotor verwende, kann ich das seitliche Einschieben einer Last mit einem Gabelstapler simulieren.
 
Hubkraft: Linearmotor.z - Führt eine Parallelverschiebung in der Höhenachse des Objekts durch.
- Impuls, um an Höhe zu gewinnen
- Impuls zum Senken
Anwendung zB für einen Aufzug.
 
 
Anwendung der linearen Vektorkraft:

Immer wenn im Skript folgender Befehl aufgerufen wird, wird das Fahrzeug mit Vektorkraft versorgt:
 
llSetVehicleVectorParam (VEHICLE_LINEAR_MOTOR_DIRECTION, <Längskraft, Querkraft, Auftriebskraft>);
oder in vorheriger Schreibweise:
 
llSetVehicleVectorParam (VEHICLE_LINEAR_MOTOR_DIRECTION, <Linearmotor.x, Linearmotor.y, Linearmotor.z>);
 
Danach nehmen die Kräfte stetig ab. Werden die Kräfte nicht häufig genug aufgefrischt, stoppt das Fahrzeug.
 
Umgekehrt ist auch ein zu häufiges Aufrufen der Impulsroutinen schädlich, da die Skriptlast steigt. Je nach Fahrzeug sollte je 1 Sekunde zwischen Vektorimpuls Aufrufen ausreichen.
Wenn sich das Fahrzeug nicht bewegt, sollte der Vektorbetrag erhöht werden. Ziel ist ein Fahrzeug, das gut auf Lenkbefehle reagiert und möglichst wenig Last erzeugt.
 
Damit ein Impuls nicht zu einer ruckartigen Beschleunigung führt, gibt es einen Dämpfungsmechanismus, wie schnell das Fahrzeug auf den Impuls reagiert.
 
Das kann man sich am besten mit einer Trägheitsbremse beim Beschleunigen vorstellen. Trotzdem wird die eingestellte Höchstgeschwindigkeit irgendwann erreicht. Die erreichbare Geschwindigkeit hängt von der Stärke und Frequenz des Anrufs der Vektorimpulse ab.
 
 
ROTATIONSKRÄFTE:
 
Im Gegensatz dazu wird der ANGULARMOTOR verwendet, um die Rotationskräfte zu beschreiben.
Dieser hat auch 3 Parameter, von denen jeder positiv, null oder negativ sein kann.
 
Der Angularmotor beschreibt den Impuls in 3 Drehachsen um eine entsprechende Drehbewegung auszulösen.
 
Drehung quer zur Längsrichtung:
AngularMotor.x - Dreht nach links oder rechts in Richtung des Objekts.
Anwendung: Schwanken/Kränken eines Bootes quer zur Längsachse im Wellengang. Seitliches Schwanken eines Brettes, auf dem man läuft.
 
Drehung in der Längsachse:
AngularMotor.y - Führt eine Drehbewegung des Objekts aus, die als Tauchen oder Auftauchen sichtbar wird.
Anwendung: Flugzeugnase zum Steigflug anheben oder Snowboardspitze beim Bergabfahren absenken, oder U-Boot tauchen und auftauchen lassen.
 
AngularMotor.z - Dreht ein Objekt nach rechts oder links, das als Lenkung eines Autos wahrgenommen wird. Das Auto dreht sich mit.
Anwendung: Typische Lenkung eines Bodengebundenen Fahrzeugs. (Auto, Lokomotive, Schlitten,…)


Anwendung der Rotationskräfte:

Immer wenn im Skript folgender Befehl aufgerufen wird, wird das Fahrzeug mit Rotationskraft/Drehmoment versorgt:
 
llSetVehicleVectorParam (VEHICLE_ANGULAR_MOTOR_DIRECTION, AngularMotor);
 
Oder in einer anderen Darstellung zum besseren Verständnis:
llSetVehicleVectorParam (VEHICLE_ANGULAR_MOTOR_DIRECTION, < AngularMotor.x, AngularMotor.y, AngularMotor.z>;
 
Gleiches gilt hier für lineare Vektoren: Es gibt eine einstellbare Dämpfung bis die Kraft wirkt und eine einstellbare Nachwirkzeit bis die Kraft auf 0 abgefallen ist.
 
 
 
Programiertipps:
 
 
Ort der Deklaration im Script:
 
Vektor LinearMotor; // vorzugsweise global am Scriptanfang
Vektor AngularMotor; // am besten lokal in der Regelschleife der Tastaturabfrage
 
Achtung es ist entscheidend für das Fahrzeug, wo die Deklaration erfolgt.
Tritt sie global am Anfang des Skripts auf, kann Energie "gehalten" werden und beim nächsten Aufruf als Restenergie verwendet werden.
Dies ermöglicht echtes Anfahren und Anhalten ohne abruptes Beschleunigen.
 
Der LinearMotor-Aufruf gehört bei motorbetriebenen Fahrzeugen mit gleicher Periode aufgerufen. Daher ist der Timer-Bereich dafür am besten geeignet.
 
 
Andererseits ist dieses Verhalten bei Lenkbewegungen oft unerwünscht.
Hier empfehle ich die Deklaration des AngularMotors direkt in der Rubrik "Steuerung" (Keybordauswertung in Control Routine).

Dies wirkt wie eine automatische Lenkradrückstellung auf statisch geradeaus, sobald keine weitere Lenkung erfolgt.
Der AngularMotor-Aufruf gehört daher in die Control routine, so dass er nur erfolgt, wenn die Lenkung tatsächlich in Benutzung ist.
 
Alle diese Empfehlungen gelten für den „Normalfall“. es gibt Gründe, dies im Einzelfall anders zu machen.
 
 
 
Viel Spaß

 
Tron
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste