Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
1.0.0:physics [2023/03/16 09:00] – [Override Collider-Registration] admin1.0.0:physics [2023/03/16 14:18] (current) – [Override Collider-Registration] admin
Line 116: Line 116:
  
 On collider registration you push starting transformation information and shape data to the physics world: On collider registration you push starting transformation information and shape data to the physics world:
-  * AddBoxCollider() +^Method^ 
-  AddSphereCollider() +|procedure AddBoxCollider(const AControl : TControl3D; const APrefab : TGorillaColliderSettings);|Add a box collider for a specific TControl3D instance to the physics system. At first you will need to create a TGorillaColliderSettings structure, where to define the body type (static, dynamic, kinematic)| 
-  AddCapsuleCollider() +|procedure AddSphereCollider(const AControl : TControl3D; const APrefab : TGorillaColliderSettings);|Add a spherical collider for a specific TControl3D instance to the physics system. At first you will need to create a TGorillaColliderSettings structure, where to define the body type (static, dynamic, kinematic)| 
-  AddParticleCollider() +|procedure AddCapsuleCollider(const AControl : TControl3D; const APrefab : TGorillaColliderSettings; const ARadius, AHeight : Single);|Add a capsule collider for a specific TControl3D instance to the physics system. At first you will need to create a TGorillaColliderSettings structure, where to define the body type (static, dynamic, kinematic)| 
-  AddTerrainCollider() +|procedure AddParticleCollider(const AData : Pointer; const AType : PTypeInfo; const APrefab : TGorillaColliderSettings; const ATransformation : TMatrix3D; const ARadius : Single; out ABody : TQ3Body);|Add a particle collider for a specific pointer value to the physics system. At first you will need to create a TGorillaColliderSettings structure, where to define the body type (static, dynamic, kinematic). Also provide a starting transformation matrix and a radius of the particle. The procedure will return a TQ3Body instance as pointer which should be linked with your particle structure (AParticle). This method is automatically used by the physics particle influencer class.| 
-  AddMeshCollider()+|procedure AddTerrainCollider(const AMesh : TCustomMesh; const APrefab : TGorillaColliderSettings);|Add a terrain collider for a specific TCustomMesh (terrain) instance to the physics system. At first you will need to create a TGorillaColliderSettings structure, where to define the body type (static, dynamic, kinematic). Of course the body type is flexible, but for terrains you should use the static body type.| 
 +|procedure AddTerrainCollider(const ATerrain : TGorillaMesh; const APrefab : TGorillaColliderSettings);|Add a terrain collider for a specific TGorillaMesh instance to the physics system. At first you will need to create a TGorillaColliderSettings structure where to define the body type (static, dynamic, kinematic). Of course the body type is flexible, but for terrains you should use the static body type.| 
 +|procedure AddMeshCollider(const AMesh : TCustomMesh; const APrefab : TGorillaColliderSettings);|Add a capsule collider for a specific TCustomMesh instance to the physics system. At first you will need to create a TGorillaColliderSettings structure where to define the body type (static, dynamic, kinematic)| 
 +|procedure AddMeshCollider(const AMesh : TGorillaMesh; const APrefab : TGorillaColliderSettings);|Add a capsule collider for a specific TGorillaMesh instance to the physics system. At first you will need to create a TGorillaColliderSettings structure where to define the body type (static, dynamic, kinematic)|
  
 From there on the physics controller will compute transformation based on its own universe. From there on the physics controller will compute transformation based on its own universe.
Line 131: Line 134:
  
 Derived components of **TControl3D**, **TCustomMesh** and **TGorillaMesh** are supported for colliders. But for mesh or terrain colliders only TCustomMesh and TGorillaMesh/TGorillaModel are allowed. Other components do not have any vertex information. Derived components of **TControl3D**, **TCustomMesh** and **TGorillaMesh** are supported for colliders. But for mesh or terrain colliders only TCustomMesh and TGorillaMesh/TGorillaModel are allowed. Other components do not have any vertex information.
 +
 +==== ColliderSettings / ColliderPrefab ====
 +
 +Registering a collider for a 3D object expects collider settings (TGorillaColliderSettings) or a collider prefab (TGorillaPhysicsColliderPrefab).
 +
 +The collider prefab is a collection item for design time usage. It will automatically register a collider settings (TGorillaColliderSettings) for you when the physics system getting started.
 +
 +While the collider settings (TGorillaColliderSettings) is the core structure for collider registration.
 +
 +It gives you a number of possible settings:
 +
 +^Property ^Description^
 +|_Type|TGorillaPhysicsBodyType (TQ3BodyType.eStaticBody, TQ3BodyType.eDynamicBody or TQ3BodyType.eKinematicBody)|
 +|LockRotAxisX|Locked rotation on the x axis.|
 +|LockRotAxisY|Locked rotation on the y axis.|
 +|LockRotAxisZ|Locked rotation on the z axis.|
 +|LockMoveAxisX|Locked translation on the x axis.|
 +|LockMoveAxisY|Locked translation on the y axis.|
 +|LockMoveAxisZ|Locked translation on the z axis.|
 +|LinearDamping|Linear Damping controls how much the physics body or constraint resists translation.|
 +|AngularDamping|Angular Damping controls how much they resist rotating. |
 +|Slop|Additional slop value, which will be added to the computed penetration depth on collision.|
 +|AllowSubColliders|If a object hierarchy is provided as control, it will try to add the same kind of collider for all sub-elements. Caution: This may produce unexpected behaviour especially on dynamic colliders.|
 +|AllowSleep|Allows a body to go in sleeping mode and save resources. By default TRUE.|
 +|Active|Is body enabled for physics computation.|
 +|Data|Setup colliderdata: friction, restitution, density, sensor ...|
 +|Data.Friction|Friction is a force between two surfaces that are sliding, or trying to slide, across each other. For example, when you try to push a book along the floor, friction makes this difficult. Friction always works in the direction opposite to the direction in which the object is moving, or trying to move.|
 +|Data.Restitution|The coefficient of restitution is a measure of how much kinetic energy remains after the collision of two bodies. Its value ranges from 0 to 1.|
 +|Data.Density|It is the mass of a material substance per unit volume.|
 +|Data.Sensor|A sensor is a device that detects and responds to some type of input from the physical environment.|
 ===== Threading ===== ===== Threading =====
  
Line 350: Line 383:
 When you have declared this kind of helper class in your unit, the TGorillaPhysicsSystem component will then show you a new method to be callable "AddInstanceCollider". When you have declared this kind of helper class in your unit, the TGorillaPhysicsSystem component will then show you a new method to be callable "AddInstanceCollider".
  
 +
 +==== Render Colliders ====
 +
 +You can render physics colliders for debugging purposes.
 +
 +The most easy way is to insert a TDummy component into your TGorillaViewport and leave all transformation (position, rotation and scaling) zero, to not affect collider rendering.
 +The add a "OnRender" event with the following code.
 +
 +<file pascal>
 +uses 
 +  Gorilla.Physics.Q3.Renderer;
 +
 +const
 +{$IFDEF DEBUG}
 +  SHOW_PHYSICS_COLLIDERS = true;
 +{$ELSE}
 +  SHOW_PHYSICS_COLLIDERS = false; 
 +{$ENDIF}
 +
 +procedure TForm1.Dummy1Render(Sender: TObject; Context: TContext3D);
 +var LRender : TQ3Render;
 +begin
 +  // Check if we want to see physics colliders
 +  if not SHOW_PHYSICS_COLLIDERS then
 +    Exit;
 +
 +  // Here we render physics colliders for debugging
 +  LRender.Context := Context;
 +  GorillaPhysicsSystem1.Engine.Render(@LRender);
 +end;
 +</file>
  
 Next step: [[fmodaudio|FMOD Audio]] Next step: [[fmodaudio|FMOD Audio]]