NINJA Physics/de

From OpenSimulator

Revision as of 12:59, 3 March 2024 by Manni (Talk | contribs)

Jump to: navigation, search


NINJA Physik: Netzwerkfähige interaktive verbundene Baugruppen für OpenSimulator

Dieses Projekt schlägt eine neue Physikerweiterung namens NINJA Physik vor. Die NINJA Physik-Erweiterung verbessert die ODE-Physik in OpenSimulator mit Gelenken: bewegliche Verbindungen zwischen Prims. Dies ermöglicht es, Fahrzeuge mit Rädern, Ragdolls und mechanische/robotische Baugruppen interaktiv innerhalb des Standard-Betrachters zu erstellen und über Skripte steuerbar zu machen.

Eine Demonstration der Idee ist hier zu sehen: http://jp.youtube.com/watch?v=nirTXPO-opE

NINJA steht für Networked INteractive Jointed Assembly. "Jointed Assembly" bezieht sich auf einen artikulierten starren Körper. Der "INteraktive" Aspekt bezieht sich auf die interaktive Bearbeitung von Gelenkbaugruppen im 3D-Raum mit dem Betrachter und die intuitive 3D-Platzierung von Gelenkobjekten als normale Prims. Der "Netzwerk" -Aspekt bezieht sich auf viele Benutzer, die gleichzeitig mit verbundenen Baugruppen in einer vernetzten virtuellen Welt interagieren.

Der Kern der ODE-Physik-Engine bietet bereits Unterstützung für Gelenke; es sind OpenSimulator und der Betrachter, die keine Unterstützung bieten. Dieses Projekt zielt daher darauf ab, die OpenSimulator-Physikschnittstelle zu erweitern, um auf die ODE-Gelenkfunktionalität zuzugreifen. Darüber hinaus muss dieses Projekt auch eine Möglichkeit bieten, Gelenke innerhalb des Standard-Betrachters zu erstellen und zu bearbeiten, der keine native Unterstützung für Gelenke bietet. In Zukunft können Änderungen am Betrachter und am Protokoll für eine native Gelenkunterstützung in Betracht gezogen werden.

Diese neue Art von Physik, verbundene Physik, ist separat von und ergänzt die vorhandenen Fahrzeuge, die auf LSL-Skripten basieren. Unabhängig von NINJA Physik hat sich kürzlich auch in anderen Bereichen die Aktivität bei auf LSL-Skripten basierenden Fahrzeugen beschleunigt, wobei einige wasserbasierte Fahrzeuge bereits funktionieren (z.B. Segelboote). Die neue verbundene/NINJA-Physik ermöglicht jedoch mehr neue Arten von Fahrzeugen, die derzeit mit Skripten nicht möglich sind. Zwei Beispiele für neue Arten von Fahrzeugen sind Autos mit Rädern, die sich tatsächlich drehen und rotieren, sowie Roboter, die sich durch Bewegung von Gliedmaßen fortbewegen.

Philosophie

Die Entwicklung von NINJA Physik folgt diesen Grundsätzen.

   Nichts kaputt machen. Wenn NINJA Physik ausgeschaltet ist, sollte dies keine beobachtbaren Auswirkungen auf das Simulatorverhalten haben. Wenn es eingeschaltet ist, sollte das vorhandene Physikverhalten ohne Gelenke genau wie zuvor sein. Zusätzlich sollte dem Benutzer neues Physikverhalten mit Gelenken zur Verfügung stehen.
   Kompatibilität mit dem Standardbetrachter. Die Bearbeitung von Gelenken muss nur mit den Möglichkeiten des Standardbetrachters möglich sein. Dies bedeutet, dass wir neue Informationen (Gelenkinformationen) in einer vorhandenen GUI eingeben müssen, die nicht für diesen Zweck entwickelt wurde. Dies geschieht, indem wir vorhandene Primitiv-Editorfelder (Name und Beschreibung) umfunktionieren und eine spezielle Benennungskonvention verwenden, um Gelenke zu spezifizieren. Die Anforderung der Kompatibilität mit dem Standardbetrachter steht leicht im Widerspruch zur Anforderung, nichts zu brechen; durch Verwendung einer speziellen Benennungskonvention ist es möglich, dass bereits vorhandene Regionen diese Benennungskonvention verwenden, was zu geändertem Verhalten führen würde. In der Praxis wird dies wahrscheinlich kein großes Problem sein.
   Code-Lesbarkeit. Die erste Version des NINJA Physik-Patches ist so einfach wie möglich implementiert, um das grundlegende Vorgehen zu verstehen und zu überprüfen. In diesem Stadium wurden keine übermäßig cleveren Optimierungen angewendet und es wurden nur notwendige Abstraktionen vorgenommen.
   Verallgemeinerbarkeit. Die erste Version von NINJA Physik wird unter Verwendung von ODE-Physik implementiert, aber dieselbe Implementierung sollte für jede Physik-Engine, die Gelenke unterstützt, verwendbar sein.

Benutzerdokumentation

Schnellstart

Um NINJA Physik auszuprobieren, befolgen Sie diese Schritte.

   Wenden Sie den Patch ninja-allparts.patch auf Ihren OpenSimulator-Quellcode an und kompilieren Sie ihn. Verfügbar unter http://opensimulator.org/mantis/view.php?id=2874 Ich freue mich berichten zu können, dass NINJA Physik seit r7875 in Trunk-SVN enthalten ist. Aktualisieren Sie Ihr Repository und es sollte verfügbar sein. Wichtiger Hinweis, wenn NINJA Physik bei Ihnen nicht funktioniert: Die NINJA Physik in SVN r7875 sollte funktionieren, erfordert jedoch C# 3.0. Die NINJA Physik in r7878 funktioniert nicht. Wenn Sie SVN r7878 oder höher verwenden, wenden Sie bitte den zusätzlichen Patch in Mantis #2928 unter http://opensimulator.org/mantis/view.php?id=2928 an.


   Kopieren Sie demo-playground.tgz in Ihr opensim/bin-Verzeichnis. Verfügbar unter http://forge.opensimulator.org/gf/download/frsrelease/142/304/demo-playground.tgz 
   Bearbeiten Sie OpenSim.ini, um im Standalone-Modus mit ODE-Physik zu laufen. Setzen Sie use_NINJA_physics_joints=true.
   Starten Sie OpenSim.exe. Geben Sie in der Regionskonsole load oar demo-playground.tgz ein, um Demo-Daten zu laden.
   Melden Sie sich in der Region an und navigieren Sie zu (128,128). Wählen Sie alle Prims im Schaukelobjekt aus (Strg+3, Mausziehen). Wenn Sie eine leistungsstarke CPU haben, können Sie auch alles in der Region auswählen, beachten Sie jedoch, dass die Verarbeitung von Gelenken etwas CPU-Leistung erfordert, sodass Sie möglicherweise eine kleinere Gruppe von Objekten auswählen möchten, um zu beginnen.
   Klicken Sie im Objektbearbeitungsfenster auf das Kontrollkästchen "Physikalisch" im Tab "Objekt", um die Auswahl physisch zu machen, und drücken Sie dann ESC, um den Auswahlmodus zu verlassen. Die Prims und die Gelenke werden "aktiv".
   Klicken Sie auf die verbundene Baugruppe und ziehen Sie sie herum. Außerdem können die folgenden Befehle im Chat die Ragdoll steuern: "erheben", "knien", "sterben".

Definitionen

   Ein Gelenk ist eine Einschränkung der Bewegung starrer Körper. Derzeit betrachten wir zwei Arten von Gelenken: ein Kugelgelenk und ein Scharniergelenk. Ein Kugelgelenk ähnelt dem Gelenk, das Ihren Oberarm mit Ihrer Schulter verbindet; das Gelenk beschränkt die Position der beiden Körper, erlaubt aber eine freie Rotation. Ein Scharniergelenk ähnelt einem Türscharnier: Es beschränkt die Position zweier Körper, erlaubt jedoch nur eine Drehung um eine Achse, die Scharnierachse. Durch Verwendung von Gelenken können wir komplexe Baugruppen von Prims in OpenSimulator erstellen, die sich mit realistisch eingeschränkter Bewegung bewegen.
   Eine verbundene Baugruppe ist im Grunde ein Objekt mit Gelenken. Oder genauer gesagt, mehrere Prims, die durch Gelenke verbunden sind und dann physisch gemacht werden.
   Ein Gelenkproxy-Objekt, auch als Gelenkprim bezeichnet, ist ein Prim, das im Betrachter erstellt und innerhalb der Region vorhanden ist, um ein Gelenk darzustellen. Seine Position relativ zu den von ihm betroffenen Prims definiert die Position, um die die Bewegung der betroffenen Prims eingeschränkt wird. Für Scharniergelenke definiert die Ausrichtung des Gelenkproxy-Objekts die Scharnierachse; speziell wird die x-Achse des Proxy-Objekts als die Achse definiert, um die die verbundenen Prims rotieren dürfen. Ein Gelenkprim beeinflusst die Physiksimulation nur, wenn die Eigenschaft "[x] Physisch" des Gelenkprims aktiviert ist.
   Ein Physik-Engine-Gelenk ist die Datenstruktur innerhalb der Physik-Engine, die tatsächlich das Verhalten der starren Körper in der Simulator simuliert. Das Physik-Engine-Gelenk wird ursprünglich durch den Gelenkprim angegeben und später durch den Gelenkprim visualisiert. 
   Aktivierung/Deaktivierung ist, wenn Sie ein verbundenes Objekt physisch oder nicht physisch machen.

Aktivieren von NINJA Physik in OpenSim.ini

In OpenSim.ini setzen Sie "physics = OpenDynamicsEngine" und "use_NINJA_physics_joints = true".

Erstellen eines Kugelgelenks

Erstellen Sie zwei nebeneinander liegende Box-Prims mit Platz dazwischen. Lassen Sie sie vorerst nicht physisch. Geben Sie jedem einen eindeutigen Namen (Rechtsklick, Bearbeiten, Allgemein, Name). Beispielnamen sind "box1" und "box2". Lassen Sie die Abmessungen bei (0,5, 0,5, 0,5). Diese 2 Prims werden durch ein Kugelgelenk verbunden.

Erstellen Sie eine kleine Kugel. Geben Sie ihm Abmessungen wie zum Beispiel (0,1, 0,1, 0,1). Dieser Prim stellt ein Kugelgelenk dar. Positionieren Sie die Kugel zwischen den 2 Boxen. Weisen Sie der kleinen Kugel den Namen "balljoint-uniquename" zu, wobei "uniquename" ein eindeutiger Name ist, der von keinem anderen Prim verwendet wird. Geben Sie der Kugel eine Beschreibung von "box1 box2", das sind die Namen der 2 Prims, die verbunden werden sollen, getrennt durch ein Leerzeichen.

Schließen Sie alle Fenster im Betrachter. Drücken Sie Strg+3, um in den Bearbeitungsmodus zu gelangen. Ziehen Sie die Maus, um die 2 Boxen und die kleine Kugel zu markieren.

Klicken Sie im Objektbearbeitungsfenster auf das Kontrollkästchen "Physikalisch" im Tab "Objekt".

Ziehen Sie die Boxen herum und beachten Sie, dass sie durch ein Gelenk verbunden bleiben.

Erstellen eines Scharniergelenks

Ein ähnliches Verfahren wird verwendet, um Körper mit Scharniergelenken zu erstellen, mit den folgenden Unterschieden:

Das Gelenkobjekt sollte "hingejoint-uniquename" genannt werden, wobei uniquename ein eindeutiger Name ist, der anderswo in der Region nicht verwendet wird.

Die Position des Gelenkobjekts bestimmt den Anker des Scharniers.

Die X-Achsen-Ausrichtung des Gelenkobjekts bestimmt die Drehachse des Scharniers. Die einfachste Möglichkeit, dies zu visualisieren, besteht darin, ein Prim zu erstellen, dessen Größe entlang seiner x-Achse verlängert ist. Legen Sie die Objektgröße direkt im Objekt-Editor auf etwas wie (1,0, 0,1, 0,1).

Scharniere können verwendet werden, um Räder zu simulieren. Verbundene Körper können sich frei um das Scharnier drehen, wie ein Rad um eine Achse.

Aktivieren und Deaktivieren von Körpern und Gelenken

Wenn Sie ein Gelenkproxy-Objekt auf "physisch" setzen, wird dieses Gelenk in der Physik-Engine erstellt. Wenn das Gelenkproxy-Objekt nicht physisch ist oder gelöscht wird, wird das entsprechende Gelenk in der Physik-Engine gelöscht. (Deshalb muss jedes Gelenk einen eindeutigen Namen haben, damit die Physik-Engine weiß, auf welches Gelenk verwiesen wird.) Das Löschen von Gelenken in einer aktiven verbundenen Baugruppe führt dazu, dass die verbundenen Körper getrennt werden. Löschen, Deaktivieren oder Nehmen eines Prims in einer aktiven verbundenen Baugruppe führt dazu, dass alle mit diesem Prim verbundenen Gelenke deaktiviert werden.

Fehlerbehebung

   Gelenkfehlermeldungen werden in der Welt wie Skriptcompilerfehler angezeigt. Wenn Sie beispielsweise ein Scharniergelenk erstellen (indem Sie einen Prim "hingejoint-uniquename" benennen), aber nicht existierende oder nicht-physische Körpernamen im Beschreibungsfeld angeben, kann das Gelenk nicht erstellt werden, und ein Warnsymbol wird in der Welt oben auf dem Gelenk angezeigt. Klicken Sie auf das Warnsymbol, um die Fehlermeldung anzuzeigen. Deaktivieren Sie das Gelenk, korrigieren Sie es und aktivieren Sie es erneut.
   Duplizierte Gelenknamen verursachen Probleme. Wenn Sie wiederholt Fehler mit einem Gelenk erhalten, ist es möglich, dass ein anderer Prim irgendwo in der Region denselben Namen hat. Versuchen Sie, den Namen des Gelenkproxy-Objekts zu ändern. Sie sollten den Namen nur ändern, wenn das Gelenk deaktiviert ist.
   Duplizierte Primnamen verursachen Probleme. Wenn Sie wiederholt nicht in der Lage sind, einen Prim mit einem Gelenk zu verbinden, ist es möglich, dass ein anderer Prim irgendwo in der Region denselben Namen hat und dass das Gelenk mit diesem Prim anstelle des gewünschten verbunden wird. Versuchen Sie, den Namen des zu verbindenden Prims zu ändern. Sie sollten den Namen nur ändern, wenn der Prim deaktiviert ist.

Tipps für die effektive Verwendung von Gelenken

   Das Gelenkproxy-Objekt selbst kollidiert mit nichts und hat keine geometrische Darstellung in der Physikszene. Technisch gesehen werden Gelenke in der Physik-Engine als mathematische (Gleichheits- oder Ungleichheits-) Einschränkungen der Position und/oder Geschwindigkeit starrer Körper implementiert, sodass sie den zulässigen Bereich des Lösungsraums des starren Körper-Simulators einschränken, aber selbst keinen Platz einnehmen.
   Während das Gelenkproxy aktiv (physisch) ist, können Sie das Gelenkproxy nicht direkt physisch manipulieren (indem Sie es im Betrachter ziehen oder durch Skriptphysik). Wenn es aktiv ist, folgt seine Position immer automatisch der Position der verbundenen Körper.
   Durch Gelenke verbundene Prims kollidieren nicht miteinander.
   Durch Gelenke verbundene Prims können sich überschneiden, sodass sie sich oben auf dem Gelenkproxy-Objekt und übereinander befinden und das Gelenkproxy-Objekt effektiv verdecken.
   Sie können das Gelenkproxy-Objekt auch sehr klein oder transparent machen, um es zu verstecken.
   Wenn Sie das Gelenkproxy verbergen, kann es schwierig sein, Fehler zu debuggen, wenn etwas schief geht. Verbergen Sie Gelenke erst, nachdem Sie überprüft haben, dass die Gelenke ordnungsgemäß erstellt wurden.
   Durch Gelenke verbundene Prims sollten wahrscheinlich einfache Formen wie Boxen oder Kugeln für einfachere Kollisionen sein. Komplexe Formen mit Verdrehungen oder Schnitten führen zur Erstellung konkaver Meshs mit scharfen Ecken, die möglicherweise nicht reibungslos (was zu Flackern führt) oder schnell kollidieren. Leider scheint es nicht möglich zu sein, ODE-Kapseln (die oft für Ragdoll-Gliedmaßen verwendet werden) für die Kollisionserkennung zu verwenden, da es keine Möglichkeit gibt, eine "Kapsel"-Geometrie für einen Prim im Betrachter anzugeben.
   Um eine verbundene Baugruppe in den Bestand zu nehmen:
   ** Alle auswählen
   ** Deaktivieren
   ** Verknüpfen
   ** Nehmen
   Um eine verbundene Baugruppe aus dem Bestand zu rezitieren:
   ** Aufstellen. Stellen Sie dieselbe verbundene Baugruppe nicht mehr als einmal auf, da sonst Prims und Gelenke mit duplizierten Namen vorhanden sind, was zu unerwartetem Verhalten führt, da die Gelenke nicht wissen, welche der duplizierten Prims sie verbinden sollen.
   ** An die gewünschte Stelle bewegen
   ** Trennen
   ** Alle auswählen
   ** Aktivieren
   Reibung, Kollisionsrückprall und Kollisionsfilterungseinstellungen in OpenSim.ini können für unterschiedliche Effekte angepasst werden.
   Workflow zum Erstellen einer komplexen verbundenen Baugruppe
   ** Einige Prims erstellen
   ** Einige Gelenke erstellen
   ** Alle auswählen
   ** Bei gehaltener Auswahl auf "[x] Physikalisch" klicken, um die Physik zu aktivieren
   ** Bei gehaltener Auswahl prüfen, ob Fehlermeldesymbole für Gelenke angezeigt werden
   ** Bei gehaltener Auswahl auf "[ ] Physikalisch" klicken, um die Physik auszuschalten
   ** Alle Gelenkfehlermeldungen beheben, die für die betrachtete Gruppe von Prims aufgetreten sind, und weiter konstruieren

Entwicklerdokumentation

Patchstruktur

Der Patch für NINJA Physics ist in 6 Teile unterteilt, um die Lesbarkeit zu verbessern.

Teil 1: Datenstruktur für Gelenke

Der Patch erweitert den Datenbereich von OpenSimulator, um Gelenkinformationen zu speichern, einschließlich Typ, Position, Ausrichtung und die betroffenen Körper. Das ist es.

Teil 2: Parser für Gelenkbeschreibung

Der Patch erweitert den OpenSimulator-Parservorgang, um Gelenkbeschreibungen zu erkennen und in die Datenstruktur zu übersetzen. Dies ist einfach eine Erweiterung des bestehenden Textparsers.

Teil 3: Implementierung der Gelenkverbindung

Der Patch fügt OpenSimulator-Objekte hinzu, die Gelenkverbindungen zwischen Prims darstellen. Diese Objekte enthalten lediglich Verweise auf die betroffenen Prims und die Gelenkdaten, die sie aus den Datenbereichen erhalten.

Teil 4: Erstellung von Gelenken

Der Patch fügt den OpenSimulator-Betrachter hinzu, um Gelenkobjekte zu erstellen und zu manipulieren. Dies erfordert eine GUI-Erweiterung, um Gelenkdaten wie Position und Ausrichtung einzugeben. Die vorhandene GUI wurde erweitert, um eine spezielle Benennungskonvention zu verwenden, um die Gelenkdaten im Textfeld "Name" einzugeben.

Teil 5: Aktivierung/Deaktivierung von Gelenken

Der Patch fügt OpenSimulator-Objekten eine Schaltfläche hinzu, um Gelenke zu aktivieren oder zu deaktivieren. Dies ist einfach eine GUI-Erweiterung, um eine Schaltfläche anzuzeigen und Ereignishandler hinzuzufügen, um auf Klicks zu reagieren.

Teil 6: Physiksimulation von Gelenken

Der Patch fügt OpenSimulator-Objekten eine Schaltfläche hinzu, um Gelenke zu aktivieren oder zu deaktivieren. Dies ist einfach eine GUI-Erweiterung, um eine Schaltfläche anzuzeigen und Ereignishandler hinzuzufügen, um auf Klicks zu reagieren.

Architektur

Die ODE-Physik-Engine in OpenSimulator verwendet eine sogenannte Szenenabbildung, um den physikalischen Zustand der Welt zu verwalten. Die Szenenabbildung besteht aus einer Hierarchie von Körpern, wobei jeder Körper eine Geometrie und eine physikalische Beschreibung hat. Körper sind entweder inaktiv (keine Kollisionserkennung oder -reaktion) oder aktiv (Kollisionserkennung und -reaktion). Körper werden über ein Netzwerk von Gelenken (physikalischen Einschränkungen der Bewegung) miteinander verbunden. In der ODE-Physik-Engine ist jedes Gelenk als Paar von Körpern spezifiziert, die eingeschränkt sind, sowie als Position, Ausrichtung und Torsionsbeschränkungen für jedes Paar.

Der Betrachter verwendet eine einfache Beschreibungssprache, um Körper und Gelenke zu erstellen und zu bearbeiten. Der Betrachter stellt den physikalischen Zustand der Welt nicht dar, sondern sendet Befehle an den Simulator, um Körper und Gelenke in der Szenenabbildung zu erstellen und zu bearbeiten.

Der Patch fügt die Möglichkeit hinzu, Gelenke zu erstellen und zu bearbeiten, indem der Betrachter eine GUI-Erweiterung erhält, um Gelenkdaten wie Position und Ausrichtung einzugeben. Die vorhandene GUI wurde erweitert, um eine spezielle Benennungskonvention zu verwenden, um die Gelenkdaten im Textfeld "Name" einzugeben.

Die ODE-Physik-Engine wird um die Möglichkeit erweitert, Gelenke zu aktivieren und zu deaktivieren, indem sie ein Netzwerk von Gelenken darstellt und die Physiksimulation gemäß den Gelenkeinschränkungen aktualisiert.

Ausblick

Die erste Version von NINJA Physik konzentriert sich auf die Interaktion mit Gelenken in einer Einzelspieler-Umgebung. Zunächst wird das Feature in OpenSimulator und OpenSimulator-Betrachter implementiert.

Die nächsten Schritte sind:

   Vernetzte Physik: Gelenke über das Netzwerk teilen, sodass mehrere Benutzer gleichzeitig mit verbundenen Baugruppen in einer vernetzten virtuellen Welt interagieren können.
   Verbesserte Gelenke: Implementierung zusätzlicher Gelenktypen wie Kugelscharnier, Universalgelenk und Schieberegler.
   Leistungsoptimierung: Die Physiksimulation für Gelenke ist noch nicht optimiert und kann in komplexen Szenen langsamer werden.
   Robustheit: NINJA Physics enthält wahrscheinlich noch viele Fehler. Jedes einzelne Gelenk und jedes einzelne Szenario sollte getestet und Fehler behoben werden.
   Entwicklerdokumentation: Dieses Dokument sollte in der offiziellen OpenSimulator-Dokumentation konsolidiert werden.
   Benutzerdokumentation: NINJA Physics sollte eine vollständige Benutzerdokumentation haben, die auch in der offiziellen OpenSimulator-Dokumentation konsolidiert werden sollte.
   Standard-Skriptbibliothek: Ein Set von Skripten, das von den Benutzern zum Erstellen von Fahrzeugen, Ragdolls und anderen verbundenen Baugruppen verwendet werden kann.
   Integration in OpenSimulator-Website und -Foren: NINJA Physics sollte einen eigenen Bereich auf der OpenSimulator-Website und -Foren haben, damit die Benutzer Fragen stellen und Antworten erhalten können.

Abschluss

NINJA Physics ist ein neues, experimentelles Feature für OpenSimulator. Es ermöglicht es, verbundene Baugruppen mit realistischer, eingeschränkter Bewegung in OpenSimulator zu erstellen. Es gibt noch viele Funktionen, die hinzugefügt werden müssen, aber das grundlegende Konzept ist vorhanden.

Ich freue mich darauf, mit der OpenSimulator-Community zusammenzuarbeiten, um dieses Feature zu testen und zu verbessern.

Links

Personal tools
General
About This Wiki