Hi :) i'm testing ODE i have made a little include for setup easily
box and sphere :)
box and sphere :)
; ---------------------------- ; Global ODE space ; ---------------------------- Global ODE_Space ; -------------------------- ; ODE Object Type ; -------------------------- Type ODE_Object Field ObjectBody Field ObjectMesh Field ObjectGeom Field ObjectFake Field ObjectMass# Field ObjectRotX# Field ObjectRotY# Field ObjectRotZ# Field ObjectPx# Field ObjectPy# Field ObjectPz# Field ObjectScaleX# Field ObjectScaleY# Field ObjectScaleZ# End Type ; --------------------------- ; Setup easily world ; --------------------------- Function ODE_InitWorld(Gravity#=-1.5,Bounce#=0.05) ODE_Space = ODE_dWorldCreate() ODE_dWorldSetGravity(0, Gravity#, 0) ODE_dSetContactMode(dContactBounce + dContactSoftERP + dContactSoftCFM) ODE_dSetBOUNCE(Bounce#) ODE_dSetSOFT_ERP(0.4) ODE_dSetSOFT_CFM(0.8) End Function ; -------------------------- ; Setup easily cube ; -------------------------- Function ODE_CreateCube(Px#,Py#,Pz#,RotX#,RotY#,RotZ#,ScaleX#,ScaleY#,ScaleZ#,Mass#=10,Red=255,Green=255,Blue=255) G.ODE_Object = New ODE_Object G\ObjectMass#=Mass# G\ObjectScaleX#=ScaleX# G\ObjectScaleY#=ScaleY# G\ObjectScaleZ#=ScaleZ# G\ObjectBody = ODE_dBodyCreate() G\ObjectGeom = ODE_dCreateBox(ODE_Space, G\ObjectScaleX#*2,G\ObjectScaleY#*2,G\ObjectScaleZ#*2, G\ObjectMass#) ODE_dGeomSetBody G\ObjectGeom, G\ObjectBody G\ObjectRotX#=RotX# G\ObjectRotY#=RotY# G\ObjectRotZ#=RotZ# G\ObjectPx#=Px# G\ObjectPy#=Py# G\ObjectPz#=Pz# ODE_dBodySetPosition(G\ObjectBody, G\ObjectPx#,G\ObjectPy#,G\ObjectPz#) ODE_dBodySetRotation(G\ObjectBody, G\ObjectRotX#,G\ObjectRotY#,G\ObjectRotZ#) G\ObjectMesh = CreateCube() PositionEntity G\ObjectMesh,G\ObjectPx#,G\ObjectPy#,G\ObjectPz# ScaleEntity G\ObjectMesh,G\ObjectScaleX#,G\ObjectScaleY#,G\ObjectScaleZ# EntityColor G\ObjectMesh, Red,Green,Blue End Function ; ----------------------------- ; Setup easily sphere ; ----------------------------- Function ODE_CreateSphere(Px#,Py#,Pz#,Scale#,Mass#=10,Red=255,Green=255,Blue=255) G.ODE_Object = New ODE_Object G\ObjectMass#=Mass# G\ObjectScaleX#=Scale# G\ObjectScaleY#=Scale# G\ObjectScaleZ#=Scale# G\ObjectBody = ODE_dBodyCreate() G\ObjectGeom = ODE_dCreateSphere(ODE_Space,G\ObjectScaleX#, G\ObjectMass#) ODE_dGeomSetBody G\ObjectGeom, G\ObjectBody G\ObjectPx#=Px# G\ObjectPy#=Py# G\ObjectPz#=Pz# ODE_dBodySetPosition(G\ObjectBody, G\ObjectPx#,G\ObjectPy#,G\ObjectPz#) G\ObjectMesh = CreateSphere() PositionEntity G\ObjectMesh,G\ObjectPx#,G\ObjectPy#,G\ObjectPz# ScaleEntity G\ObjectMesh,G\ObjectScaleX#,G\ObjectScaleY#,G\ObjectScaleZ# EntityColor G\ObjectMesh, Red,Green,Blue End Function ; ------------------------------- ; Setup easily cylinder ; ------------------------------- Function ODE_CreateCylinder(Px#,Py#,Pz#,RotX#,RotY#,RotZ#,Radius#,Height#,Mass#=10,Red=255,Green=255,Blue=255) G.ODE_Object = New ODE_Object G\ObjectMass#=Mass# G\ObjectScaleX#=Radius# G\ObjectScaleY#=Height# G\ObjectScaleZ#=Radius# G\ObjectBody = ODE_dBodyCreate() G\ObjectGeom = ODE_dCreateCCylinder(ODE_Space,G\ObjectScaleX#, G\ObjectScaleY#*2,G\ObjectMass#) ODE_dGeomSetBody G\ObjectGeom, G\ObjectBody G\ObjectPx#=Px# G\ObjectPy#=Py# G\ObjectPz#=Pz# G\ObjectRotX#=RotX# G\ObjectRotY#=RotY# G\ObjectRotZ#=RotZ# ODE_dBodySetPosition(G\ObjectBody, G\ObjectPx#,G\ObjectPy#,G\ObjectPz#) ODE_dBodySetRotation(G\ObjectBody, G\ObjectRotX#,G\ObjectRotY#,G\ObjectRotZ#) G\ObjectMesh = CreatePivot() G\ObjectFake=CreateCylinder(8,1,G\ObjectMesh) RotateEntity G\ObjectFake, 90, 0, 0 PositionEntity G\ObjectMesh,G\ObjectPx#,G\ObjectPy#,G\ObjectPz# ScaleEntity G\ObjectFake,G\ObjectScaleX#,G\ObjectScaleY#,G\ObjectScaleZ# EntityColor G\ObjectFake, Red,Green,Blue RotateEntity G\ObjectMesh,G\ObjectRotX#,G\ObjectRotY#,G\ObjectRotZ# End Function ; --------------------- ; Update physic ; --------------------- Function ODE_UpdatePhysic(Time#=0.1) For G.ODE_Object = Each ODE_Object PositionEntity G\ObjectMesh, ODE_dGeomGetPositionX(G\ObjectGeom), ODE_dGeomGetPositionY(G\ObjectGeom), ODE_dGeomGetPositionZ(G\ObjectGeom) RotateEntity G\ObjectMesh, ODE_dGeomGetPitch(G\ObjectGeom), ODE_dGeomGetYaw(G\ObjectGeom), ODE_dGeomGetRoll(G\ObjectGeom), 1 Next End Function This is a test code --------------------------- ; ------------------------ ; Freelook cam var ; ------------------------ Global Mouse_X_Speed# Global Mouse_Y_Speed# Global Camera_VelX# Global Camera_VelZ# Global Camera_Pitch Global Camera_Yaw Include "BlitzODE.bb" Include "Inc_ODEStuff.bb" ;------ Initialize Graphics -------- Graphics3D 800, 600,16,2 SetBuffer BackBuffer() cam = CreateCamera() PositionEntity cam, 0, 10, -25 lh = CreateLight(2) PositionEntity lh,50,50,50 LightRange lh,100 LightColor lh,255,200,150 plane = CreatePlane() mirror = CreateMirror(plane) EntityColor plane, 0, 0, 150 EntityAlpha plane, .8 PositionEntity plane,0,-0.3,0 SeedRnd MilliSecs() ;--------- Initialize ODE ---------- ODE_InitWorld() ;------- Create siple cube --------- For i=5 To 40 Step 2 Mass#=Rnd(5,10) ODE_CreateCube(Rnd(-5,5),i,Rnd(-5,5),0,0,0,1,1,1,Mass#,Rnd(255),Rnd(255),Rnd(255)) ODE_CreateSphere(Rnd(-5,5),i,Rnd(-5,5),1,Mass#,Rnd(255),Rnd(255),Rnd(255)) ODE_CreateCylinder(Rnd(-5,5),i,Rnd(-5,5),45,50,65,1,3,Mass#,Rnd(255),Rnd(255),Rnd(255)) Next ;mesh=LoadMesh("002.b3d") ;ODE_dTriMeshCreate%(mesh) ;----------------------------------- ODE_UpdatePhysic() ;----------------------------------- gameFPS = 50.0 framePeriod = 1000 / gameFPS frameTime = MilliSecs () - framePeriod MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 While Not KeyHit(1) Repeat frameElapsed = MilliSecs () - frameTime Until frameElapsed frameTicks = frameElapsed / framePeriod frameTween# = Float(frameElapsed Mod framePeriod) / Float(framePeriod) For frameLimit = 1 To frameTicks If frameLimit = frameTicks Then CaptureWorld frameTime = frameTime + framePeriod ;------------ Update physics world ---------- ODE_dWorldQuickStep 0.1 ;-------------------------------------------- Next If KeyHit(57) For G.ODE_Object = Each ODE_Object ODE_dBodyEnable G\ObjectBody ODE_dBodyAddForce G\ObjectBody, 0, Rnd(20, 50), 0 ODE_dBodyAddTorque G\ObjectBody, Rnd(-30, 10), Rnd(-10, 10), Rnd(-10, 10) Next EndIf ;---- Set geometry position and rotation ---- ODE_UpdatePhysic() Proc_Freelook(Cam,1.05,0.01) ;-------------------------------------------- RenderWorld frameTween# Flip 0 Wend ODE_dCloseODE() End Function Proc_Freelook(CamEntity,Velocity#,Speed#) Mouse_X_Speed#=MouseXSpeed()*0.5 Mouse_Y_Speed#=MouseYSpeed()*0.5 MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 Camera_Pitch=Camera_Pitch+Mouse_Y_Speed# Camera_Yaw=Camera_Yaw+Mouse_X_Speed# RotateEntity CamEntity,Camera_Pitch,-Camera_Yaw,0 If KeyDown(203) Then Camera_VelX=Camera_VelX-Speed# ElseIf KeyDown(205) Camera_VelX=Camera_VelX+Speed# EndIf If KeyDown(208) Then Camera_VelZ=Camera_VelZ-Speed# ElseIf KeyDown(200) Camera_VelZ=Camera_VelZ+Speed# EndIf Camera_VelX=Camera_VelX/velocity# Camera_VelZ=Camera_VelZ/velocity# MoveEntity CamEntity,Camera_VelX,0,Camera_VelZ If KeyDown(200) Then MoveEntity CamEntity,0,0,Speed# EndIf If KeyDown(208) Then MoveEntity CamEntity,0,0,-Speed# EndIf If KeyDown(205) Then MoveEntity CamEntity,Speed#,0,0 EndIf If KeyDown(203) Then MoveEntity CamEntity,-Speed#,0,0 EndIf End Function