Code archives/3D Graphics - Maths/basic collisions example
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| turningmoving colliders (ellipsoid) -> static collidables (mesh) | turningmoving colliders (ellipsoid) <-> turningmoving colliders (ellipsoid) | |||||
;Here is an example of how to use the collision system and how to manage the turningmoving colliders and the static collidables
;collidables = static meshes
;colliders = turningmoving ellipsoids
;turningmoving colliders (ellipsoid) -> static collidables (mesh) | turningmoving colliders (ellipsoid) <-> turningmoving colliders (ellipsoid)
;Z,S,Q,D to turn move the first ellipsoid collider
;UP,DOWN,LEFT,RIGHT to turn move the second ellipsoid collider
Graphics3D(640,480,32,2)
SeedRnd(MilliSecs())
Camera = CreateCamera()
CameraRange(Camera,0.1,100)
CameraClsColor(Camera,000,000,000)
;create position rotate the statics collidables (meshes)
Global StaticsCount%
Dim Static(10)
For n% = 1 To 10
StaticsCount = StaticsCount + 1
I% = StaticsCount
C% = Rand(1,2)
If( C = 1 )
Static(I) = CreateCube()
Else If( C = 2 )
Static(I) = CreateCylinder(8)
EndIf
ScaleMesh(Static(I),0.5/2,0.5/2,0.5/2)
PositionMesh(Static(I),0,0.5/2,0)
.LineChooseStaticPosition
PositionEntity(Static(I),Rnd(-5,5),0,Rnd(-5,5))
;is there another static at this position ?
For OI% = 1 To StaticsCount
If(OI <> I)
If(EntityDistance(Static(I),Static(OI)) < 0.36+0.36)
Goto LineChooseStaticPosition
EndIf
EndIf
Next
Next
;create position rotate the turningmovings colliders (ellipsoids)
Global TurningMovingsCount%
Dim TurningMoving(10)
For n% = 1 To 2
TurningMovingsCount = TurningMovingsCount + 1
I% = TurningMovingsCount
TurningMoving(I) = CreateSphere(16)
ScaleMesh(TurningMoving(I),0.5/2,0.5/2,0.5/2)
DebugTurningMovingDirection = CreateCube()
ScaleMesh(DebugTurningMovingDirection,0.01/2,0.01/2,1.0/2)
PositionMesh(DebugTurningMovingDirection,0,0,1.0/2)
PositionEntity(DebugTurningMovingDirection,EntityX(TurningMoving(I),True),EntityY(TurningMoving(I),True),EntityZ(TurningMoving(I),True))
RotateEntity(DebugTurningMovingDirection,EntityPitch(TurningMoving(I),True),EntityYaw(TurningMoving(I),True),EntityRoll(TurningMoving(I),True))
EntityParent(DebugTurningMovingDirection,TurningMoving(I),True)
.LineChooseTurningMovingPosition
PositionEntity(TurningMoving(I),Rnd(-5,5),0.25,Rnd(-5,5))
;is there a static at this position ?
For OI% = 1 To StaticsCount
If(EntityDistance(TurningMoving(I),Static(OI)) < 0.25+0.36)
Goto LineChooseTurningMovingPosition
EndIf
Next
;is there another turningmoving at this position ?
For OI% = 1 To StaticsCount
If(OI <> I)
If(EntityDistance(Static(I),Static(OI)) < 0.25+0.25)
Goto LineChooseTurningMovingPosition
EndIf
EndIf
Next
RotateEntity(TurningMoving(I),0,Rnd(-180,180),0)
Next
PositionEntity(Camera,0,7.5,-7.5)
RotateEntity(Camera,45,0,0)
;put each static collidable in a collision group
For I% = 1 To StaticsCount
EntityType(Static(I),1) ;group 1
Next
;put each turningmoving collider in a collision group
For I% = 1 To TurningMovingsCount
EntityRadius(TurningMoving(I),0.25)
EntityType(TurningMoving(I),2) ;group 2
Next
;configure the collision detection and response between the different collisions groups
Collisions(2,1,2,1) ;collision group 2 -> group 1, ellipsoid to mesh, stop
Collisions(2,2,1,1) ;collision group 2 -> group 2, ellipsoid to ellipsoid, stop
While(KeyDown(1)=0)
;turn move turningmoving 1
If(KeyDown(30)=1)
TurnEntity(TurningMoving(1),0,1.5,0)
ElseIf(KeyDown(32)=1)
TurnEntity(TurningMoving(1),0,-1.5,0)
EndIf
If(KeyDown(17)=1)
MoveEntity(TurningMoving(1),0,0,0.05)
ElseIf(KeyDown(31)=1)
MoveEntity(TurningMoving(1),0,0,-0.05)
EndIf
;turn move turningmoving 2
If(KeyDown(203)=1)
TurnEntity(TurningMoving(2),0,1.5,0)
ElseIf(KeyDown(205)=1)
TurnEntity(TurningMoving(2),0,-1.5,0)
EndIf
If(KeyDown(200)=1)
MoveEntity(TurningMoving(2),0,0,0.05)
ElseIf(KeyDown(208)=1)
MoveEntity(TurningMoving(2),0,0,-0.05)
EndIf
;detect collisions update colliders depending on the "response"
UpdateWorld()
For I% = 1 To StaticsCount
EntityColor(Static(I),255,255,255)
Next
For I% = 1 To TurningMovingsCount
EntityColor(TurningMoving(I),255,255,255)
Next
;for each turningmoving collider
For I% = 1 To TurningMovingsCount
;check if a collision happened between this turningmoving collider and a static collidable or another turningmoving collider
CC% = CountCollisions(TurningMoving(I))
;if yes
If(CC > 0)
;retrieve the collided with CollisionEntity(Collider,1) ;note : in most cases there is only one collision but if CountCollisions(Collider) is superior to 1, you can analyze the others collisions
;retrieve the collision point with CollisionX(Collider,1) CollisionY(Collider,1) CollisionZ(Collider,1) ;same note as above
;retrieve the collision normal with CollisionNX(Collider,1) CollisionNY(Collider,1) CollisionNZ(Collider,1) ;same note as above
;update the entities as you want...
EntityColor(TurningMoving(I),255,000,000) ;turningmoving collider (ellipsoid)
EntityColor(CollisionEntity(TurningMoving(I),1),125,000,000) ;static collidable (mesh) or another turningmoving collider (ellipsoid)
EndIf
Next
SetBuffer(BackBuffer())
RenderWorld()
Flip(1)
Wend
End() |
Comments
None.
Code Archives Forum