Physics



Physics

En este tutorial experimentaremos cómo funciona la física dentro de GBEngine, la física se representa como objetos en el editor, los objetos de física no tienen una representación visual, solo se utilizan para simulaciones de física.

La física en GBEngine está impulsada por cannon.js desarrollado por schteppe, para obtener más información sobre el motor de física, consulte el archivo cannon.js

El editor encapsula los cuerpos físicos en objetos, estos cuerpos se administran y actualizan por escena, la configuración física se administra por escena.


Physics object

Para agregar un objeto de física, seleccione el objeto de física deseado en la barra de herramientas izquierda y agréguelo a la escena, luego agregue un objeto de malla como hijos del objeto de física recién creado para hacerlo visible en la escena. No olvide agregar un objeto terrestre para que otros objetos físicos no se caigan de la pantalla.

Los objetos físicos se pueden configurar como objetos dinámicos, estáticos o cinemáticos. Los objetos dinámicos se actualizan dinámicamente y detectan colisiones, los objetos cinemáticos se actualizan solo en función de su velocidad y los objetos estáticos no se actualizan en absoluto. Los objetos estáticos se comportan como las paredes o el suelo.




Object positioning

Hay una propiedad de modo que indica cómo se transforman las coordenadas físicas del mundo de la física a la escena, el mundo de la física no considera las transformaciones parentales aplicadas a los objetos, el posicionamiento mundial se usa para copiar las coordenadas mundiales de la física al objeto es rápido y las coordenadas coincidirán con los valores almacenados en el cuerpo de física. A veces es útil almacenar objetos físicos en la jerarquía. El posicionamiento local se puede utilizar para adaptar las coordenadas físicas del mundo para que coincidan con la escena, tiene un pequeño impacto en el rendimiento y las coordenadas físicas no coincidirán con la transformación local del objeto.

A continuación tenemos una comparación entre objetos físicos posicionados en el mundo y localmente dentro de una jerarquía de objetos. Como podemos observar, el objeto posicionado local se comporta como era de esperar.


Physics GBEngine Demo

Physics object control

Para interactuar con objetos físicos mediante secuencias de comandos, necesitamos adjuntar el cuerpo físico a ese objeto. Luego, podemos acceder a la propiedad del cuerpo que existe en cada objeto físico y cambiar los valores de fuerzas, aceleración y velocidad para que se mueva por la escena.

El siguiente código obtiene un cuerpo de objeto físico y usando las teclas WASD del teclado y la barra espaciadora agregamos velocidad a ese cuerpo forzando al cubo a moverse.


var body;

this.initialize = function()
{
	body = scene.getObjectByName("physics").body;
};

this.update = function()
{
	if(Keyboard.keyPressed(Keyboard.A))
	{
		body.velocity.x -= 0.2;
	}
	if(Keyboard.keyPressed(Keyboard.D))
	{
		body.velocity.x += 0.2;
	}
	if(Keyboard.keyPressed(Keyboard.W))
	{
		body.velocity.z -= 0.2;
	}
	if(Keyboard.keyPressed(Keyboard.S))
	{
		body.velocity.z += 0.2;
	}

	if(Keyboard.keyJustPressed(Keyboard.SPACEBAR))
	{
		body.velocity.y += 5;
	}
};

El código que se muestra arriba se puede ver corriendo a continuación para un cubo de física, use las teclas WASD para controlar el cubo y la barra espaciadora para hacer que el cubo salte. Incluso cuando no especificamos la rotación para el cubo, el motor de física la calcula automáticamente en función de la fricción entre la superficie del cubo y el piso. Como podemos observar, el cubo da vueltas por la escena de forma natural.


Physics Move GBEngine Demo

También es posible detectar colisiones, puntos de contacto y explorar el estado completo de la simulación física. Puede acceder al mundo de la física desde el objeto de escena y, desde allí, adjuntar eventListeners para acceder a los datos después de cada paso de simulación, por ejemplo.

var world = scene.world;
world.addEventListener("postStep", function(e)
{
	if(world.contacts.length > 0)
	{
		for(var i = 0; i < world.contacts.length; i++)
		{
			var contact = world.contacts[i];

			// Check collision between a and b
			if(contact.bi === a || contact.bj === b)
			{
				// ...
			}
		}
	}
}











NUESTROS Partners
image
Official

MANTENTE CONECTADO

Twitch
image image
Facebook
image image
Twitter
image image
YouTube
image image
Instagram
image image
Vimeo
image image