4 using System.Collections.Generic;
7 using SiliconStudio.Core.Mathematics;
8 using SiliconStudio.Paradox.Engine.Data;
9 using SiliconStudio.Paradox.Graphics;
15 BulletSharp.DiscreteDynamicsWorld discreteDynamicsWorld;
17 BulletSharp.CollisionWorld collisionWorld;
19 BulletSharp.CollisionDispatcher dispatcher;
20 BulletSharp.CollisionConfiguration collisionConfiguration;
21 BulletSharp.DbvtBroadphase broadphase;
23 BulletSharp.ContactSolverInfo solverInfo;
24 BulletSharp.DispatcherInfo dispatchInfo;
28 public bool ContinuousCollisionDetection
34 throw new Exception(
"ContinuousCollisionDetection must be enabled at physics engine initialization using the proper flag.");
37 return dispatchInfo.UseContinuous;
43 throw new Exception(
"ContinuousCollisionDetection must be enabled at physics engine initialization using the proper flag.");
46 dispatchInfo.UseContinuous = value;
58 public bool CreateDebugPrimitives =
false;
63 public bool RenderDebugPrimitives =
false;
68 public bool DisableSimulation =
false;
81 static bool convertersDone;
93 convertersDone =
true;
104 Core.NativeLibrary.PreloadLibrary(
"libbulletc.dll");
108 InitializeConverters();
114 collisionConfiguration =
new BulletSharp.DefaultCollisionConfiguration();
115 dispatcher =
new BulletSharp.CollisionDispatcher(collisionConfiguration);
116 broadphase =
new BulletSharp.DbvtBroadphase();
119 broadphase.OverlappingPairCache.SetInternalGhostPairCallback(
new BulletSharp.GhostPairCallback());
122 var simplex =
new BulletSharp.VoronoiSimplexSolver();
123 var pdSolver =
new BulletSharp.MinkowskiPenetrationDepthSolver();
124 var convexAlgo =
new BulletSharp.Convex2DConvex2DAlgorithm.CreateFunc(simplex, pdSolver);
126 dispatcher.RegisterCollisionCreateFunc(BulletSharp.BroadphaseNativeType.Convex2DShape, BulletSharp.BroadphaseNativeType.Convex2DShape, convexAlgo);
127 dispatcher.RegisterCollisionCreateFunc(BulletSharp.BroadphaseNativeType.Box2DShape, BulletSharp.BroadphaseNativeType.Convex2DShape, convexAlgo);
128 dispatcher.RegisterCollisionCreateFunc(BulletSharp.BroadphaseNativeType.Convex2DShape, BulletSharp.BroadphaseNativeType.Box2DShape, convexAlgo);
129 dispatcher.RegisterCollisionCreateFunc(BulletSharp.BroadphaseNativeType.Box2DShape, BulletSharp.BroadphaseNativeType.Box2DShape,
new BulletSharp.Box2DBox2DCollisionAlgorithm.CreateFunc());
133 var solver =
new BulletSharp.SequentialImpulseConstraintSolver();
137 collisionWorld =
new BulletSharp.CollisionWorld(dispatcher, broadphase, collisionConfiguration);
144 throw new NotImplementedException(
"SoftBody processing is not yet available");
148 discreteDynamicsWorld =
new BulletSharp.DiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
149 collisionWorld = discreteDynamicsWorld;
152 if (discreteDynamicsWorld != null)
154 solverInfo = discreteDynamicsWorld.SolverInfo;
155 dispatchInfo = discreteDynamicsWorld.DispatchInfo;
157 solverInfo.SolverMode |= BulletSharp.SolverModes.CacheFriendly;
162 solverInfo.SolverMode |= BulletSharp.SolverModes.Use2FrictionDirections | BulletSharp.SolverModes.RandomizeOrder;
163 dispatchInfo.UseContinuous =
true;
167 BulletSharp.PersistentManifold.ContactProcessed += PersistentManifoldContactProcessed;
168 BulletSharp.PersistentManifold.ContactDestroyed += PersistentManifoldContactDestroyed;
175 static void PersistentManifoldContactDestroyed(
object userPersistantData)
177 var contact = (
Contact)userPersistantData;
180 var colA = contact.ColliderA;
181 var colB = contact.ColliderB;
183 colA.Contacts.Remove(contact);
184 colB.Contacts.Remove(contact);
186 var colAEnded =
false;
187 var previousColAState = colA.Contacts.Where(x => (x.ColliderA == colA && x.ColliderB == colB) || (x.ColliderA == colB && x.ColliderB == colA));
188 if (!previousColAState.Any()) colAEnded =
true;
190 var colBEnded =
false;
191 var previousColBState = colB.Contacts.Where(x => (x.ColliderB == colB && x.ColliderA == colA) || (x.ColliderB == colA && x.ColliderA == colB));
192 if (!previousColBState.Any()) colBEnded =
true;
194 if(colAEnded) colA.PropagateOnLastContactEnd(args);
195 colA.PropagateOnContactEnd(args);
197 if(colBEnded) colB.PropagateOnLastContactEnd(args);
198 colB.PropagateOnContactEnd(args);
201 static void PersistentManifoldContactProcessed(BulletSharp.ManifoldPoint cp, BulletSharp.CollisionObject body0, BulletSharp.CollisionObject body1)
203 var colA = (Collider)body0.UserObject;
204 var colB = (Collider)body1.UserObject;
206 if (!colA.NeedsCollisionCheck && !colB.NeedsCollisionCheck)
return;
208 if (cp.UserPersistentData == null)
210 var contact =
new Contact
214 Distance = cp.Distance,
215 PositionOnA =
new Vector3(cp.PositionWorldOnA.X, cp.PositionWorldOnA.Y, cp.PositionWorldOnA.Z),
216 PositionOnB =
new Vector3(cp.PositionWorldOnB.X, cp.PositionWorldOnB.Y, cp.PositionWorldOnB.Z),
217 Normal =
new Vector3(cp.NormalWorldOnB.X, cp.NormalWorldOnB.Y, cp.NormalWorldOnB.Z)
221 var colABegan =
false;
222 var previousColAState = colA.Contacts.Where(x => (x.ColliderA == colA && x.ColliderB == colB) || (x.ColliderA == colB && x.ColliderB == colA));
223 if (!previousColAState.Any()) colABegan =
true;
225 var colBBegan =
false;
226 var previousColBState = colB.Contacts.Where(x => (x.ColliderB == colB && x.ColliderA == colA) || (x.ColliderB == colA && x.ColliderA == colB));
227 if (!previousColBState.Any()) colBBegan =
true;
229 colA.Contacts.Add(contact);
230 colB.Contacts.Add(contact);
232 var args =
new CollisionArgs { Contact = contact };
234 cp.UserPersistentData = contact;
236 if(colABegan) colA.PropagateOnFirstContactBegin(args);
237 colA.PropagateOnContactBegin(args);
239 if(colBBegan) colB.PropagateOnFirstContactBegin(args);
240 colB.PropagateOnContactBegin(args);
244 var contact = (Contact)cp.UserPersistentData;
247 contact.PositionOnA =
new Vector3(cp.PositionWorldOnA.X, cp.PositionWorldOnA.Y, cp.PositionWorldOnA.Z);
248 contact.PositionOnB =
new Vector3(cp.PositionWorldOnB.X, cp.PositionWorldOnB.Y, cp.PositionWorldOnB.Z);
249 contact.Normal =
new Vector3(cp.NormalWorldOnB.X, cp.NormalWorldOnB.Y, cp.NormalWorldOnB.Z);
251 var args =
new CollisionArgs { Contact = contact };
253 colA.PropagateOnContactChange(args);
254 colB.PropagateOnContactChange(args);
264 if (discreteDynamicsWorld != null) discreteDynamicsWorld.Dispose();
265 else if (collisionWorld != null) collisionWorld.Dispose();
267 if (broadphase != null) broadphase.Dispose();
268 if (dispatcher != null) dispatcher.Dispose();
269 if (collisionConfiguration != null) collisionConfiguration.Dispose();
281 InternalCollider =
new BulletSharp.CollisionObject
283 CollisionShape = shape.InternalShape,
284 ContactProcessingThreshold = 1e18f
288 collider.InternalCollider.CollisionFlags |= BulletSharp.CollisionFlags.NoContactResponse;
290 if (shape.NeedsCustomCollisionCallback)
292 collider.InternalCollider.CollisionFlags |= BulletSharp.CollisionFlags.CustomMaterialCallback;
295 collider.InternalCollider.UserObject = collider;
296 collider.Engine =
this;
310 rb.InternalRigidBody =
new BulletSharp.RigidBody(0.0f, rb.MotionState, collider.InternalShape, Vector3.Zero);
311 rb.InternalRigidBody.CollisionFlags |= BulletSharp.CollisionFlags.StaticObject;
313 rb.InternalCollider = rb.InternalRigidBody;
315 rb.InternalCollider.ContactProcessingThreshold = 1e18f;
317 if (collider.NeedsCustomCollisionCallback)
319 rb.InternalCollider.CollisionFlags |= BulletSharp.CollisionFlags.CustomMaterialCallback;
324 rb.InternalRigidBody.LinearFactor =
new Vector3(1.0f, 1.0f, 0.0f);
325 rb.InternalRigidBody.AngularFactor =
new Vector3(0.0f, 0.0f, 1.0f);
328 rb.InternalRigidBody.UserObject = rb;
344 InternalCollider =
new BulletSharp.PairCachingGhostObject
346 CollisionShape = collider.InternalShape
350 ch.InternalCollider.CollisionFlags |= BulletSharp.CollisionFlags.CharacterObject;
352 if (collider.NeedsCustomCollisionCallback)
354 ch.InternalCollider.CollisionFlags |= BulletSharp.CollisionFlags.CustomMaterialCallback;
357 ch.InternalCollider.ContactProcessingThreshold = 1e18f;
359 ch.KinematicCharacter =
new BulletSharp.KinematicCharacterController((BulletSharp.PairCachingGhostObject)ch.InternalCollider, (BulletSharp.ConvexShape)collider.InternalShape, stepHeight);
361 ch.InternalCollider.UserObject = ch;
373 collisionWorld.AddCollisionObject(collider.InternalCollider);
393 collisionWorld.RemoveCollisionObject(collider.InternalCollider);
403 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
405 discreteDynamicsWorld.AddRigidBody(rigidBody.InternalRigidBody);
417 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
419 discreteDynamicsWorld.AddRigidBody(rigidBody.InternalRigidBody, (short)group, (
short)mask);
429 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
431 discreteDynamicsWorld.RemoveRigidBody(rigidBody.InternalRigidBody);
441 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
443 var collider = character.InternalCollider;
444 var action = character.KinematicCharacter;
445 discreteDynamicsWorld.AddCollisionObject(collider, BulletSharp.CollisionFilterGroups.CharacterFilter);
446 discreteDynamicsWorld.AddCharacter(action);
458 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
460 var collider = character.InternalCollider;
461 var action = character.KinematicCharacter;
463 discreteDynamicsWorld.AddCharacter(action);
473 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
475 var collider = character.InternalCollider;
476 var action = character.KinematicCharacter;
477 discreteDynamicsWorld.RemoveCollisionObject(collider);
478 discreteDynamicsWorld.RemoveCharacter(action);
498 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
499 if (rigidBodyA == null)
throw new Exception(
"Both RigidBodies must be valid");
501 var rbA = rigidBodyA.InternalRigidBody;
505 case ConstraintTypes.Point2Point:
509 InternalPoint2PointConstraint =
new BulletSharp.Point2PointConstraint(rbA, frameA.TranslationVector),
511 RigidBodyA = rigidBodyA,
514 constraint.InternalConstraint = constraint.InternalPoint2PointConstraint;
516 rigidBodyA.LinkedConstraints.Add(constraint);
518 constraint.Engine =
this;
522 case ConstraintTypes.Hinge:
526 InternalHingeConstraint =
new BulletSharp.HingeConstraint(rbA, frameA, useReferenceFrameA),
528 RigidBodyA = rigidBodyA,
531 constraint.InternalConstraint = constraint.InternalHingeConstraint;
533 rigidBodyA.LinkedConstraints.Add(constraint);
535 constraint.Engine =
this;
539 case ConstraintTypes.Slider:
543 InternalSliderConstraint =
new BulletSharp.SliderConstraint(rbA, frameA, useReferenceFrameA),
545 RigidBodyA = rigidBodyA,
548 constraint.InternalConstraint = constraint.InternalSliderConstraint;
550 rigidBodyA.LinkedConstraints.Add(constraint);
552 constraint.Engine =
this;
556 case ConstraintTypes.ConeTwist:
560 InternalConeTwistConstraint =
new BulletSharp.ConeTwistConstraint(rbA, frameA),
562 RigidBodyA = rigidBodyA
565 constraint.InternalConstraint = constraint.InternalConeTwistConstraint;
567 rigidBodyA.LinkedConstraints.Add(constraint);
569 constraint.Engine =
this;
573 case ConstraintTypes.Generic6DoF:
577 InternalGeneric6DofConstraint =
new BulletSharp.Generic6DofConstraint(rbA, frameA, useReferenceFrameA),
579 RigidBodyA = rigidBodyA
582 constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint;
584 rigidBodyA.LinkedConstraints.Add(constraint);
586 constraint.Engine =
this;
590 case ConstraintTypes.Generic6DoFSpring:
594 InternalGeneric6DofSpringConstraint =
new BulletSharp.Generic6DofSpringConstraint(rbA, frameA, useReferenceFrameA),
596 RigidBodyA = rigidBodyA
599 constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint = constraint.InternalGeneric6DofSpringConstraint;
601 rigidBodyA.LinkedConstraints.Add(constraint);
603 constraint.Engine =
this;
607 case ConstraintTypes.Gear:
609 throw new Exception(
"A Gear constraint always needs two rigidbodies to be created.");
633 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
634 if (rigidBodyA == null || rigidBodyB == null)
throw new Exception(
"Both RigidBodies must be valid");
636 var rbA = rigidBodyA.InternalRigidBody;
637 var rbB = rigidBodyB.InternalRigidBody;
641 case ConstraintTypes.Point2Point:
645 InternalPoint2PointConstraint =
new BulletSharp.Point2PointConstraint(rbA, rbB, frameA.TranslationVector, frameB.TranslationVector),
647 RigidBodyA = rigidBodyA,
648 RigidBodyB = rigidBodyB
651 constraint.InternalConstraint = constraint.InternalPoint2PointConstraint;
653 rigidBodyA.LinkedConstraints.Add(constraint);
654 rigidBodyB.LinkedConstraints.Add(constraint);
656 constraint.Engine =
this;
660 case ConstraintTypes.Hinge:
664 InternalHingeConstraint =
new BulletSharp.HingeConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA),
666 RigidBodyA = rigidBodyA,
667 RigidBodyB = rigidBodyB
670 constraint.InternalConstraint = constraint.InternalHingeConstraint;
672 rigidBodyA.LinkedConstraints.Add(constraint);
673 rigidBodyB.LinkedConstraints.Add(constraint);
675 constraint.Engine =
this;
679 case ConstraintTypes.Slider:
683 InternalSliderConstraint =
new BulletSharp.SliderConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA),
685 RigidBodyA = rigidBodyA,
686 RigidBodyB = rigidBodyB
689 constraint.InternalConstraint = constraint.InternalSliderConstraint;
691 rigidBodyA.LinkedConstraints.Add(constraint);
692 rigidBodyB.LinkedConstraints.Add(constraint);
694 constraint.Engine =
this;
698 case ConstraintTypes.ConeTwist:
702 InternalConeTwistConstraint =
new BulletSharp.ConeTwistConstraint(rbA, rbB, frameA, frameB),
704 RigidBodyA = rigidBodyA,
705 RigidBodyB = rigidBodyB
708 constraint.InternalConstraint = constraint.InternalConeTwistConstraint;
710 rigidBodyA.LinkedConstraints.Add(constraint);
711 rigidBodyB.LinkedConstraints.Add(constraint);
713 constraint.Engine =
this;
717 case ConstraintTypes.Generic6DoF:
721 InternalGeneric6DofConstraint =
new BulletSharp.Generic6DofConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA),
723 RigidBodyA = rigidBodyA,
724 RigidBodyB = rigidBodyB
727 constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint;
729 rigidBodyA.LinkedConstraints.Add(constraint);
730 rigidBodyB.LinkedConstraints.Add(constraint);
732 constraint.Engine =
this;
736 case ConstraintTypes.Generic6DoFSpring:
740 InternalGeneric6DofSpringConstraint =
new BulletSharp.Generic6DofSpringConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA),
742 RigidBodyA = rigidBodyA,
743 RigidBodyB = rigidBodyB
746 constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint = constraint.InternalGeneric6DofSpringConstraint;
748 rigidBodyA.LinkedConstraints.Add(constraint);
749 rigidBodyB.LinkedConstraints.Add(constraint);
751 constraint.Engine =
this;
755 case ConstraintTypes.Gear:
759 InternalGearConstraint =
new BulletSharp.GearConstraint(rbA, rbB, frameA.TranslationVector, frameB.TranslationVector),
761 RigidBodyA = rigidBodyA,
762 RigidBodyB = rigidBodyB
765 constraint.InternalConstraint = constraint.InternalGearConstraint;
767 rigidBodyA.LinkedConstraints.Add(constraint);
768 rigidBodyB.LinkedConstraints.Add(constraint);
770 constraint.Engine =
this;
786 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
788 var c = constraint.InternalConstraint;
790 discreteDynamicsWorld.AddConstraint(c);
801 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
803 var c = constraint.InternalConstraint;
805 discreteDynamicsWorld.AddConstraint(c, disableCollisionsBetweenLinkedBodies);
815 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
817 var c = constraint.InternalConstraint;
819 discreteDynamicsWorld.RemoveConstraint(c);
832 using (var rcb =
new BulletSharp.ClosestRayResultCallback(from, to))
834 collisionWorld.RayTest(ref from, ref to, rcb);
836 if (rcb.CollisionObject == null)
return result;
837 result.Succeeded =
true;
838 result.Collider = (
Collider)rcb.CollisionObject.UserObject;
839 result.Normal = rcb.HitNormalWorld;
840 result.Point = rcb.HitPointWorld;
854 var result =
new List<HitResult>();
856 using (var rcb =
new BulletSharp.AllHitsRayResultCallback(from, to))
858 collisionWorld.RayTest(ref from, ref to, rcb);
860 var
count = rcb.CollisionObjects.Count;
862 for (var i = 0; i <
count; i++)
868 Normal = rcb.HitNormalWorld[i],
869 Point = rcb.HitPointWorld[i]
872 result.Add(singleResult);
889 var sh = shape.InternalShape as BulletSharp.ConvexShape;
890 if(sh == null)
throw new Exception(
"This kind of shape cannot be used for a ShapeSweep.");
894 using (var rcb =
new BulletSharp.ClosestConvexResultCallback(from.TranslationVector, to.TranslationVector))
896 collisionWorld.ConvexSweepTest(sh, from, to, rcb);
898 if (rcb.HitCollisionObject == null)
return result;
899 result.Succeeded =
true;
900 result.Collider = (
Collider)rcb.HitCollisionObject.UserObject;
901 result.Normal = rcb.HitNormalWorld;
902 result.Point = rcb.HitPointWorld;
918 var sh = shape.InternalShape as BulletSharp.ConvexShape;
919 if (sh == null)
throw new Exception(
"This kind of shape cannot be used for a ShapeSweep.");
921 var result =
new List<HitResult>();
923 using (var rcb =
new BulletSharp.AllHitsConvexResultCallback())
925 collisionWorld.ConvexSweepTest(sh, from, to, rcb);
927 var
count = rcb.CollisionObjects.Count;
928 for (var i = 0; i <
count; i++)
934 Normal = rcb.HitNormalWorld[i],
935 Point = rcb.HitPointWorld[i]
938 result.Add(singleResult);
951 public bool Initialized {
get;
private set; }
968 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
969 return discreteDynamicsWorld.Gravity;
973 if (discreteDynamicsWorld == null)
throw new Exception(
"Cannot perform this action when the physics engine is set to CollisionsOnly");
974 discreteDynamicsWorld.Gravity = value;
978 internal void Update(
float delta)
980 if (DisableSimulation)
return;
982 if (collisionWorld == null)
return;
984 if (discreteDynamicsWorld != null) discreteDynamicsWorld.StepSimulation(delta);
985 else collisionWorld.PerformDiscreteCollisionDetection();
void RemoveRigidBody(RigidBody rigidBody)
Removes the rigid body from the engine processing pipeline.
static void InitializeConverters()
Character CreateCharacter(ColliderShape collider, float stepHeight)
Creates the character.
void RemoveCollider(Collider collider)
Removes the collider from the engine processing pipeline.
Constraint CreateConstraint(ConstraintTypes type, RigidBody rigidBodyA, Matrix frameA, bool useReferenceFrameA=false)
Creates the constraint.
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ DXGI_FORMAT _In_ DWORD flags
bool Is2D
Gets a value indicating whether the collider shape is 2D.
Converter type for PhysicsComponent.
void Dispose()
Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resourc...
Represents a three dimensional mathematical vector.
Collider CreateCollider(ColliderShape shape)
Creates the collider.
void AddRigidBody(RigidBody rigidBody)
Adds the rigid body to the engine processing pipeline.
Performs primitive-based rendering, creates resources, handles system-level variables, adjusts gamma ramp levels, and creates shaders. See The+GraphicsDevice+class to learn more about the class.
void Initialize(PhysicsEngineFlags flags=PhysicsEngineFlags.None)
Initializes the Physics engine using the specified flags.
RigidBody CreateRigidBody(ColliderShape collider)
Creates the rigid body.
List< HitResult > RaycastPenetrating(Vector3 from, Vector3 to)
Raycasts penetrating any shape the ray encounters.
Structure using the same layout than System.Drawing.Point.
void AddConstraint(Constraint constraint)
Adds the constraint to the engine processing pipeline.
static void Distance(ref Vector3 value1, ref Vector3 value2, out float result)
Calculates the distance between two vectors.
void AddConstraint(Constraint constraint, bool disableCollisionsBetweenLinkedBodies)
Adds the constraint to the engine processing pipeline.
Constraint CreateConstraint(ConstraintTypes type, RigidBody rigidBodyA, RigidBody rigidBodyB, Matrix frameA, Matrix frameB, bool useReferenceFrameA=false)
Creates the constraint.
void AddCollider(Collider collider)
Adds the collider to the engine processing pipeline.
List< HitResult > ShapeSweepPenetrating(ColliderShape shape, Matrix from, Matrix to)
Pefrorms a sweep test using a collider shape and never stops until "to"
void RemoveCharacter(Character character)
Removes the character from the engine processing pipeline.
Converter type for PhysicsElement.
void AddCharacter(Character character, CollisionFilterGroups group, CollisionFilterGroups mask)
Adds the character to the engine processing pipeline.
void RemoveConstraint(Constraint constraint)
Removes the constraint from the engine processing pipeline.
using SiliconStudio.Paradox. Physics
SiliconStudio.Core.Mathematics.Vector3 Vector3
void AddCharacter(Character character)
Adds the character to the engine processing pipeline.
HitResult Raycast(Vector3 from, Vector3 to)
Raycasts and stops at the first hit.
HitResult ShapeSweep(ColliderShape shape, Matrix from, Matrix to)
Pefrorms a sweep test using a collider shape and stops at the first hit
void AddRigidBody(RigidBody rigidBody, CollisionFilterGroups group, CollisionFilterGroups mask)
Adds the rigid body to the engine processing pipeline.
void AddCollider(Collider collider, CollisionFilterGroups group, CollisionFilterGroups mask)
Adds the collider to the engine processing pipeline.
Represents a 4x4 mathematical matrix.