Using Physics Bodies
This is a small step-by-step guide to cover a variety of physics bodies. This is easy to replicate in Evergine Studio.
1. Create a Pile of Rigid Bodies
In the following example, we will create a simple pile of 10 rigid bodies and a static body as a floor:
protected override void CreateScene()
{
// Load your material
var cubeMaterial = this.Managers.AssetSceneManager.Load<Material>(EvergineContent.Materials.CubeMaterial);
var floorMaterial = this.Managers.AssetSceneManager.Load<Material>(DefaultResourcesIDs.DefaultMaterialID);
// Create the floor
this.CreateFloor(floorMaterial);
// Create 10 cubes
for (int i = 0; i < 10; i++)
{
this.SpawnCube(cubeMaterial, new Vector3(0, 1 + i, 0), 0.5f);
}
}
private void CreateFloor(Material material)
{
Entity cube = new Entity()
.AddComponent(new Transform3D())
.AddComponent(new MaterialComponent() { Material = material })
.AddComponent(new PlaneMesh() { Width = 10, Height = 10 }) // Create a 10x10 floor plane
.AddComponent(new MeshRenderer())
.AddComponent(new StaticBody3D()) // Add a StaticBody component...
.AddComponent(new BoxCollider3D()); // Add a BoxCollider3D to the physics body...
this.Managers.EntityManager.Add(cube);
}
private void SpawnCube(Material material, Vector3 position, float size)
{
Entity cube = new Entity()
.AddComponent(new Transform3D()
{
Position = position
})
.AddComponent(new MaterialComponent() { Material = material })
.AddComponent(new CubeMesh() { Size = size })
.AddComponent(new MeshRenderer())
.AddComponent(new RigidBody3D()) // Add a RigidBody3D component...
.AddComponent(new BoxCollider3D()); // Add a BoxCollider3D to the physics body...
this.Managers.EntityManager.Add(cube);
}
2. Adding a Kinematic Body
In this step, we will add a kinematic body to the scene and add a simple shake movement:
Add the following code to your scene:
protected override void CreateScene()
{
// Previous code of step 1...
// Create a kinematic body
this.CreateKinematic();
}
private void CreateKinematic()
{
// Load your material
var material = this.Managers.AssetSceneManager.Load<Material>(EvergineContent.Materials.Kinematic);
Entity cube = new Entity()
.AddComponent(new Transform3D()
{
Position = new Vector3(0, 0.5f, 0)
})
.AddComponent(new MaterialComponent() { Material = material })
.AddComponent(new CubeMesh() { Size = 1 })
.AddComponent(new MeshRenderer())
.AddComponent(new RigidBody3D() // Add a RigidBody3D component...
{
PhysicBodyType = RigidBodyType3D.Kinematic // Kinematic rigid body...
})
.AddComponent(new BoxCollider3D()) // Add a BoxCollider3D to the physics body...
.AddComponent(new ShakeKinematic()); // Add a behavior that moves this entity...
this.Managers.EntityManager.Add(cube);
}
This is the ShakeKinematic
component, which moves the entity:
public class ShakeKinematic : Behavior
{
[BindComponent]
public Transform3D transform;
[BindService]
public Clock clock;
private Vector3 initPosition;
protected override void Start()
{
base.Start();
this.initPosition = this.transform.Position;
}
protected override void Update(TimeSpan gameTime)
{
this.transform.Position = initPosition + new Vector3((float)Math.Cos(5 * clock.TotalTime.TotalSeconds), 0, 0);
}
}