Comment j'ai collecté la physique des roues chez Unigine

Bonne journée.

Cette fois, nous parlerons du moteur russe Unigine et de la manière d'y assembler une machine simple. Le schéma n'est pas idéal, car je ne l'ai pas compris à certains égards, mais au moins je partagerai mon expérience.



Tout d'abord, pour comprendre comment se fait la physique des roues, nous allons dans la documentation officielle et trouver cet exemple .

Soit dit en passant, il s'agit d'un exemple de joint de roues, mais pour une raison quelconque, il se trouve à l'adresse / car_suspension_joints /. Vous devez également vous assurer que la documentation ne passe pas aux anciennes versions (c'est-à-dire que DOCS (2.11) est ouvert) et cochez la case «C #» en haut de l'article.

Après avoir étudié l'exemple, nous voyons qu'il a été écrit par analogie avec la première solution C ++. Autrement dit, tout est créé par le code. Voilà pour la programmation visuelle, nous sommes arrivés. Eh bien, tout n'est pas si triste, mais vous pouvez voir comment tout cela se fait dans le code. Et après avoir exécuté les liens, obtenez une idée générale du dispositif commun des roues et des paramètres physiques.
( ). , -, UnigineScript, . LOD'.
Bien sûr, je m'attendais à un guide étape par étape prêt à l'emploi sur l'assemblage visuel afin de faire rouler quelque chose, ce qui coûte peu de sang. En conséquence, je devais encore plonger dans tout cela avec ma tête afin de trouver un pipeline approximatif. Cela a partiellement réussi, mais il était loin d'être compris en tous points et des questions restent ouvertes, par exemple, si les nœuds de boîtier et de roue doivent être intégrés dans une certaine hiérarchie, si les axes des points sont correctement orientés, etc.

En général, cette instruction vous aidera à comprendre le principe de base, mais pour comprendre les subtilités des paramètres, vous devrez toujours étudier la documentation (ou peut-être qu'ils vous diront quelque chose d'utile dans les commentaires).

Assemblage du cadre


1. Créez un nouveau projet. Choisissez l'option C #. Ouvrez le projet dans l'éditeur.







2. Nous créons la base de la machine.

Pour ce faire, cliquez avec le bouton droit dans la scène, choisissez Créer > Primitive > Boîte . Le résultat est un objet cuboïde . Soulevez-le légèrement au-dessus du "sol".



3. Nous créons des roues.

Cliquez à nouveau sur la souris et sélectionnez Créer > Primitif > Cylindre . Il faudra 4 pièces.



Afin de ne pas être confondu avec l'orientation, vous pouvez faire pivoter la caméra de sorte que -Y brille d'en haut dans le cube (c'est-à-dire que nous regardons maintenant la future machine par derrière) et placer deux cylindres derrière Cuboid, deux autres devant. Il n'est pas nécessaire de les faire pivoter et de les personnaliser. Pour plus de commodité, différentes couleurs peuvent être attribuées à l'arrière et à l'avant.

4. Ajoutez basé sur la physique.

Sélectionnez Cuboid et sur la gauche, dans la fenêtre Paramètres de l'onglet Node , basculez vers Physique . Dans la colonne Corps, sélectionnez le type Rigide . Après cela, faites défiler vers le bas et sélectionnez l'élément Boîte dans la colonne Formes ouverte .





Nous voyons le ShapeBox apparu. Nous allons entrer dans ses paramètres et définir immédiatement notre base sur la masse ( masse ) recommandée de 64 kilogrammes.



5. Ajoutez de la physique aux roues.

À son tour, sélectionnez les cylindres et mettez-les également rigides dans l'onglet Physique.
Ils n'auront pas besoin de créer une forme, car les joints de roue fonctionnent sur les rakcasts.

6. Attachez les roues à la base.

Il est temps d'attribuer les joints de roue Pour ce faire, sélectionnez correctement Cuboid et faites défiler jusqu'à la colonne Articulations dans l'onglet Physique . Dans la liste, sélectionnez Wheel et lorsque vous cliquez sur le bouton Add , la fenêtre Select a Body apparaît.. Là, vous sélectionnez un cylindre, il est mis en évidence avec une grille blanche dans la scène, puis appuyez sur OK. Une liaison WheelJoint apparaîtra dans la liste . Ici, il est déjà souhaitable de les renommer (pour cela, vous devez cliquer sur la ligne JointWheel et écrire un nouveau nom dans la colonne Nom).





De la même manière, fixez les cylindres restants à Cuboid. Alors qu'à la fin sur sa liste de points brûlés 4 lignes.


Sans renommer, il y aurait 4 lignes de WheelJoint.

Veuillez noter que vous devez lier à partir de Cuboid, et non à partir de l'onglet Physique des cylindres eux-mêmes. Bien qu'après, si vous sélectionnez un cylindre spécifique et accédez à sa physique, son joint créé y est également affiché et vous pouvez modifier ses paramètres.

7. Configurez la configuration des liaisons.

Encore une fois, sélectionnez Cuboid, trouvez en physique une liste de ses points et sélectionnez l'un d'eux. Nous voyons qu'un coin blanc avec des carrés est apparu dans la scène à l'intérieur de Cuboid.
Dans les paramètres de l'articulation, nous trouvons le graphique du vecteur Anchor 0 , et ajustons les valeurs de ses trois champs de sorte que ce coin soit décalé le long de l'axe X, à l'extérieur de Cuboid et légèrement abaissé le long de l'axe Z.





Ensuite, nous décalons le coin le long de l'axe Y, selon la liaison quelle roue est actuellement sélectionnée.

Nous répétons la procédure avec le reste des points, en définissant exactement les mêmes décalages le long de Z et les mêmes, mais multidirectionnels le long des autres axes.

Si vous sélectionnez tous les points à la fois, la conception globale deviendra visible. Vous pouvez également activer l'affichage des joints dans les assistants sur un panneau spécial au-dessus de la scène: Assistants> Physique > Articulations .


Vue arrière du cadre avec les aides incluses

8. Nous regardons ce qui s'est passé.

Dans l'éditeur, il y a un bouton pour calculer la physique. Si vous l'activez, une simulation de la physique démarre (les scripts ne fonctionnent pas) et vous pouvez vérifier le comportement de notre Frankenstein.
Avant de commencer, assurez-vous que les cases à cocher activées pour Collision et Physics Intersection sont cochées dans les paramètres "étage" . Sinon, notre création peut complètement échouer sous le plancher entièrement ou avec seulement des roues.



Attention, avant d'activer la simulation, il est préférable de sauvegarder, et les paramètres corrigés lors de son fonctionnement reprendront leurs valeurs après déconnexion.

Comme on le voit, les roues sont ramassées aux bons endroits, mais la structure tombe à la surface avec les extrémités des cylindres.



Vous pouvez geler Cuboid lui-même en place en activant d'abord la case à cocher Immuable dans l'onglet Physique de la colonne Corps.

9. Réglez les essieux des roues.

Désactivez la simulation physique. Sélectionnez Cuboid, accédez à son onglet Physique et modifiez les axes 00 , Axe 10 et Axe 11 pour chaque jonction . Veuillez noter que dans la somme des champs de chaque vecteur, prenez des valeurs de 0 à 1 et l'éditeur essaiera de corriger automatiquement les valeurs si vous mettez d'abord 1 dans un nouvel axe sans mettre à zéro le vecteur.

Apparemment, je n'ai pas encore développé les vecteurs assez correctement, les assistants montrent que les parties gauche et droite regardent dans la même direction, mais ils ne donnent pas une compréhension claire de quel axe est où, ce qui rend le réglage difficile.

Dans tous les cas, cette mise en page fonctionne moins ou moins. Ici, je règle les vecteurs d'axe comme suit: Axe 00 ( 0 , 0 , 1 ), Axe 10 ( 1 , 0 , 0 ), Axe 11 ( 0 , 0 , 1 ).



Si vous démarrez une simulation physique maintenant, la conception devrait tomber sur des cylindres correctement tournés, qui tourneront ensuite le long de l'axe correct.

dix.Masse et comportement des roues, itérations physiques.

Très probablement, la structure après être tombée au sol échoue maintenant partiellement.

Tout d'abord, entrons dans les paramètres généraux de la physique. Nous cliquons sur la ligne supérieure de l'éditeur. Windows > Paramètres et dans l'onglet Paramètres qui s'ouvre, on retrouve la colonne Physique (Runtime / World /). Nous en avons défini au moins 5 dans le champ Itérations . Encore une fois, nous entrons dans les paramètres de chaque joint. En haut de la liste, tout le monde a un champ Itération , défini sur 8 . Restitution linéaire et restitution angulaire définies sur 0,1 . Linéaire de






changez -0.15 , Linear To à 0.15 .
En bas, nous leur apposons une masse de 25 kg dans le champ Masse de roue .

Lorsque la simulation démarre, la «machine» physique doit encore échouer / échouer partiellement.

Réglez chaque amortissement linéaire sur 50 . Et réglez Linear Spring sur 10 .
Maintenant, pendant la simulation, la structure devrait tomber et rebondir légèrement sur le sol. Si cela ne fonctionne pas, essayez les valeurs Amortissement linéaire et Ressort linéaire.
La documentation recommande de régler l'amortissement 400 et le ressort 100, mais personnellement, en même temps, la «machine» commence à tourner comme un hélicoptère, rebondit et s'envole.

11. Le réglage final du cadre.

Enregistrez et essayez de cliquer sur Lecture (le bouton ci-dessus, à côté de l'inclusion de la simulation physique) pour parcourir la scène à la première personne. Très probablement, la «machine» pendait un peu en l'air, mais roule si elle est poussée dans le cube central.



Vous pouvez maintenant ajuster l' ancre 0 aux points de sorte qu'ils soient approximativement équidistants du centre (bien que cela ne soit pas nécessaire). Ensuite, démarrez la simulation et changez le ressort linéaire juste pendant celui-ci pour trouver la valeur optimale à laquelle chaque roue touche normalement le sol.

Après toutes ces manipulations, vous devriez obtenir une «machine» tombant correctement au sol, qui roule légèrement lorsque vous poussez en mode jeu, où par défaut vous exécutez sur un contrôleur séparé avec une vue à la première personne.



Écrire un script de contrôle



Nous avons un blanc de la "machine à écrire", maintenant nous allons écrire un code de contrôle pour cela en C #.
Pour ce faire, cliquez avec le bouton droit dans la fenêtre sous la scène et sélectionnez Créer > Créer un composant C # . Entrez le nom du script dans la fenêtre qui apparaît.





Double-cliquez sur le fichier de script apparu et l'environnement de développement démarre.



Sélectionnez les lignes remplies de bleu dans l'image, supprimez-les et ajoutez à la place le code suivant auquel j'ai proposé de modifier le script proposé dans la documentation:

Extrait de script
	[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.


Après cela, enregistrez le fichier de script et revenez à la fenêtre de l'éditeur. Unigine vérifiera le programme pour les erreurs, et si tout va bien, alors un rectangle vert devrait apparaître en bas à droite avec la notification Projet réussi.

Maintenant, sélectionnez Cuboid, ajoutez-y le champ du composant et faites-y glisser notre script. Quelques champs apparaissent qui doivent être remplis. Dans le champ Target Wheel L, faites glisser doucement la roue arrière gauche (c'est-à-dire le cylindre qui la désigne), Target Whell R - la roue arrière droite, Target FWL - l'avant gauche, Target FWR - l'avant droite et Cuboid lui-même dans le champ Target Car.


Pour ajouter un composant, nous trouvons ce champ dans les propriétés Cuboid et cliquez dessus. Une


ligne vide apparaîtra où vous pourrez faire glisser le fichier de script (ou trouver le chemin d'accès via l'icône du dossier)


Remplissez les champs

Run Play - maintenant la machine a commencé à bouger. C'est vrai, simultanément avec le personnage au nom duquel vous regardez maintenant le monde.

Son contrôle est le suivant: W - roule en avant, S - en arrière, A et D - tournez les roues avant respectivement à gauche et à droite. Une impulsion est donnée à Q , la machine saute pour ainsi dire. Sur E , au contraire, l'impulsion descend.

Vous remarquerez peut-être que la machine tombe légèrement lentement, comme sur la lune. Pour améliorer ce moment, il existe deux options. La documentation a suggéré d'apporter des modifications au fichier AppWorldLogic.cs. Mais nous n'en avons pas besoin, car j'ai effectué l'initialisation dans le script de machine à écrire. Sauf quelques lignes qui régissent la physique mondiale.

Le fait est que vous pouvez entrer indépendamment ces paramètres et les modifier. Pour ce faire, cliquez sur la ligne supérieure de l'éditeur. Windows> Paramètres, dans la fenêtre qui s'ouvre, recherchez la colonne Physique et définissez la valeur de Frozen Linear Velocity sur 0,1, pour Frozen Angular Velocity également 0,1, et modifiez le vecteur de gravité le plus bas de (0,0, -9,8) à (0,0, - 19.6).

La même chose peut être effectuée dans le code en ajoutant les lignes suivantes à Init:

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

Si vous démarrez Play maintenant, la «machine» se détériorera probablement à nouveau et commencera à échouer. Pour résoudre ce problème, essayez de faire tourner un ressort linéaire sur chaque roue. Relancez deux fois pour commencer. Lorsque vous configurez, vous remarquerez que la gravité pendant les sauts est plus forte (bien que je définisse l'élan de saut sur assez élevé par défaut).

Maintenant que vous avez déjà été mouillé lors de la configuration de ce chariot de mauvaise humeur, il est temps de laisser tomber les chaînes de firts_person_controller et de regarder ce qui se passe du côté de la machine elle-même, avec une caméra à la troisième personne.
Téléchargé désactivez first_person_controller (cliquez sur la case à côté de son nom pour qu'il devienne vide).
Créez une caméra. Pour ce faire, cliquez avec le bouton droit sur la scène et sélectionnez Créer> Caméra> Presecutor. La caméra PlayerPresecutor elle-même et sa cible factice Presecutor_Target apparaîtront.
Le mannequin peut être désactivé. Nous cliquons sur la caméra elle-même, assurez-vous de cocher la case du lecteur principal dans ses propriétés (afin de ne pas obtenir d'écran noir au démarrage). Dans le champ Target Node, nous trouvons notre Cuboid dans la liste déroulante.

Enregistrez et cliquez sur Lecture.

Vous pouvez maintenant rouler à fond. Certes, l'appareil photo peut voler assez loin. Pour résoudre ce problème, vous devez ajuster ses limites. Nous revenons à l'éditeur et définissons les propriétés de la caméra, par exemple, Min Distance 10 et Max Distance 30.

Neungers dans le moteur Unigine


Ayant appris à collecter la physique des roues approximative, j'ai fait une scène de test avec un modèle de bio-mechos de mon projet Nevanger. Voici à quoi cela ressemble en ce moment:



Captures d'écran







Les principaux problèmes à l'heure actuelle sont une certaine instabilité de la conception. Ce qui est encore une fois dû au fait que je n'ai pas encore bien compris tous les aspects et nuances des réglages. Parfois, la machine trébuche sur quelque chose et commence à tourner violemment. La réduction de l'amortissement linéaire ne semble pas beaucoup aider, en tordant également les autres paramètres, même si je n'ai pas encore tordu ou modifié quelque chose, mais ce n'est pas complet.

Un autre bug - il y a des situations où le sol est totalement coincé, lorsque les roues avant se lèvent et l'arrière sous le paysage. Ou vous frayez-vous un chemin à travers le paysage lui-même à grande vitesse, puis vous envolez sous lui. Tout cela, apparemment, est corrigé en fixant des tolérances et des itérations, mais jusqu'à présent n'a pas trouvé les valeurs optimales.

En général, sur une surface assez plate, le mouvement est déjà plus adéquat. Il n'est pas clair dans quelle mesure les joints de roue se comportent idéalement sur une surface inégale, comme je l'ai compris dans les démonstrations vidéo du moteur pour les voitures qu'ils utilisaient obsolètes (apparemment), mais plus physiquement "honnêtes" Joints de suspension (à propos, je n'ai pas essayé d'assembler une machine sur eux, peut-être , tout y est un peu plus facile). Les joints de roue prennent-ils en compte les paramètres de frottement du paysage, ou souhaitent-ils uniquement activer le drapeau physique?

Impressions générales du moteur


Quant à travailler avec l'éditeur, ce qui s'est passé m'a le plus rappelé le processus de travail avec CryEngine. Bien que dans certains endroits, cela soit plus pratique. Mais c'est comme quelqu'un, dans le même CryEngine, il était possible de modéliser directement dans l'éditeur. Ce n'est pas pertinent pour moi, car pour cela j'utilise Blender, où vous avez des ordres de grandeur plus de contrôle sur le modèle, et pour quelqu'un, cela peut être important.

Dans l'image ci-dessous, une liste de matériaux est visible à gauche. Les maillages sont peints à travers un groupe de matériaux à base de maillage, à partir duquel vous pouvez cloner vos options de matériaux. Peindre une terrane avec une texture est déjà plus difficile, mais les masques sont pleinement utilisés - vous pouvez mélanger des textures, des cartes de hauteur, etc., si vous comprenez l'appareil. Pour la même eau, il existe son propre groupe de matériaux, il est ajouté littéralement en un seul clic et a l'air plutôt bien.

À droite, la hiérarchie des objets de scène et la fenêtre des propriétés. Il est un peu gênant de manipuler des valeurs numériques à la volée - vous devez entrer dans l'icône avec de petites flèches. Certains curseurs sont initialement trompeurs, car ils ne montrent pas toute la plage possible du paramètre, mais, disons, uniquement l'intervalle de 0 à 1. La vitesse de vol de la caméra est réglée sur le terrain avec un homme qui court dessus, par défaut, elle se déplace en quelque sorte lentement, à en juger par les sensations . C'est peut-être plus pratique lorsque vous travaillez avec des modèles à une échelle réelle.


All Articles