; PhysicsBodyHull Example ; ----------------------- ; Requires Extended mode. Graphics3D 640,480,0,2 SetBuffer BackBuffer() Const PHYSICS_STATIC=0 Const PHYSICS_DYNAMIC=2 SeedRnd MilliSecs() camera=CreateCamera() PositionEntity camera,0,3,-9 light=CreateLight() RotateEntity light,45,-30,0 AmbientLight 50,50,50 ; Independent Box3D world with Earth-like gravity world=CreatePhysicsWorld() PhysicsGravity world,0,-9.81,0 ; Blue static ground slab ground=CreateCube() ScaleEntity ground,4,0.5,4 PositionEntity ground,0,-0.5,0,True EntityColor ground,80,160,255 ground_body=CreatePhysicsBody(world,ground,PHYSICS_STATIC) ground_shape=PhysicsBodyBox(ground_body,8,1,8,0) ; Orange cone dropped at a tilt - no primitive shape matches it cone=CreateCone(8,True) ScaleEntity cone,0.8,1.2,0.8 PositionEntity cone,0,3,0,True RotateEntity cone,0,0,35 EntityColor cone,255,120,70 cone_body=CreatePhysicsBody(world,cone,PHYSICS_DYNAMIC) ; Build a convex hull from the cone mesh's scaled vertices cone_shape=PhysicsBodyHull(cone_body,cone,1) While Not KeyDown(1) ; Space tosses the cone up with a random tumble If KeyHit(57) PhysicsBodyVelocity cone_body,0,6,0 PhysicsBodyAngularVelocity cone_body,Rnd(-3,3),0,Rnd(-3,3) EndIf ; Advance the Box3D simulation by one 60 Hz step StepPhysics world,1.0/60.0,4 ; Respawn the cone if it tumbles off the slab If EntityY(cone)<-8 FreePhysicsBody cone_body PositionEntity cone,0,3,0,True RotateEntity cone,0,0,35 cone_body=CreatePhysicsBody(world,cone,PHYSICS_DYNAMIC) cone_shape=PhysicsBodyHull(cone_body,cone,1) EndIf ; Arrow keys move the camera If KeyDown(200) Then MoveEntity camera,0,0,0.1 If KeyDown(208) Then MoveEntity camera,0,0,-0.1 If KeyDown(203) Then TurnEntity camera,0,1,0 If KeyDown(205) Then TurnEntity camera,0,-1,0 RenderWorld Text 0,0,"Arrow keys: move camera Space: toss the cone Esc: exit" Text 0,20,"The cone lands on its point or side thanks to its hull shape" Flip Wend FreePhysicsWorld world FreeEntity cone FreeEntity ground End