Skip to content

Commit

Permalink
[2hr] added verlet integration gravity and collision
Browse files Browse the repository at this point in the history
  • Loading branch information
JudahDoupe committed Oct 11, 2023
1 parent 008bc43 commit 26231e9
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 15 deletions.
20 changes: 16 additions & 4 deletions Assets/Plants/ECS/Components/Physics/PhysicsComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,17 @@ public struct PhysicsBody : IComponentData
{
public float Mass;

// Force and Velocity ar in world space
public float3 Force;
public float3 Velocity;
public float3 PreviousPosition;
// All in world space
public float PrevTimeStep;
public float3 PrevPosition;
public float3 Position;
public float3 Acceleration;
public float3 Displacement => Position - PrevPosition;
public float3 Velocity => Displacement / PrevTimeStep;
public void AddAcceleration(float3 acceleration) => Acceleration += acceleration;
public void AddForce(float3 force) => Acceleration += force * Mass;
public void AddVelocity(float3 velocity) => PrevPosition -= velocity * PrevTimeStep;
public void SetVelocity(float3 velocity) => PrevPosition = Position - velocity * PrevTimeStep;
}

public class PhysicsComponent : MonoBehaviour
Expand All @@ -22,9 +29,14 @@ public class PhysicsComponentBaker : Baker<PhysicsComponent>
public override void Bake(PhysicsComponent authoring)
{
var e = GetEntity(TransformUsageFlags.Dynamic);
var position = authoring.transform.position;
AddComponent(e, new PhysicsBody
{
Mass = authoring.Mass,
Position = position,
PrevPosition = position,
Acceleration = float3.zero,
PrevTimeStep = 1,
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

public struct CollisionResponse : IComponentData
{
public float3 VelocityAdjustment;
public float3 PositionAdjustment;
public float3 VelocityAdjustment;
}

public struct SphereCollider : IComponentData
Expand Down
4 changes: 3 additions & 1 deletion Assets/Plants/ECS/Systems/Physics/CollisionSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,9 @@ private void Execute(RefRW<PhysicsBody> physics,
CollisionAspect collision)
{
transform.ValueRW.TranslateWorld(worldTransform, collision.PositionAdjustment);
physics.ValueRW.Velocity += collision.VelocityAdjustment;
physics.ValueRW.Position += collision.PositionAdjustment;
physics.ValueRW.PrevPosition += collision.PositionAdjustment;
physics.ValueRW.AddVelocity(collision.VelocityAdjustment);

collision.Clear();
}
Expand Down
3 changes: 2 additions & 1 deletion Assets/Plants/ECS/Systems/Physics/ContraintSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public void OnDestroy(ref SystemState state) { }
[BurstCompile]
public void OnUpdate(ref SystemState state)
{
return;
if (!_haveTransformsInitialized)
{
_haveTransformsInitialized = true;
Expand Down Expand Up @@ -119,7 +120,7 @@ private void Execute(RefRW<ConstraintResponse> constraint,
LocalToWorld worldTransform)
{
localTransform.ValueRW.TranslateWorld(worldTransform, constraint.ValueRO.PositionAdjustment);
physics.ValueRW.Velocity += constraint.ValueRO.PositionAdjustment / TimeStep;
physics.ValueRW.Position += constraint.ValueRO.PositionAdjustment;

constraint.ValueRW.PositionAdjustment = float3.zero;
}
Expand Down
2 changes: 1 addition & 1 deletion Assets/Plants/ECS/Systems/Physics/GravitySystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ public partial struct AddGravity : IJobEntity
[BurstCompile]
private void Execute(RefRW<PhysicsBody> physics)
{
physics.ValueRW.Force += new float3(0, -9.8f, 0) * physics.ValueRO.Mass;
physics.ValueRW.AddAcceleration(new float3(0, -9.8f, 0));
}
}
7 changes: 4 additions & 3 deletions Assets/Plants/ECS/Systems/Physics/SpringSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public void OnCreate(ref SystemState state)
[BurstCompile]
public void OnUpdate(ref SystemState state)
{
return;
if (!_haveTransformsInitialized)
{
_haveTransformsInitialized = true;
Expand All @@ -42,8 +43,8 @@ private void Execute(RefRW<PhysicsBody> physics,
LocalToWorld worldTransform,
SpringJoint spring)
{
var springForce = -spring.Stiffness * worldTransform.LocalToWorldVector(localTransform.Position - spring.EquilibriumPosition);
var dampingForce = -spring.Dampening * physics.ValueRO.Velocity;
physics.ValueRW.Force += springForce + dampingForce;
//var springForce = -spring.Stiffness * worldTransform.LocalToWorldVector(localTransform.Position - spring.EquilibriumPosition);
//var dampingForce = -spring.Dampening * physics.ValueRO.Velocity;
//physics.ValueRW.Acceleration += springForce + dampingForce;
}
}
11 changes: 7 additions & 4 deletions Assets/Plants/ECS/Systems/Physics/VelocityIntegrationSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,12 @@ private void Execute(RefRW<PhysicsBody> physics,
RefRW<LocalTransform> localTransform,
LocalToWorld worldTransform)
{
physics.ValueRW.PreviousPosition = worldTransform.Position;
physics.ValueRW.Velocity += physics.ValueRO.Force / physics.ValueRO.Mass * TimeStep;
localTransform.ValueRW.TranslateWorld(worldTransform, physics.ValueRO.Velocity * TimeStep);
physics.ValueRW.Force = 0;
var totalDisplacement = physics.ValueRO.Displacement + physics.ValueRO.Acceleration * (TimeStep * TimeStep);
physics.ValueRW.PrevPosition = physics.ValueRO.Position;
physics.ValueRW.Position += totalDisplacement;
physics.ValueRW.Acceleration = 0;
physics.ValueRW.PrevTimeStep = TimeStep;

localTransform.ValueRW.TranslateWorld(worldTransform, totalDisplacement);
}
}

0 comments on commit 26231e9

Please sign in to comment.