JV-ODE Physics Wrapper

Blitz3D Forums/Blitz3D Userlibs/JV-ODE Physics Wrapper

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

And now .. a slightly different way of doing things, this time using angular velocities to move the ball around rather than forces. This allows a greater control of the ball.

; JV-ODE - Key Controlled Sphere Demo Using Angular Velocities
; Code by Jim Williams (VIP3R)
; Arrow key control by Jeff (PsychicParrot)

AppTitle "JV-ODE - Key Controlled sphere Demo"

Include "ode.bb"

Graphics3D 800,600,0,2

Type ODEGeom

	Field body
	Field geom
	Field mesh
	Field pivot ; To find direction vectors
	Field head  ; Just a stupid head to show which direction it's going in!
	Field inair ; To tell if player is on the ground or not!!
	
End Type

; ### Setup ODE

Global World=dWorldCreate()
Global Space=dHashSpaceCreate(0)
Global ContactGroup=dJointGroupCreate(0)

dWorldSetGravity(World,0,-1,0)
dContactSetMode(dContactBounce)
dContactSetBounce(0.2)
dContactSetMu(38)

; ### Create light

Global Light=CreateLight()

RotateEntity Light,45,-90,0
LightColor Light,255,255,255
AmbientLight 130,130,130

; ### Create camera

Global Camera=CreateCamera()
CameraClsColor Camera,0,0,0
CameraRange Camera,1,1000
PositionEntity Camera,0,20,-50
RotateEntity Camera,30,0,0

; ### Control vars

Global potato#=0 ; y rotation of thingy (rotater,rotato,potato!!)
Global spud#
Global fwd_key
Global back_key
Global left_key
Global right_key
Global jump_key

; ### Create plane

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
EntityPickMode plane,2

Mirror=CreateMirror()

AddObject() ; Add our thingy to the world

While Not KeyHit(1)

	PTime=MilliSecs()

	; Update controls
	
	c.ODEGeom=First ODEGeom
	Getkeys(c)
	movethingy(c)
	lookforground(c)
	
	PointEntity (camera,c\mesh)
	
	UpdateGeoms()

	dSpaceCollide(Space,World,ContactGroup)
	dWorldQuickStep(World,0.14)
	dJointGroupEmpty(ContactGroup)

	PhysicsTime#=MilliSecs()-PTime

	UpdateWorld

	RenderWorld

	Text 0,0,"JV-ODE Version "+dGetVersion()
	Text 0,15,"Physics Time:"+PhysicsTime

	Flip

Wend

dJointGroupDestroy(ContactGroup)
dSpaceDestroy(Space)
dWorldDestroy(World)
dCloseODE()

End

Function getkeys(c.ODEGeom)

	fwd_key=False
	back_key=False
	left_key=False
	right_key=False
	jump_key=False

	If c\inair=False Then ; Only let player control 'thrust' when on the ground
	
		If KeyDown(200) Then fwd_key=True
		If KeyDown(208) Then back_key=True

	EndIf
	
		If KeyDown(205) Then left_key=True
		If KeyDown(203) Then right_key=True
		If KeyDown(57) Then jump_key=True

	;EndIf

End Function

Function lookforground(c.ODEGeom)

	If LinePick(EntityX(c\mesh,True),EntityY(c\mesh,True)+1,EntityZ(c\mesh,True),0,-4,0)<>0 Then ; Check for anything 'under' player
		c\inair=False
	  Else
		c\inair=True
	EndIf

End Function

Function movethingy(c.ODEGeom)

	If fwd_key=True Then
		spud=spud+.1
	EndIf

	If back_key=True Then
		spud=spud-.1
	EndIf
	
	If left_key=True Then
		potato=potato-2
	End If
	
	If right_key=True Then
		potato=potato+2
	End If

	If jump_key=True And c\inair=False Then		
		dBodyAddForce(c\body,0,16 ,0)		
	End If

	RotateEntity c\head,0,potato#,0
	
	; Add forward force

	TFormVector 0,0,spud,c\head,0
	
	vx# = dbodygetAngularvelx(c\body) + TFormedX()
	vy# = dbodygetAngularvely(c\body) + TFormedY()
	vz# = dbodygetAngularvelz(c\body) + TFormedZ()

	damping#=.8
	dbodysetAngularvel(c\body,vx#*damping#,vy#*damping#,vz#*damping#)

	spud=spud*.9
	
End Function

Function AddObject()

xp=Rand(-8,8)
zp=Rand(-8,8)
ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp,30,zp)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateSphere(Space,3)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateSphere()
ScaleMesh ode\mesh,3,3,3
EntityColor ode\mesh,Rand(255),Rand(255),Rand(255)
EntityAlpha ode\mesh,1
EntityShininess ode\mesh,0.7
ode\head=CreateCube()

ScaleMesh ode\head,1.5,1.5,1.5

ode\pivot=CreatePivot() ; Create pivot to get direction vectors

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)
		
		PositionEntity ode\head,dGeomGetPositionX#(ode\geom),dGeomGetPositionY#(ode\geom)+4.5,dGeomGetPositionZ#(ode\geom)
	
Next

End Function


Now using my newfound mega-code ;) I'll go away and make a game!!

:D

BTW: Thanks Cy for telling me about codebox :)