Wie ich bei Unigine Radphysik gesammelt habe

Guten Tag.

Dieses Mal werden wir über den russischen Unigine-Motor sprechen und wie man eine einfache Maschine darin zusammenbaut. Das Schema ist nicht ideal, da ich es in einigen Dingen nicht herausgefunden habe, aber zumindest werde ich meine Erfahrungen teilen.



Um zu verstehen, wie die Physik von Rädern funktioniert, gehen wir zunächst zur offiziellen Dokumentation und finden dieses Beispiel .

Beachten Sie übrigens, dass dies ein Beispiel für ein Radgelenk ist, aber aus irgendeinem Grund unter der Adresse / car_suspension_joints / liegt. Sie müssen auch sicherstellen, dass die Dokumentation nicht zu den alten Versionen springt (dh, dass DOCS (2.11) geöffnet ist) und das Feld „C #“ oben auf dem Artikel markieren.

Nachdem wir das Beispiel untersucht haben, sehen wir, dass es in Analogie zur frühen C ++ - Lösung geschrieben wurde. Das heißt, alles wird durch Code erstellt. Soviel zur visuellen Programmierung, wir sind angekommen. Nun, nicht alles ist so traurig, aber Sie können sehen, wie das alles im Code gemacht wird. Nachdem Sie die Links ausgeführt haben, erhalten Sie eine allgemeine Vorstellung von den Einstellungen des Radgelenks und der Physik.
( ). , -, UnigineScript, . LOD'.
Natürlich erwartete ich eine vorgefertigte Schritt-für-Schritt-Anleitung zur visuellen Montage, um etwas ins Rollen zu bringen, was wenig Blut kostet. Infolgedessen musste ich immer noch mit meinem Kopf in alles eintauchen, um eine ungefähre Pipeline zu erarbeiten. Dies gelang teilweise, aber es war weit davon entfernt, an allen Punkten verstanden zu werden, und es bleiben Fragen offen, zum Beispiel, ob das Gehäuse und die Radknoten in eine bestimmte Hierarchie eingebaut werden sollten, ob die Achsen der Punkte korrekt ausgerichtet sind und so weiter.

Im Allgemeinen hilft Ihnen diese Anleitung dabei, das Grundprinzip zu verstehen. Um jedoch die Feinheiten der Einstellungen zu verstehen, müssen Sie die Dokumentation noch studieren (oder sie werden Ihnen in den Kommentaren etwas Nützliches mitteilen).

Rahmenkonstruktion


1. Erstellen Sie ein neues Projekt. Wählen Sie die Option C #. Öffnen Sie das Projekt im Editor.







2. Wir schaffen die Basis der Maschine.

Klicken Sie dazu mit der rechten Maustaste in die Szene und wählen Sie Erstellen > Grundelement > Feld . Das Ergebnis ist ein quaderförmiges Objekt . Heben Sie es leicht über den "Boden".



3. Wir schaffen Räder.

Klicken Sie erneut mit der Maus und wählen Sie Erstellen > Grundelement > Zylinder . Es dauert 4 Stück.



Um nicht mit der Ausrichtung verwechselt zu werden, können Sie die Kamera so drehen, dass -Y im Würfel von oben leuchtet (das heißt, wir betrachten jetzt die zukünftige Maschine von hinten) und zwei Zylinder hinter Cuboid platzieren, zwei weitere davor. Irgendwie ist es nicht notwendig, sie zu drehen und anzupassen. Der Einfachheit halber können hinten und vorne unterschiedliche Farben zugewiesen werden.

4. Physikbasiert hinzufügen.

Wählen Sie Quader und wechseln Sie links im Fenster Parameter auf der Registerkarte Knoten zu Physik . Wählen Sie in der Spalte Body den Typ Rigid aus . Scrollen Sie danach nach unten und wählen Sie das Feld Feld in der geöffneten Spalte Formen aus .





Wir sehen die erschienene ShapeBox. Wir gehen in die Einstellungen und stellen unsere Basis sofort auf die empfohlene Masse ( Masse ) von 64 Kilogramm ein.



5. Fügen Sie den Rädern Physik hinzu.

Im Gegenzug wählen Sie die Zylinder und sie auch setzen Starre in der Physik Registerkarte.
Sie müssen keine Form erstellen, da die Radverbindungen bei Rakcasts funktionieren.

6. Binden Sie die Räder an die Basis.

Zeit, Radgelenke zuzuweisen. Wählen Sie dazu richtig Quader aus und scrollen Sie auf der Registerkarte Physik zur Spalte Gelenke . Wählen Sie in der Liste Rad aus. Wenn Sie auf die Schaltfläche Hinzufügen klicken, wird das Fenster Körper auswählen angezeigt. Wenn Sie einen Zylinder auswählen, wird dieser in der Szene mit einem weißen Gitter hervorgehoben, und drücken Sie OK. Eine WheelJoint- Bindung wird in der Liste angezeigt . Hier ist es bereits wünschenswert, sie umzubenennen (dazu müssen Sie auf die Zeile JointWheel klicken und einen neuen Namen in die Spalte Name schreiben).





Befestigen Sie auf die gleiche Weise die verbleibenden Zylinder am Quader. Damit am Ende auf seiner Punkteliste 4 Linien brannten.


Ohne Umbenennung gibt es 4 Zeilen WheelJoint.

Bitte beachten Sie, dass Sie von Cuboid und nicht von der Registerkarte Physik der Zylinder selbst binden müssen. Wenn Sie anschließend einen bestimmten Zylinder auswählen und zu seiner Physik wechseln, wird dort auch die erstellte Verbindung angezeigt, und Sie können seine Parameter bearbeiten.

7. Richten Sie die Konfiguration der Bindungen ein.

Wählen Sie erneut Quader, suchen Sie in Physik eine Liste seiner Punkte und wählen Sie einen davon aus. Wir sehen, dass eine weiße Ecke mit Quadraten in der Szene innerhalb von Cuboid erschien.
In den Einstellungen des Gelenks finden wir den Graphen des Vektorankers 0 und passen die Werte seiner drei Felder so an, dass diese Ecke entlang der X-Achse außerhalb des Quaders verschoben und entlang der Z-Achse leicht abgesenkt wird.





Dann verschieben wir die Ecke entlang der Y-Achse, abhängig von der Bindung welches Rad aktuell ausgewählt ist.

Wir wiederholen den Vorgang mit den restlichen Punkten und stellen genau die gleichen Verschiebungen entlang Z und die gleichen, aber multidirektionalen entlang der anderen Achsen ein.

Wenn Sie alle Punkte gleichzeitig auswählen, wird das Gesamtdesign sichtbar. Sie können die Anzeige von Gelenken in Helfern auch in einem speziellen Bereich über der Szene aktivieren: Helfer> Physik > Gelenke .


Rückansicht des Rahmens mit den mitgelieferten Helfern

8. Wir schauen uns an, was passiert ist.

Im Editor befindet sich eine Schaltfläche zur Berechnung der Physik. Wenn Sie es aktivieren, startet eine Simulation der Physik (die Skripte funktionieren nicht) und Sie können überprüfen, wie sich unser Frankenstein verhält.
Stellen Sie vor dem Start sicher, dass die aktivierten Kontrollkästchen für Kollision und Physikschnittpunkt in den Einstellungen "Etage" aktiviert sind . Andernfalls kann unsere Kreation vollständig unter dem Boden oder nur mit Rädern versagen.



Seien Sie vorsichtig, bevor Sie die Simulation einschalten. Es ist besser, sie zu speichern, und die während des Betriebs korrigierten Parameter kehren nach dem Trennen der Verbindung zu ihren Werten zurück.

Wie wir sehen, werden die Räder an den richtigen Stellen aufgenommen, aber die Struktur fällt mit den Enden der Zylinder auf die Oberfläche.



Sie können Cuboid selbst einfrieren, indem Sie zuerst das Kontrollkästchen Unbeweglich auf der Registerkarte Physik in der Spalte Körper aktivieren.

9. Stellen Sie die Achsen der Räder ein.

Deaktivieren Sie die Physiksimulation. Wählen Sie Quader, gehen Sie zur Registerkarte Physik und bearbeiten Sie die Achsen 00 , Achse 10 und Achse 11 für jede Kreuzung . Bitte beachten Sie, dass in der Summe der Felder jedes Vektors Werte von 0 bis 1 angenommen werden und der Editor versucht, die Werte automatisch zu korrigieren, wenn Sie zuerst 1 in eine neue Achse einfügen, ohne den Vektor auf Null zu setzen.

Anscheinend habe ich die Vektoren noch nicht richtig entwickelt, die Helfer zeigen, dass der linke und der rechte Teil in die gleiche Richtung schauen, aber sie geben kein klares Verständnis darüber, welche Achse wo ist, was die Abstimmung schwierig macht.

In jedem Fall funktioniert dieses Layout weniger oder weniger. Hier stelle ich die Achsenvektoren wie folgt ein: Achse 00 ( 0 , 0 , 1 ), Achse 10 ( 1 , 0 , 0 ), Achse 11 ( 0 , 0 , 1 ).



Wenn Sie jetzt eine Physiksimulation starten, sollte das Design auf korrekt gedrehte Zylinder fallen, die sich anschließend entlang der richtigen Achse drehen.

10.Radmasse und Verhalten, physikalische Iterationen.

Höchstwahrscheinlich versagt die Struktur nach dem Herunterfallen teilweise.

Lassen Sie uns zunächst auf die allgemeinen Einstellungen der Physik eingehen. Wir klicken auf die oberste Zeile des Editors. Windows > Einstellungen und auf der sich öffnenden Registerkarte Einstellungen finden Sie die Spalte Physik (Laufzeit / Welt /). Wir haben mindestens 5 im Feld Iterationen festgelegt . Wieder gehen wir auf die Einstellungen jedes Gelenks ein. Am Anfang der Liste hat jeder ein Iterationsfeld , Satz 8 . Lineare Restitution und Angular Restitution auf 0,1 eingestellt . Linear von






ändere -0,15 , linear bis auf 0,15 .
An der Unterseite befestigen wir sie mit einer Masse von 25 kg im Rad Masse Feld .

Wenn die Simulation startet, muss die physikalische „Maschine“ immer noch teilweise ausfallen / ausfallen.

Stellen Sie jede lineare Dämpfung auf 50 ein . Und setzen Sie die lineare Feder auf 10 .
Jetzt sollte die Struktur während der Simulation fallen und leicht auf den Boden springen. Wenn dies nicht funktioniert, experimentieren Sie mit den Werten für lineare Dämpfung und lineare Feder.
In der Dokumentation wird empfohlen, die Dämpfung 400 und die Feder 100 einzustellen. Gleichzeitig dreht sich die „Maschine“ wie ein Hubschrauber, springt und fliegt davon.

11. Die endgültige Einstellung des Rahmens.

Speichern Sie und versuchen Sie, auf Wiedergabe zu klicken (die Schaltfläche oben neben der physischen Simulation), um die Szene in der ersten Person zu durchlaufen. Höchstwahrscheinlich hing die „Maschine“ ein wenig in der Luft, rollt aber, wenn sie in den zentralen Würfel gedrückt wird.



Jetzt können Sie Anker 0 an den Punkten so einstellen , dass sie ungefähr gleich weit von der Mitte entfernt sind (obwohl dies nicht erforderlich ist). Starten Sie dann die Simulation und ändern Sie die lineare Feder direkt während der Simulation , um den optimalen Wert zu ermitteln, bei dem jedes Rad normalerweise den Boden berührt.

Nach all diesen Manipulationen sollte eine „Maschine“ korrekt auf den Boden fallen, die beim Drücken im Spielmodus leicht rollt, wobei Sie standardmäßig auf einem separaten Controller mit einer Ansicht aus der ersten Person ausgeführt werden.



Schreiben eines Kontrollskripts



Wir haben ein Leerzeichen der "Schreibmaschine", jetzt schreiben wir einen Steuercode dafür in C #.
Klicken Sie dazu mit der rechten Maustaste in das Fenster unter der Szene und wählen Sie Erstellen > C # -Komponente erstellen . Geben Sie den Namen des Skripts in das angezeigte Fenster ein.





Doppelklicken Sie auf die angezeigte Skriptdatei und die Entwicklungsumgebung wird gestartet.



Wählen Sie die mit Blau gefüllten Zeilen im Bild aus, löschen Sie sie und fügen Sie stattdessen den folgenden Code hinzu, mit dem ich das in der Dokumentation vorgeschlagene Skript bearbeitet habe:

Skript-Snippet
	[ShowInEditor][Parameter(Tooltip = "Left Wheel")]
	private Node targetWheelL = null;
	[ShowInEditor][Parameter(Tooltip = "Right Wheel")]
	private Node targetWheelR = null;

	[ShowInEditor][Parameter(Tooltip = "Left Wheel F")]
	private Node targetFWL = null;
	[ShowInEditor][Parameter(Tooltip = "Right Wheel F")]
	private Node targetFWR = null;

	[ShowInEditor][Parameter(Tooltip = "theCar")]
	private Node targetCar = null;

    private JointWheel my_jointL;
    private JointWheel my_jointR;
    private JointWheel my_jointFL;
    private JointWheel my_jointFR;

	Controls controls = null;
	float angle = 0.0f;
	float velocity = 0.0f;
	float torque = 0.0f;

	private float ifps;

	private void Init()
	{
	my_jointL = targetWheelL.ObjectBodyRigid.GetJoint(0) as JointWheel;
	my_jointR = targetWheelR.ObjectBodyRigid.GetJoint(0) as JointWheel;
	my_jointFL = targetFWL.ObjectBodyRigid.GetJoint(0) as JointWheel;
	my_jointFR = targetFWR.ObjectBodyRigid.GetJoint(0) as JointWheel;

	PlayerPersecutor player = new PlayerPersecutor();
	controls = player.Controls;
	}
	
	private void Update()
	{
			ifps = Game.IFps;

			if ((controls.GetState(Controls.STATE_FORWARD) == 1) || (controls.GetState(Controls.STATE_TURN_UP) == 1))
			{
				velocity = MathLib.Max(velocity, 0.0f);
				velocity += ifps * 50.0f;
				torque = 5.0f;
			}
			else if ((controls.GetState(Controls.STATE_BACKWARD) == 1) || (controls.GetState(Controls.STATE_TURN_DOWN) == 1))
			{
				velocity = MathLib.Min(velocity, 0.0f);
				velocity -= ifps * 50.0f;
				torque = 5.0f;
			}
			else
			{
				velocity *= MathLib.Exp(-ifps);
			}
			velocity = MathLib.Clamp(velocity, -90.0f, 90.0f);

			if ((controls.GetState(Controls.STATE_MOVE_LEFT) == 1) || (controls.GetState(Controls.STATE_TURN_LEFT) == 1))
				angle += ifps * 100.0f;
			else if ((controls.GetState(Controls.STATE_MOVE_RIGHT) == 1) || (controls.GetState(Controls.STATE_TURN_RIGHT) == 1))
				angle -= ifps * 100.0f;
			else
			{
				if (MathLib.Abs(angle) < 0.25f) angle = 0.0f;
				else angle -= MathLib.Sign(angle) * ifps * 45.0f;
			}
	
			angle = MathLib.Clamp(angle, -10.0f, 10.0f);

			float base_a = 3.3f;
			float width = 3.0f;
			float angle_0 = angle;
			float angle_1 = angle;
			if (MathLib.Abs(angle) > MathLib.EPSILON)
			{
				float radius = base_a / MathLib.Tan(angle * MathLib.DEG2RAD);
				angle_0 = MathLib.Atan(base_a / (radius + width / 2.0f)) * MathLib.RAD2DEG;
				angle_1 = MathLib.Atan(base_a / (radius - width / 2.0f)) * MathLib.RAD2DEG;
			}

			my_jointFL.Axis10 = MathLib.RotateZ(angle_0).GetColumn3(0);
			my_jointFR.Axis10 = MathLib.RotateZ(angle_1).GetColumn3(0);

			if (controls.GetState(Controls.STATE_USE) == 1)
			{
				velocity = 0.0f;
					my_jointL.AngularDamping = 20000.0f;
					my_jointR.AngularDamping = 20000.0f;
					my_jointFL.AngularDamping = 20000.0f;
					my_jointFR.AngularDamping = 20000.0f;
			}
			else
			{
					my_jointL.AngularDamping = 0.0f;
					my_jointR.AngularDamping = 0.0f;
					my_jointFL.AngularDamping = 0.0f;
					my_jointFR.AngularDamping = 0.0f;
			}

			if (Input.IsKeyDown(Input.KEY.Q))
			{
				targetCar.ObjectBodyRigid.AddLinearImpulse(vec3.UP*1000f);
			}
			if (Input.IsKeyDown(Input.KEY.E))
			{
				targetCar.ObjectBodyRigid.AddLinearImpulse(vec3.DOWN*1000f);
			}

	}

		private void UpdatePhysics()
		{
			my_jointL.AngularVelocity = velocity;
			my_jointR.AngularVelocity = velocity;
			
			my_jointL.AngularTorque = torque;
			my_jointR.AngularTorque = torque;
		}



:

TheVehicle.cs
using System;
using System.Collections;
using System.Collections.Generic;
using Unigine;

[Component(PropertyGuid = "ca695c8787d5703a22a6c2516a3c177cddf38cab")]
public class TheVehicle : Component
{

, , . , .

[ShowInEditor][Parameter(Tooltip = "Left Wheel")]
private Node targetWheelL = null;
[ShowInEditor][Parameter(Tooltip = "Right Wheel")]
private Node targetWheelR = null;

[ShowInEditor][Parameter(Tooltip = "Left Wheel F")]
private Node targetFWL = null;
[ShowInEditor][Parameter(Tooltip = "Right Wheel F")]
private Node targetFWR = null;

[ShowInEditor][Parameter(Tooltip = "theCar")]
private Node targetCar = null;

. tooltip , .

private JointWheel my_jointL;
private JointWheel my_jointR;
private JointWheel my_jointFL;
private JointWheel my_jointFR;

.

Controls controls = null;

float angle = 0.0f;
float velocity = 0.0f;
float torque = 0.0f;

private float ifps;

.

private void Init()
{
my_jointL = targetWheelL.ObjectBodyRigid.GetJoint(0) as JointWheel;
my_jointR = targetWheelR.ObjectBodyRigid.GetJoint(0) as JointWheel;
my_jointFL = targetFWL.ObjectBodyRigid.GetJoint(0) as JointWheel;
my_jointFR = targetFWR.ObjectBodyRigid.GetJoint(0) as JointWheel;

, JointWheel.
, , ( ).

			
// setting up player and controls
PlayerPersecutor player = new PlayerPersecutor();
controls = player.Controls;
}

, PlayerPresecutor, Controls player .

private void Update()
{
ifps = Game.IFps;

// forward and backward movement by setting joint motor's velocity and torque
			if ((controls.GetState(Controls.STATE_FORWARD) == 1) || (controls.GetState(Controls.STATE_TURN_UP) == 1))
			{
				velocity = MathLib.Max(velocity, 0.0f);
				velocity += ifps * 50.0f;
				torque = 5.0f;
			}//Input.IsKeyDown(Input.KEY.DOWN)
			else if ((controls.GetState(Controls.STATE_BACKWARD) == 1) || (controls.GetState(Controls.STATE_TURN_DOWN) == 1))
			{
				velocity = MathLib.Min(velocity, 0.0f);
				velocity -= ifps * 50.0f;
				torque = 5.0f;
			}
			else
			{
				velocity *= MathLib.Exp(-ifps);
			}
			velocity = MathLib.Clamp(velocity, -90.0f, 90.0f);

			// steering left and right by changing Axis01 for front wheel joints
			if ((controls.GetState(Controls.STATE_MOVE_LEFT) == 1) || (controls.GetState(Controls.STATE_TURN_LEFT) == 1))
				angle += ifps * 100.0f;
			else if ((controls.GetState(Controls.STATE_MOVE_RIGHT) == 1) || (controls.GetState(Controls.STATE_TURN_RIGHT) == 1))
				angle -= ifps * 100.0f;
			else
			{
				if (MathLib.Abs(angle) < 0.25f) angle = 0.0f;
				else angle -= MathLib.Sign(angle) * ifps * 45.0f;
			}

			angle = MathLib.Clamp(angle, -10.0f, 10.0f);//      30  (angle, -30.0f, 30.0f)

			// calculating steering angles for front joints (angle_0 and angle_1)
			float base_a = 3.3f;
			float width = 3.0f;
			float angle_0 = angle;
			float angle_1 = angle;
			if (MathLib.Abs(angle) > MathLib.EPSILON)
			{
				float radius = base_a / MathLib.Tan(angle * MathLib.DEG2RAD);
				angle_0 = MathLib.Atan(base_a / (radius + width / 2.0f)) * MathLib.RAD2DEG;
				angle_1 = MathLib.Atan(base_a / (radius - width / 2.0f)) * MathLib.RAD2DEG;
			}

Update, , .

my_jointFL.Axis10 = MathLib.RotateZ(angle_0).GetColumn3(0);
my_jointFR.Axis10 = MathLib.RotateZ(angle_1).GetColumn3(0);

// enabling or disabling a brake
if (controls.GetState(Controls.STATE_USE) == 1)
{
velocity = 0.0f;
my_jointL.AngularDamping = 20000.0f;
my_jointR.AngularDamping = 20000.0f;
my_jointFL.AngularDamping = 20000.0f;
my_jointFR.AngularDamping = 20000.0f;
}
else
{
my_jointL.AngularDamping = 0.0f;
my_jointR.AngularDamping = 0.0f;
my_jointFL.AngularDamping = 0.0f;
my_jointFR.AngularDamping = 0.0f;
}

, , . , 4 . , , 10 .

if (Input.IsKeyDown(Input.KEY.Q))
{
targetCar.ObjectBodyRigid.AddLinearImpulse(vec3.UP*1000f);
}

if (Input.IsKeyDown(Input.KEY.E))
{
targetCar.ObjectBodyRigid.AddLinearImpulse(vec3.DOWN*1000f);
}

}

Update , . , — «this.» .

private void UpdatePhysics()
{
// set angular velocity for rear joints
my_jointL.AngularVelocity = velocity;
my_jointR.AngularVelocity = velocity;

// set torque for rear joints
my_jointL.AngularTorque = torque;
my_jointR.AngularTorque = torque;

}

}

Update Physics , velocity torque.


Speichern Sie danach die Skriptdatei und kehren Sie zum Editorfenster zurück. Unigine überprüft das Programm auf Fehler. Wenn alles in Ordnung ist, sollte unten rechts ein grünes Rechteck angezeigt werden, wenn die Benachrichtigung Project erfolgreich erstellt wurde.

Wählen Sie nun Cuboid, fügen Sie das Komponentenfeld hinzu und ziehen Sie unser Skript dorthin. Es erscheinen einige Felder, die ausgefüllt werden müssen. Ziehen Sie im Feld Zielrad L vorsichtig das linke Hinterrad (dh den Zylinder, der es kennzeichnet), Target Whell R - das rechte Hinterrad, Target FWL - vorne links, Target FWR - vorne rechts und Cuboid selbst im Feld Target Car.


Um eine Komponente hinzuzufügen, finden wir dieses Feld in den Cuboid-Eigenschaften und klicken darauf. Eine leere Zeile wird angezeigt


, in der Sie die Skriptdatei ziehen können (oder den Pfad dazu über das Ordnersymbol finden können).


Füllen Sie die Felder

Run Play aus - jetzt begann sich die Maschine zu bewegen. Richtig, gleichzeitig mit dem Charakter, in dessen Namen Sie jetzt die Welt betrachten.

Ihre Steuerung ist wie folgt: W - rollt vorwärts, S - rückwärts, A und D - drehen die Vorderräder nach links bzw. rechts. Ein Impuls wird an Q abgegeben , die Maschine springt sozusagen. Bei E hingegen bewegt sich der Impuls nach unten.

Möglicherweise stellen Sie fest, dass die Maschine wie auf dem Mond etwas langsam fällt. Um diesen Moment zu verbessern, gibt es zwei Möglichkeiten. In der Dokumentation wurde vorgeschlagen, Änderungen an der Datei AppWorldLogic.cs vorzunehmen. Das brauchen wir aber nicht, da ich dort die Initialisierung im Schreibmaschinenskript durchgeführt habe. Mit Ausnahme einiger Zeilen, die die globale Physik regieren.

Tatsache ist, dass Sie diese Einstellungen unabhängig voneinander eingeben und ändern können. Klicken Sie dazu auf die oberste Zeile des Editors. Windows> Einstellungen Suchen Sie im folgenden Fenster die Spalte Physik und setzen Sie den Wert für Frozen Linear Velocity auf 0,1, für Frozen Angular Velocity ebenfalls auf 0,1 und ändern Sie den niedrigsten Schwerkraftvektor von (0,0, -9,8) auf (0,0, - 19.6).

Dasselbe kann im Code getan werden, indem die folgenden Zeilen zu Init hinzugefügt werden:

Physics.Gravity = new vec3(0.0f, 0.0f, -9.8f * 2.0f);
Physics.FrozenLinearVelocity = 0.1f;
Physics.FrozenAngularVelocity = 0.1f;

Wenn Sie jetzt mit dem Spielen beginnen, wird sich die „Maschine“ wahrscheinlich wieder verschlechtern und ausfallen. Um dies zu beheben, drehen Sie an jedem Rad eine lineare Feder. Erhöhen Sie zunächst zweimal. Wenn Sie einrichten, werden Sie feststellen, dass die Schwerkraft während der Sprünge stärker ist (obwohl ich den Sprungimpuls standardmäßig auf ziemlich hoch eingestellt habe).

Jetzt, da Sie beim Aufstellen dieses launischen Wagens bereits nass geworden sind, ist es an der Zeit, die Fesseln von firts_person_controller fallen zu lassen und mit einer Kamera einer dritten Person zu sehen, was von der Seite der Maschine selbst passiert.
Heruntergeladen deaktivieren first_person_controller (klicken Sie auf das Feld neben seinem Namen, damit es leer wird).
Erstellen Sie eine Kamera. Klicken Sie dazu mit der rechten Maustaste auf die Szene und wählen Sie Erstellen> Kamera> Presecutor. Die PlayerPresecutor-Kamera selbst und ihr Dummy-Ziel Presecutor_Target werden angezeigt.
Der Dummy kann ausgeschaltet werden. Wir klicken auf die Kamera selbst und stellen sicher, dass das Kontrollkästchen Haupt-Player in seinen Eigenschaften aktiviert ist (damit beim Start kein schwarzer Bildschirm angezeigt wird). Im Feld Zielknoten finden wir unseren Quader in der Dropdown-Liste.

Speichern Sie und klicken Sie auf Wiedergabe.

Jetzt können Sie voll fahren. Die Kamera kann zwar ziemlich weit fliegen. Um dies zu beheben, müssen Sie die Grenzwerte anpassen. Wir kehren zum Editor zurück und stellen in den Kameraeigenschaften beispielsweise Min. Abstand 10 und Max. Abstand 30 ein.

Neungers im Unigine-Motor


Nachdem ich gelernt hatte, ungefähre Radphysik zu sammeln, machte ich eine Testszene mit einem Bio-Mechos-Modell aus meinem Nevanger-Projekt. So sieht es im Moment aus:



Screenshots







Die Hauptprobleme im Moment sind einige Instabilitäten des Designs. Das liegt wiederum daran, dass ich noch nicht alle Aspekte und Nuancen der Einstellungen gründlich verstanden habe. Manchmal stolpert die Maschine über etwas und beginnt sich heftig zu drehen. Das Reduzieren der linearen Dämpfung scheint nicht viel zu helfen, da auch die anderen Parameter verdreht werden, obwohl ich noch nichts verdreht oder konfiguriert habe, aber es ist nicht umfassend.

Ein weiterer Fehler - es gibt Situationen, in denen der Boden total festsitzt, wenn die Vorderräder hochstehen und das Heck unter der Landschaft. Oder mit hoher Geschwindigkeit durch die Landschaft selbst schlagen und anschließend darunter wegfliegen. All dies wird anscheinend durch Einstellen von Toleranzen und Iterationen korrigiert, hat aber bisher nicht die optimalen Werte gefunden.

Im Allgemeinen ist die Bewegung auf einer ziemlich flachen Oberfläche bereits angemessener. Es ist nicht klar, wie gut sich Radverbindungen auf einer unebenen Oberfläche ideal verhalten, wie ich in den Video-Demos des Motors für Autos verstanden habe, die (scheinbar) veraltete, aber physisch „ehrlichere“ Aufhängungsverbindungen verwendet haben (übrigens habe ich vielleicht nicht versucht, eine Maschine darauf zu montieren dort ist alles etwas einfacher). Berücksichtigen Radverbindungen die Reibungsparameter der Landschaft oder sind sie nur daran interessiert, ob die Physikflagge aktiviert ist.

Allgemeine Eindrücke des Motors


Was die Arbeit mit dem Editor angeht, hat mich das, was passiert ist, am meisten an den Prozess der Arbeit mit CryEngine erinnert. Obwohl es an einigen Orten bequemer ist. Aber es ist wie bei jemandem, in derselben CryEngine war es möglich, direkt im Editor zu modellieren. Dies ist für mich nicht relevant, da ich dafür Blender verwende, bei dem Sie um Größenordnungen mehr Kontrolle über das Modell haben, und für jemanden kann es wichtig sein.

Im Bild unten ist links eine Materialliste sichtbar. Netze werden durch eine Gruppe von Materialien auf Netzbasis gemalt, aus denen Sie Ihre Materialoptionen klonen können. Terrane mit einer Textur zu malen ist bereits schwieriger, aber Masken werden in vollem Umfang verwendet - Sie können Texturen, Höhenkarten usw. mischen, wenn Sie das Gerät verstehen. Für das gleiche Wasser gibt es eine eigene Materialgruppe, die buchstäblich mit einem Klick hinzugefügt wird und ziemlich gut aussieht.

Rechts ist die Hierarchie der Szenenobjekte und das Eigenschaftenfenster. Es ist etwas unpraktisch, numerische Werte im laufenden Betrieb zu ändern. Sie müssen mit kleinen Pfeilen in das Symbol gelangen. Einige Schieberegler sind anfangs irreführend, da sie nicht den gesamten möglichen Bereich des Parameters anzeigen, sondern beispielsweise nur das Intervall von 0 bis 1. Die Fluggeschwindigkeit der Kamera wird im Feld mit dem laufenden Mann an der Spitze geregelt, standardmäßig bewegt sie sich nach den Empfindungen standardmäßig langsam . Vielleicht ist dies bequemer, wenn Sie mit Modellen im realen Maßstab arbeiten.


All Articles