Where do I find documents on using JV-ODE? I modified "JV-ODE Car Demo" program and got it to place ten cylinders in triangle pattern but I don't know how to replace the car with five objects with the bowling ball which is a sphere. Is it possible to name the cylinders so that they have different names?
AppTitle "JV-ODE Car Demo"
Include "JV-ODE.bb"
Graphics3D 800,600,0,2
Global CMass#=200 ; ### Car Mass
Global WMass#=8 ; ### Wheel Mass
Global WorldERP#=1 ; ### World Error Correction
Global WorldFriction#=64 ; ### World Friction
Global HingeTorque#=24 ; ### Hinge Torque
Global SuspensionHS#=0.01 ; ### Hinge Suspension Hardness/Softness (Higher=Softer - Lower=Harder)
Global Speed#=0
Global Steer#=0
Global Car
Global CGeom
Global CMesh
Global CarStartY=20
Dim Wheel(4)
Dim WGeom(4)
Dim Joint(4)
Type ODEGeom
Field body
Field geom
Field mesh
End Type
Global World=dWorldCreate()
Global Space=dHashSpaceCreate(0)
Global ContactGroup=dJointGroupCreate(0)
dWorldSetAutoDisableFlag(World,1)
dWorldSetGravity(World,0,-0.98,0)
dWorldSetERP(World,WorldERP)
dContactSetMode(dContactSlip1)
dContactSetMu(WorldFriction)
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
Car=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,0,CarStartY,0)
mass=dMassCreate()
dMassSetBox(mass,1,3,1,4)
dMassSetBoxTotal(mass,CMass,3,1,4)
dMassTranslate(mass,0,-1,0)
dBodySetMass(ode\body,mass)
dMassDestroy(mass)
ode\geom=dCreateBox(Space,3,1,4)
CGeom=ode\geom
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCube()
CMesh=ode\mesh
ScaleMesh ode\mesh,1.5,0.5,2
RotateMesh ode\mesh,0,0,0
PositionMesh ode\mesh,0,0,0
EntityColor ode\mesh,40,80,255
EntityAlpha ode\mesh,1
For count=1 To 4
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
Wheel(count)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,0,0,0)
mass=dMassCreate()
dMassSetSphere(mass,1,0.7)
dMassSetSphereTotal(mass,WMass,0.7)
dBodySetMass(ode\body,mass)
dMassDestroy(mass)
ode\geom=dCreateSphere(Space,0.7)
WGeom(count)=ode\geom
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
ScaleMesh ode\mesh,0.7,0.25,0.7
RotateMesh ode\mesh,0,0,90
PositionMesh ode\mesh,0,0,0
EntityColor ode\mesh,255,255,255
Next
dBodySetPosition(Wheel(1),-2,CarStartY-0.5,+2)
dBodySetPosition(Wheel(2),+2,CarStartY-0.5,+2)
dBodySetPosition(Wheel(3),-2,CarStartY-0.5,-2)
dBodySetPosition(Wheel(4),+2,CarStartY-0.5,-2)
SeedRnd MilliSecs()
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,0,30,100)
ode\geom=dCreateCCylinder(Space,1,8)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
ScaleMesh ode\mesh,2,10,2
RotateMesh ode\mesh,90,0,0
PositionMesh ode\mesh,0,0,0
EntityColor ode\mesh,Rnd(255),Rnd(255),Rnd(255)
EntityAlpha ode\mesh,1
EntityShininess ode\mesh,0.7
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,6,30,112)
ode\geom=dCreateCCylinder(Space,1,8)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
ScaleMesh ode\mesh,2,10,2
RotateMesh ode\mesh,90,0,0
PositionMesh ode\mesh,0,0,0
EntityColor ode\mesh,Rnd(255),Rnd(255),Rnd(255)
EntityAlpha ode\mesh,1
EntityShininess ode\mesh,0.7
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,-6,30,112)
ode\geom=dCreateCCylinder(Space,1,8)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
ScaleMesh ode\mesh,2,10,2
RotateMesh ode\mesh,90,0,0
PositionMesh ode\mesh,0,0,0
EntityColor ode\mesh,Rnd(255),Rnd(255),Rnd(255)
EntityAlpha ode\mesh,1
EntityShininess ode\mesh,0.7
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,0,30,124)
ode\geom=dCreateCCylinder(Space,1,8)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
ScaleMesh ode\mesh,2,10,2
RotateMesh ode\mesh,90,0,0
PositionMesh ode\mesh,0,0,0
EntityColor ode\mesh,Rnd(255),Rnd(255),Rnd(255)
EntityAlpha ode\mesh,1
EntityShininess ode\mesh,0.7
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,12,30,124)
ode\geom=dCreateCCylinder(Space,1,8)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
ScaleMesh ode\mesh,2,10,2
RotateMesh ode\mesh,90,0,0
PositionMesh ode\mesh,0,0,0
EntityColor ode\mesh,Rnd(255),Rnd(255),Rnd(255)
EntityAlpha ode\mesh,1
EntityShininess ode\mesh,0.7
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,-12,30,124)
ode\geom=dCreateCCylinder(Space,1,8)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
ScaleMesh ode\mesh,2,10,2
RotateMesh ode\mesh,90,0,0
PositionMesh ode\mesh,0,0,0
EntityColor ode\mesh,Rnd(255),Rnd(255),Rnd(255)
EntityAlpha ode\mesh,1
EntityShininess ode\mesh,0.7
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,6,30,136)
ode\geom=dCreateCCylinder(Space,1,8)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
ScaleMesh ode\mesh,2,10,2
RotateMesh ode\mesh,90,0,0
PositionMesh ode\mesh,0,0,0
EntityColor ode\mesh,Rnd(255),Rnd(255),Rnd(255)
EntityAlpha ode\mesh,1
EntityShininess ode\mesh,0.7
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,-6,30,136)
ode\geom=dCreateCCylinder(Space,1,8)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
ScaleMesh ode\mesh,2,10,2
RotateMesh ode\mesh,90,0,0
PositionMesh ode\mesh,0,0,0
EntityColor ode\mesh,Rnd(255),Rnd(255),Rnd(255)
EntityAlpha ode\mesh,1
EntityShininess ode\mesh,0.7
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,18,30,136)
ode\geom=dCreateCCylinder(Space,1,8)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
ScaleMesh ode\mesh,2,10,2
RotateMesh ode\mesh,90,0,0
PositionMesh ode\mesh,0,0,0
EntityColor ode\mesh,Rnd(255),Rnd(255),Rnd(255)
EntityAlpha ode\mesh,1
EntityShininess ode\mesh,0.7
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,-18,30,136)
ode\geom=dCreateCCylinder(Space,1,8)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
ScaleMesh ode\mesh,2,10,2
RotateMesh ode\mesh,90,0,0
PositionMesh ode\mesh,0,0,0
EntityColor ode\mesh,Rnd(255),Rnd(255),Rnd(255)
EntityAlpha ode\mesh,1
EntityShininess ode\mesh,0.7
Global Light=CreateLight()
RotateEntity Light,45,-90,0
LightColor Light,255,255,255
AmbientLight 130,130,130
Global CameraPivot=CreatePivot(CMesh)
PositionEntity CameraPivot,0,10,-10
Global Camera=CreateCamera()
CameraClsColor Camera,0,0,0
CameraRange Camera,1,1000
dCreatePlane(Space,0,1,0,0)
Plane=CreatePlane()
EntityAlpha Plane,0.8
PlaneTexture=CreateTexture(128,128,9)
ClsColor 0,200,80
Cls
Color 255,255,255
Rect 0,0,64,64,1
Rect 64,64,64,64,1
CopyRect 0,0,128,128,0,0,BackBuffer(),TextureBuffer(PlaneTexture)
ScaleTexture PlaneTexture,20,20
EntityTexture Plane,PlaneTexture,0,0
Mirror=CreateMirror()
SetupCar()
While Not KeyHit(1)
UpdateKeys()
PTime=MilliSecs()
UpdateCar()
UpdateGeoms()
dSpaceCollide(Space,World,ContactGroup)
dWorldQuickStep(World,0.1)
dJointGroupEmpty(ContactGroup)
PhysicsTime#=MilliSecs()-PTime
UpdateCam()
UpdateWorld
RenderWorld
Text 0,0,"JV-ODE Version "+dGetVersion()
Text 0,15,"Physics Time:"+PhysicsTime
Text 0,30,"Car Speed:"+Speed
Text 640,0,"A - Accelerate"
Text 640,15,"Z - Brake/Reverse"
Text 640,30,"Arrows - Steering"
Text 640,45,"Space - Reset Car"
Flip
Wend
dJointGroupDestroy(ContactGroup)
dSpaceDestroy(Space)
dWorldDestroy(World)
dCloseODE()
End
Function SetupCar()
For count=1 To 4
Joint(count)=dJointCreateHinge2(World,0)
dJointAttach(Joint(count),Car,Wheel(count))
dJointSetHinge2Anchor(Joint(count),dBodyGetPositionX(Wheel(count)),dBodyGetPositionY(Wheel(count)),dBodyGetPositionZ(Wheel(count)))
dJointSetHinge2Axis1(Joint(count),0,1,0)
dJointSetHinge2Axis2(Joint(count),-1,0,0)
dJointSetHinge2Param(Joint(count),dParamSuspensionERP,0.8)
dJointSetHinge2Param(Joint(count),dParamSuspensionCFM,SuspensionHS)
If count>2
dJointSetHinge2Param(Joint(count),dParamLoStop,0)
dJointSetHinge2Param(Joint(count),dParamHiStop,0)
End If
Next
Speed=0
End Function
Function UpdateKeys()
If KeyDown(30)=1
Speed=Speed+0.08
If Speed>30 Then Speed=30
End If
If KeyDown(44)=1
Speed=Speed-0.1
If Speed<-10 Then Speed=-10
If Speed>0 Then Speed=Speed*0.97
End If
If KeyDown(30)=0 And KeyDown(44)=0 Then Speed=Speed*0.99
If KeyDown(203)=1 Or KeyDown(205)=1
If KeyDown(203)=1
Steer=0.5
Else
Steer=-0.5
End If
Else
Steer=0
End If
If KeyHit(57)=1
Speed=0
dBodySetRotation(Car,0,0,0)
End If
End Function
Function UpdateCar()
For count=1 To 4
dBodyEnable(Wheel(count))
Next
dBodyEnable(Car)
For count=1 To 4
dJointSetHinge2Param(Joint(count),dParamVel2,Speed)
dJointSetHinge2Param(Joint(count),dParamFMax2,HingeTorque)
Next
For count=1 To 2
angle#=Steer-dJointGetHinge2Angle1(Joint(count))
dJointSetHinge2Param(Joint(count),dParamVel,angle)
dJointSetHinge2Param(Joint(count),dParamFMax,400)
Next
End Function
Function UpdateCam()
PositionEntity CameraPivot,0,3,-12
camx#=EntityX(CameraPivot,1)-EntityX(Camera)
camy#=EntityY(CameraPivot,1)-EntityY(Camera)
camz#=EntityZ(CameraPivot,1)-EntityZ(Camera)
TranslateEntity Camera,camx*0.5,camy*0.5,camz*0.5
PointEntity Camera,CMesh
End Function
Function UpdateGeoms()
For ode.ODEGeom=Each ODEGeom
RotateEntity ode\mesh,dGeomGetPitch#(ode\geom),dGeomGetYaw#(ode\geom),dGeomGetRoll#(ode\geom)
PositionEntity ode\mesh,dGeomGetPositionX#(ode\geom),dGeomGetPositionY#(ode\geom),dGeomGetPositionZ#(ode\geom)
Next
End Function
|