Cómo coleccioné la física de ruedas en Unigine

Buen día.

Esta vez hablaremos sobre el motor ruso Unigine y cómo ensamblar una máquina simple en él. El esquema no es ideal, ya que no lo he descubierto en algunas cosas, pero al menos compartiré mi experiencia.



En primer lugar, para comprender cómo se realiza la física de las ruedas, vamos a la documentación oficial y encontramos este ejemplo .

Por cierto, tenga en cuenta que este es un ejemplo para la unión de ruedas, pero por alguna razón se encuentra en la dirección / car_suspension_joints /. También debe asegurarse de que la documentación no salte a las versiones anteriores (es decir, que DOCS (2.11) está abierto) y marque el cuadro "C #" en la parte superior del artículo.

Después de estudiar el ejemplo, vemos que fue escrito por analogía con la solución inicial de C ++. Es decir, todo se crea a través del código. Demasiado para la programación visual, hemos llegado. Bueno, no todo es tan triste, pero puedes ver cómo se hace todo esto en código. Y después de ejecutar los enlaces, obtenga una idea general del dispositivo de articulación de las ruedas y la configuración física.
( ). , -, UnigineScript, . LOD'.
Por supuesto, esperaba una guía paso a paso preparada sobre el ensamblaje visual para poner en marcha algo, costando poca sangre. Como resultado, todavía tenía que sumergirme en todo esto con mi cabeza para resolver una tubería aproximada. Esto tuvo un éxito parcial, pero estaba lejos de entenderse en todos los puntos y las preguntas permanecen abiertas, por ejemplo, si la carcasa y los nodos de las ruedas deben integrarse en una determinada jerarquía, si los ejes de los puntos están orientados correctamente, etc.

En general, esta instrucción lo ayudará a comprender el principio básico, pero para comprender las complejidades de la configuración, aún tendrá que estudiar la documentación (o tal vez le dirán algo útil en los comentarios).

Conjunto de marco


1. Crear un nuevo proyecto. Elija la opción C #. Abre el proyecto en el editor.







2. Creamos la base de la máquina.

Para hacer esto, haga clic derecho en la escena, elija Crear > Primitivo > Cuadro . El resultado es un objeto cuboide . Levántelo ligeramente por encima del "piso".



3. Creamos ruedas.

Vuelva a hacer clic con el mouse y seleccione Crear > Primitivo > Cilindro . Tomará 4 piezas.



Para no confundirse con la orientación, puede girar la cámara para que -Y brille desde arriba en el cubo (es decir, ahora estamos mirando la futura máquina desde atrás) y coloque dos cilindros detrás del Cuboid, otros dos delante de él. De alguna manera, rotarlos y personalizarlos no es necesario. Para mayor comodidad, se pueden asignar diferentes colores a la parte trasera y delantera.

4. Añadir física basada.

Seleccione Cuboide y, a la izquierda, en la ventana Parámetros de la pestaña Nodo , cambie a Física . En la columna Cuerpo, seleccione el tipo Rígido . Después de eso, desplácese hacia abajo y seleccione el elemento Cuadro en la columna Formas abierta .





Vemos el ShapeBox aparecido. Entraremos en su configuración e inmediatamente estableceremos nuestra base en la masa recomendada ( Masa ) de 64 kilogramos.



5. Añadir física a las ruedas.

A su vez, seleccione los cilindros y también póngalos rígidos en la pestaña Física.
No necesitarán crear una Forma, porque las juntas de las ruedas funcionan en rakcasts.

6. Ate las ruedas a la base.

Tiempo para asignar juntas de rueda. Para hacer esto, seleccione Cuboide correctamente y desplácese hacia abajo hasta la columna Articulaciones en la pestaña Física . En la lista, seleccione Rueda y cuando haga clic en el botón Agregar , aparecerá la ventana Seleccionar un cuerpo. Allí selecciona un cilindro, se resalta con una cuadrícula blanca en la escena y presiona Ok. Aparecerá un enlace WheelJoint en la lista . Aquí ya es conveniente cambiarles el nombre (para ello, debe hacer clic en la línea JointWheel y escribir un nuevo nombre en la columna Nombre).





Del mismo modo, conecte los cilindros restantes a Cuboid. De modo que al final en su lista de puntos quemaron 4 líneas.


Sin renombrar, habría 4 líneas de WheelJoint.

Tenga en cuenta que debe unirse desde Cuboid, y no desde la pestaña Física de los cilindros. Aunque después, si selecciona un cilindro específico y va a su Física, su unión creada también se muestra allí y puede editar sus parámetros.

7. Configure la configuración de los enlaces.

Nuevamente, seleccione Cuboide, busque en Física una lista de sus puntos y seleccione uno de ellos. Vemos que una esquina blanca con cuadrados apareció en la escena dentro de Cuboid.
En la configuración de la articulación, encontramos el gráfico del vector Ancla 0 y ajustamos los valores de sus tres campos para que esta esquina se desplace a lo largo del eje X, fuera del Cuboide y se baje ligeramente a lo largo del eje Z.





Luego cambiamos la esquina a lo largo del eje Y, dependiendo de la unión qué rueda está seleccionada actualmente.

Repetimos el procedimiento con el resto de los puntos, estableciendo exactamente los mismos cambios a lo largo de Z y lo mismo, pero multidireccionales a lo largo de los otros ejes.

Si selecciona todos los puntos a la vez, el diseño general se hará visible. También puede habilitar la visualización de uniones en ayudantes en un panel especial sobre la escena: Ayudantes> Física > Articulaciones .


Vista posterior del marco con los ayudantes incluidos

8. Observamos lo que sucedió.

En el editor hay un botón para calcular la física. Si lo habilita, comienza una simulación de física (los scripts no funcionan) y puede verificar cómo se comporta nuestro Frankenstein.
Antes de comenzar, asegúrese de que las casillas de verificación habilitadas para Colisión e Intersección física estén marcadas en la configuración de "piso" . De lo contrario, nuestra creación puede fallar completamente debajo del piso por completo o solo con ruedas.



Tenga cuidado, antes de encender la simulación, es mejor guardar, y los parámetros corregidos durante su funcionamiento volverán a sus valores después de desconectarse.

Como vemos, las ruedas se recogen en los lugares correctos, pero la estructura cae en la superficie con los extremos de los cilindros.



Puede congelar Cuboid en su lugar habilitando primero la casilla de verificación Inmóvil en la pestaña Física en la columna Cuerpo.

9. Ajuste los ejes de las ruedas.

Desactivar la simulación física. Seleccione Cuboide, vaya a su pestaña Física y edite los ejes 00 , Eje 10 y Eje 11 para cada cruce . Tenga en cuenta que en la suma, los campos de cada vector toman valores de 0 a 1 y el editor intentará corregir automáticamente los valores si primero coloca 1 en un nuevo eje sin poner a cero el vector.

Aparentemente, todavía no he desarrollado los vectores correctamente, los ayudantes muestran que las partes izquierda y derecha están mirando en la misma dirección, pero no dan una idea clara de qué eje es dónde, lo que dificulta la sintonización.

En cualquier caso, este diseño funciona menos o menos. Aquí configuro los vectores de eje de la siguiente manera: Eje 00 ( 0 , 0 , 1 ), Eje 10 ( 1 , 0 , 0 ), Eje 11 ( 0 , 0 , 1 ).



Si comienza una simulación física ahora, entonces el diseño debe caer en cilindros rotados correctamente, que posteriormente girarán a lo largo del eje correcto.

10)Rueda de masa y comportamiento, iteraciones físicas.

Lo más probable es que la estructura después de caer al suelo ahora falle parcialmente.

Primero, veamos los ajustes generales de la física. Hacemos clic en la línea superior del editor. Windows > Configuración y en la pestaña Configuración que se abre, encontramos la columna Física (Runtime / World /). Establecemos al menos 5 en el campo Iterations . Nuevamente vamos a la configuración de cada articulación. En la parte superior de la lista, todos tienen un campo Iteración , establecido en 8 . Restitución lineal y Restitución angular establecida en 0.1 . Lineal desde






cambie -0.15 , Lineal a a 0.15 .
En la parte inferior, les colocamos una masa de 25 kg en el campo Wheel Mass .

Cuando comienza la simulación, la "máquina" física todavía tiene que fallar / fallar parcialmente.

Establezca cada Amortiguación lineal en 50 . Y establezca Linear Spring en 10 .
Ahora, durante la simulación, la estructura debe caer y rebotar ligeramente en el piso. Si eso no funciona, entonces experimente con los valores de Amortiguación lineal y Resorte lineal.
La documentación recomienda configurar la amortiguación 400 y el resorte 100, pero personalmente, al mismo tiempo, la "máquina" comienza a girar como un helicóptero, rebota y vuela.

11. La configuración final del marco.

Guarde e intente hacer clic en Reproducir (el botón de arriba, junto a la inclusión de simulación física) para caminar por la escena en primera persona. Lo más probable es que la "máquina" colgara un poco en el aire, pero ruede si es empujada hacia el cubo central.



Ahora puede ajustar el Ancla 0 en los puntos para que estén aproximadamente equidistantes del centro (aunque no es necesario). Luego, comience la simulación y cambie el resorte lineal justo durante el mismo para encontrar el valor óptimo en el que cada rueda normalmente toca el suelo.

Después de todas estas manipulaciones, deberías hacer que una "máquina" caiga correctamente al piso, que rueda levemente al presionar en el modo de juego, donde por defecto corres en un controlador separado con una vista en primera persona.



Escribir un guión de control



Tenemos un espacio en blanco de la "máquina de escribir", ahora escribiremos un código de control en C #.
Para hacer esto, haga clic derecho en la ventana debajo de la escena y seleccione Crear > Crear componente C # . Ingrese el nombre del script en la ventana que aparece.





Haga doble clic en el archivo de script que aparece y se inicia el entorno de desarrollo.



Seleccione las líneas llenas de azul en la imagen, elimínelas y, en su lugar, agregue el siguiente código al que se me ocurrió editando el script propuesto en la documentación:

Fragmento 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.


Después de eso, guarde el archivo de script y regrese a la ventana del editor. Unigine verificará el programa en busca de errores, y si todo está bien, entonces debería aparecer un rectángulo verde en la parte inferior derecha con la notificación La construcción del proyecto fue exitosa.

Ahora seleccione Cuboide, agregue el campo componente y arrastre nuestro script allí. Aparecen algunos campos que deben completarse. En el campo Target Wheel L, arrastre suavemente la rueda trasera izquierda (es decir, el cilindro que lo denota), Target Whell R - la rueda trasera derecha, Target FWL - la parte delantera izquierda, Target FWR - la parte delantera derecha, y el propio Cuboid en el campo Target Car.


Para agregar un componente, encontramos este campo en las propiedades de Cuboid y hacemos clic en él.


Aparecerá una línea vacía donde puede arrastrar el archivo de script (o encontrar la ruta a través del icono de carpeta)


Rellene los campos

Ejecutar Jugar: ahora la máquina comenzó a moverse. Es cierto, simultáneamente con el personaje en cuyo nombre ahora estás mirando el mundo.

Su control es el siguiente: W - rueda hacia adelante, S - hacia atrás, A y D - gira las ruedas delanteras hacia la izquierda y hacia la derecha, respectivamente. Se le da un impulso a Q , la máquina, por así decirlo, salta. En E , por el contrario, el impulso se mueve hacia abajo.

Puede notar que la máquina cae un poco lentamente, como en la luna. Para mejorar este momento hay dos opciones. La documentación sugería realizar cambios en el archivo AppWorldLogic.cs. Pero no necesitamos esto, ya que realicé la inicialización allí en el script de máquina de escribir. Excepto algunas líneas que rigen la física global.

El hecho es que puede ingresar independientemente estas configuraciones y cambiarlas. Para hacer esto, haga clic en la línea superior del editor. Windows> Configuración, en la ventana que se abre, busque la columna Física y establezca el valor de Velocidad lineal congelada en 0.1, para Velocidad angular congelada también 0.1, y cambie el vector de gravedad más bajo de (0,0, -9,8) a (0,0, - 19.6).

Lo mismo se puede hacer en el código agregando las siguientes líneas a Init:

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

Si comienzas a Jugar ahora, entonces la "máquina" probablemente se deteriorará nuevamente y comenzará a fallar. Para solucionar esto, intente girar un resorte lineal en cada rueda. Levanta dos veces para empezar. Cuando configures, notarás que la gravedad durante los saltos es más fuerte (aunque por defecto configuro el impulso de salto bastante alto).

Ahora que ya se ha mojado al configurar este carro cambiante, es hora de soltar los grilletes de firts_person_controller y observar lo que sucede desde el costado de la máquina, con una cámara en tercera persona.
Descarga desactivada first_person_controller (haga clic en el cuadro al lado de su nombre para que quede vacío).
Crea una cámara. Para hacer esto, haga clic derecho en la escena y seleccione Crear> Cámara> Presentador. Aparecerá la cámara PlayerPresecutor y su objetivo ficticio Presecutor_Target.
El maniquí se puede apagar. Hacemos clic en la cámara en sí, asegúrese de marcar la casilla de verificación del reproductor principal en sus propiedades (para no obtener una pantalla negra al inicio). En el campo Nodo de destino, encontramos nuestro Cuboide en la lista desplegable.

Guarda y haz clic en Reproducir.

Ahora puedes cabalgar por completo. Es cierto que la cámara puede volar bastante lejos. Para solucionar esto, debe ajustar sus límites. Volvemos al editor y establecemos las propiedades de la cámara, por ejemplo, Distancia mínima 10 y Distancia máxima 30.

Neungers en el motor Unigine


Después de haber aprendido a recopilar la física aproximada de las ruedas, hice una escena de prueba con un modelo de bio-mechos de mi proyecto Nevanger. Así es como se ve en este momento:



Capturas de pantalla







Los principales problemas en este momento son cierta inestabilidad del diseño. Lo cual se debe nuevamente al hecho de que aún no he entendido completamente todos los aspectos y matices de la configuración. A veces, la máquina tropieza con algo y comienza a girar ferozmente. La reducción de la amortiguación lineal no parece ayudar mucho, torciendo los otros parámetros también, aunque todavía no he torcido o configurado algo, pero no es exhaustivo.

Otro error: hay situaciones con total atascado en el piso, cuando las ruedas delanteras se pegan y la trasera debajo del paisaje. O atravesar el paisaje a gran velocidad, seguido de volar bajo él. Todo esto, aparentemente, se corrige estableciendo tolerancias e iteraciones, pero hasta ahora no ha encontrado los valores óptimos.

En general, en una superficie bastante plana, el movimiento ya es más adecuado. No está claro qué tan bien se comportan las articulaciones de las ruedas en una superficie irregular idealmente, como entendí en las demostraciones de video del motor para los automóviles que usaron obsoletos (aparentemente), pero más físicamente "honestas". , todo es algo más fácil allí). Las articulaciones de las ruedas tienen en cuenta los parámetros de fricción del paisaje, o solo les interesa saber si la bandera de física está activada.

Impresiones generales del motor.


En cuanto a trabajar con el editor, lo que sucedió más me recordó el proceso de trabajar con CryEngine. Aunque en algunos lugares es más conveniente. Pero es como alguien, en el mismo CryEngine era posible modelar directamente en el editor. Esto no es relevante para mí, porque para esto uso Blender, donde tienes órdenes de magnitud más control sobre el modelo, y para alguien puede ser importante.

En la imagen a continuación, se ve una lista de materiales a la izquierda. Las mallas se pintan a través de un grupo de materiales basados ​​en malla, desde los cuales puede clonar sus opciones de material. Pintar un terreno con una textura ya es más difícil, pero las máscaras se usan por completo: puede mezclar texturas, mapas de altura, etc., si comprende el dispositivo. Para la misma agua, hay su propio grupo separado de materiales, se agrega literalmente en un clic y se ve bastante bien.

A la derecha está la jerarquía de objetos de escena y la ventana de propiedades. Es un poco inconveniente manipular los valores numéricos sobre la marcha: debe ingresar al icono con flechas pequeñas. Algunos controles deslizantes son inicialmente engañosos, porque no muestran todo el rango posible del parámetro, pero, por ejemplo, solo el intervalo de 0 a 1. La velocidad de vuelo de la cámara se regula en el campo con el hombre corriendo en la parte superior, por defecto, de alguna manera se mueve lentamente, a juzgar por las sensaciones . Quizás esto sea más conveniente cuando trabajas con modelos a escala real.


All Articles