JV-ODE: Galaxy Man! Ragdolls in outer space!

Blitz3D Forums/Blitz3D Userlibs/JV-ODE: Galaxy Man! Ragdolls in outer space!

eh eh...

Here's a little experiment trying to 'move a ragdoll'...
Haven't managed to make him 'move' yet, but he's flying all right :D

danny

Include "JV-ODE.bb"

; DANNY's Galaxy Man!

Const ANGTHRESH# = 0.1		;default auto disable angular threshold
Const LINTHRESH# = 0.1		;default auto disable linear threshold
Const STEPTHRESH = 1

Graphics3D 800,600,0,2

Global RagDollMax=3
Global ODEJointMax=14

Dim RDBody(RagDollMax,ODEJointMax)
Dim RDJoint(RagDollMax,ODEJointMax)

Type odeGeom
	Field body
	Field geom
	Field mesh
End Type

; ###################################################################################################
; ### Setup ODE

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

dWorldSetAutoDisableFlag(World,1)

dWorldSetGravity(World,0,-0.48,0)
dWorldSetERP World, 1.0
dContactSetMaxContacts 90
dContactSetMode(dContactBounce)
dContactSetBounce(0.8)
dContactSetMu(10)

; High Performance Settings
; Causes objects to settle down and sleep faster
dWorldSetAutoDisableFlag World, 0
dWorldSetAutoDisableLinearThreshold (World, .023)
dWorldSetAutoDisableAngularThreshold (World, .023)
dWorldSetAutoDisableSteps (World,50)
dWorldSetQuickStepNumIterations (World,25) ; default 20

SeedRnd 666

Global camera, camerapivot
Create3D()

;create welcome
Cls
timer=CreateTimer(50)
For i = GraphicsHeight()+10 To -210 Step -1
	;scroll
	Cls
	Color 255,255,0
	Text GraphicsWidth()/2, i+00, "GALAXY-MAN!",1,1
	Text GraphicsWidth()/2, i+01, "GALAXY-MAN!",1,1
	Color 255,255,255
	Text GraphicsWidth()/2, i+40, "Evil Doctor RagDoll has found the doors to the cosmos!!",1,1
	Color 180,180,180
	Text GraphicsWidth()/2, i+80, "Your mission is to prevent Doctor RagDoll's clumsiness",1,1
	Text GraphicsWidth()/2, i+100,"from knocking small planets our of orbit!",1,1
	Color 140,140,140
	Text GraphicsWidth()/2, i+140, "Use your cursor keys to guide him.",1,1
	Text GraphicsWidth()/2, i+320, "Oh... and press SPACE to begin!",1,1
	;reveil
	Flip 1
	WaitTimer(timer)
	;space exits
	If KeyHit(57) Or KeyHit(1) Then Exit
Next
;flash gordon!
For i = 0 To 255 Step 15
	ClsColor i,i,i
	Cls
	Flip 1
	WaitTimer(timer)
Next
FreeTimer timer

;add door
AddDoor 0,0,  -1, 5,15,0.25, 2
AddDoor 0,0, 455, 5,15,0.25, 2

; ###################################################################################################
; ### Filter
Global filter
filteralpha#=1.0
filtercolor=255

; ###################################################################################################
; ### Create Cube Space

w# = 8		; tunnel dimension
h# = 8
d# = 450

For i = 1 To 350
	AddObject Rand(-w,w),Rand(-h,h),Rand(0,d)
Next

; ###################################################################################################
; ### Create RagDoll

Global rootBody, rootGeom, rootMesh
Global rx#=0, ry#=1, rz#=-5

createRagdoll(1, rx#,ry#,rz#)

; ###################################################################################################
; ### Render Loop
.MAIN
starttime = MilliSecs()

While Not KeyHit(1)

	;-----------------------------------------------------------
	;game fade in
	If filteralpha# > 0.45 Then
		filteralpha# = filteralpha#-0.02
		EntityAlpha filter, filteralpha#
	Else
		filteralpha# = 0.45
		EntityAlpha filter, filteralpha#
	EndIf
	;flash
	If filtercolor > 0 Then
		filtercolor = filtercolor-10
	Else
		filtercolor = 0
	EndIf
	EntityColor filter, filtercolor, filtercolor, filtercolor
	
	;-----------------------------------------------------------
	; STEER the ragdoll ! :)

	speed# = 0.30

	If KeyDown(200) Then ry# = ry# + speed#		; CURSOR UP		= forward
	If KeyDown(208) Then ry# = ry# - speed#		; CURSOR DOWN	= backward
	If KeyDown(203) Then rx# = rx# - speed#		; CURSOR LEFT	= left
	If KeyDown(205) Then rx# = rx# + speed#		; CURSOR RIGHT	= right

	;move forward
	rz#= rz# + speed# * 0.5

	;there is NO light at the end of the tunnel!
	If rz# >= 465 Then rz# = rz#-465

	;position ragdoll
	dBodySetPosition rootBody, rx#,ry#,rz#
	dBodyEnable rootBody

	;relax the body
	For i = 0 To 4
		dBodySetLinearVel RDBody(1,i), 0,0,0
		dBodySetAngularVel RDBody(1,i), 0,0,0
		;keep alive
		dBodyEnable RDBody(1,i)
	Next

    ;-----------------------------------------------
	;look at that guy!
	PositionEntity camera, EntityX#(camera),EntityY(camera),rz#-25
	PointEntity camera, rootMesh

	;-----------------------------------------------
	; Physics
	; Run Physics every 10ms ( 50 Times/sec )

	T=MilliSecs() 
	If T > Time3 + 20 Then
		Time3=T	
		PTime=MilliSecs()
		UpdateGeoms()
		;exceptional hack
		RotateEntity rootMesh, dGeomGetPitch#(rootGeom),dGeomGetYaw#(rootGeom),dGeomGetRoll#(rootGeom), 1
		PositionEntity rootMesh, dGeomGetPositionX#(rootGeom),dGeomGetPositionY#(rootGeom),dGeomGetPositionZ#(rootGeom), 1
		;simulator
		For x=1 To 2 ; Increase to improve resolution
			dSpaceCollide(Space,World,ContactGroup)
			dWorldQuickStep(World,0.05)
			dJointGroupEmpty(ContactGroup)
		Next
		PhysicsTime#=MilliSecs()-PTime
	End If

	;-----------------------------------------------
	; FPS
	If T > Time4 + 1000 Then
		Time4=T	
		FPS=Frames
		frames=0
	End If
	frames=frames+1

    ;-----------------------------------------------
	; render world every loop

	RenderWorld

	;debug
	Color 220,220,220
	Text 5,0,"JV-ODE Version "+dGetVersion()
	Text 5,15,"Physics Time:"+PhysicsTime
	Text 5,30,"FPS: "+FPS
	If MilliSecs()-starttime<4500 Then Text GraphicsWidth()/2,15,"Use Cursor keys to fly!", 1

	;show
	Flip 0

Wend

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

End

; ###################################################################################################

Function Create3D()

;| Default 3d scene

	; ### Create camera
	camerapivot = CreatePivot()
	Camera=CreateCamera(camerapivot)
	CameraZoom camera, 1.5
	CameraClsColor Camera,0,0,0
	CameraClsMode camera, False, True
	CameraRange Camera,0.01,250
	PositionEntity Camera,1,2,-10
	PositionEntity camerapivot, 0,0,0
	PointEntity camera, camerapivot

	CameraFogMode camera, 1
	CameraFogRange camera, 20,75
	CameraFogColor camera, 0,0,0

	;fanta sprite
	filter=CreateSprite(camera)
	PositionEntity filter, 0,0,0.025
	EntityAlpha filter, 1
	EntityColor filter, 0,0,0
	
	; ### Create light
	Light=CreateLight(camera)
	RotateEntity Light,45,-90,0
	LightColor Light,255,255,255
	AmbientLight 130,130,130

End Function

; ###################################################################################################

Function AddDoor(x#,y#,z#, w#,h#,d#, weight#=5)

	doorframe# = 0.02		; Depending on the thickness of the door, need a little space between door & frame
							;(because the hinge is in the center (zaxis) of the door, in stead of on an end.

	; ALSO, the door itself needs to be a centimeter or so from the floor, else it will drag
	; and leave nasty marks on the floor!

	ode.odeGeom = New odeGeom

	ode\body=dBodyCreate(World)
	dBodySetRotation(ode\body,0,0,0)
	dBodySetPosition(ode\body,x#,y#+0.01,z#)
	ode\geom=dCreateBox(Space,w#,h#-0.02,d#)
	dGeomSetBody(ode\geom,ode\body)
	ode\mesh=CreateCube()
	ScaleMesh ode\mesh,w#/2,h#/2-0.02,d#/2
	EntityColor ode\mesh,100,0,120
	EntityAlpha ode\mesh,1
	EntityShininess ode\mesh,0.7
	mass = dMassCreate()
	dMassSetBoxTotal mass, weight#, w#,h#-0.02,d#
	dBodySetMass ode\body, mass
	dMassDestroy mass
	;add hinge joint to the door
	joint=dJointCreateHinge(World,0)
	dJointAttach joint, 0, ode\body
	dJointSetHingeAxis joint, 0,1,0
	dJointSetHingeAnchor joint, x#+w#/2,y#,z#
	dJointSetHingeParam joint, dParamLoStop, -0.5 * 3.14		;1pi = 180 degrees
	dJointSetHingeParam joint, dParamHiStop,  0.5 * 3.14

	;wall dimensions
	ww# = 5.0
	wh# = h#
	wd# = 0.25

	;add wall segment - right of door (geometry only!)
	ode.odeGeom = New odeGeom
	ode\body=0	; nobody here!
	ode\geom=dCreateBox(Space,ww#,wh#,wd#)
	dGeomSetPosition ode\geom, x#+w#/2+ww#/2+doorframe#,y#,z#
	ode\mesh=CreateCube()
	ScaleMesh ode\mesh,ww#/2, wh#/2, wd#/2
	EntityColor ode\mesh,100,100,100
	EntityShininess ode\mesh,0.7

	;add wall segment - left of door (geometry only!)
	ode.odeGeom = New odeGeom
	ode\body=0	; nobody here!
	ode\geom=dCreateBox(Space,ww#,wh#,wd#)
	dGeomSetPosition ode\geom, x#-w#/2-ww#/2-doorframe#,y#,z#
	ode\mesh=CreateCube()
	ScaleMesh ode\mesh,ww#/2, wh#/2, wd#/2
	EntityColor ode\mesh,100,100,100
	EntityShininess ode\mesh,0.7

End Function


; ###################################################################################################

Function AddObject(xp#,yp#,zp#)

	size# = Rnd#(0.25,2.5)

	ode.ODEGeom=New ODEGeom

	ode\body=dBodyCreate(World)
	dBodySetRotation(ode\body,0,0,0)
	dBodySetPosition(ode\body,xp#,yp#,zp#)
	ode\geom=dCreateSphere(Space,size#)
	dGeomSetBody(ode\geom,ode\body)
	ode\mesh=CreateSphere(8)
	ScaleMesh ode\mesh,size#/2,size#/2,size#/2
	c = Rand(255)
	EntityColor ode\mesh,c,c,c
	EntityAlpha ode\mesh,Rnd(0.95,1)
	EntityShininess ode\mesh,Rnd(0,1)
	mass = dMassCreate()
	dMassSetSphereTotal mass, 1.0, size# ;,size#,size#
	dBodySetMass ode\body, mass
	dMassDestroy mass
	EntityAutoFade ode\mesh, 20,75

	;earth
	If Rand(0,10) < 2 Then
		EntityColor ode\mesh, 100,160,255
	EndIf

	;float
	dBodySetGravityMode ode\body, 0

End Function

; ###################################################################################################

Function UpdateGeoms()

	For ode.ODEGeom=Each ODEGeom

		RotateEntity ode\mesh,dGeomGetPitch#(ode\geom),dGeomGetYaw#(ode\geom),dGeomGetRoll#(ode\geom), 1
		PositionEntity ode\mesh,dGeomGetPositionX#(ode\geom),dGeomGetPositionY#(ode\geom),dGeomGetPositionZ#(ode\geom), 1
		;check if a moon is moving
;		dBodyGetForce ode\body
;		If dVectorZ#() <> 0 Then
			;torch it!
;			c = Rnd(0,255)
;			EntityColor ode\mesh, c*2, c, c*0.25
;		EndIf
	Next

End Function

; ###################################################################################################
.CreateRagDoll

Function CreateRagDoll(rd, xp#, yp#, zp#)

;xp#=-8+(rd*4)
;yp#=7
;zp#=4

; ### RagDoll Dimensions

HeadRad#=0.4
BodyUX#=1.4
BodyUY#=1.5
BodyUZ#=0.5
BodyLX#=1.4
BodyLY#=0.75
BodyLZ#=0.5
ArmURad#=0.18
ArmULen#=1.1
ArmLRad#=0.18
ArmLLen#=1.1
LegURad#=0.25
LegULen#=1.3
LegLRad#=0.25
LegLLen#=1.3
FeetX#=0.5
FeetY#=0.25
FeetZ#=1.0
HandX#=0.1
HandY#=0.4
HandZ#=0.28

; ### Create Root
rootBody = dBodyCreate(world)
dBodySetRotation rootBody, 0,0,0
dBodySetPosition rootBody, xp,yp,zp
rootGeom = dCreateSphere(Space,0)
dGeomSetBody rootGeom, rootBody
rootMesh = CreatePivot() ;CreateSphere()
;ScaleMesh rootMesh, 0.25, 0.25, 0.25
;EntityColor rootMesh, 255,0,255

; ### Create Head

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,0)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp,yp,zp)
ode\geom=dCreateSphere(Space,HeadRad)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateSphere()
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,HeadRad,HeadRad,HeadRad
EntityColor ode\mesh,255,255,255

; ### Create Body (Upper)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,1)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp,yp-1.25,zp)
ode\geom=dCreateBox(Space,BodyUX,BodyUY,BodyUZ)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCube()
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,BodyUX*0.5,BodyUY*0.5,BodyUZ*0.5
EntityColor ode\mesh,0,200,200

; ### Create Body (Lower)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,2)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp,yp-2.5,zp)
ode\geom=dCreateBox(Space,BodyLX,BodyLY,BodyLZ)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCube()
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,BodyLX*0.5,BodyLY*0.5,BodyLZ*0.5
EntityColor ode\mesh,0,100,100

; ### Create Left Arm (Upper)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,3)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp+0.9,yp-1.25,zp)
ode\geom=dCreateCylinder(Space,ArmURad,ArmULen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,ArmURad,ArmULen*0.5,ArmURad
EntityColor ode\mesh,255,0,0

; ### Create Left Arm (Lower)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,4)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp+0.9,yp-2.35,zp)
ode\geom=dCreateCylinder(Space,ArmLRad,ArmLLen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,ArmLRad,ArmLLen*0.5,ArmLRad
EntityColor ode\mesh,125,0,0

; ### Create Left Hand

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,5)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp+0.9,yp-3.05,zp)
ode\geom=dCreateBox(Space,HandX,HandY,HandZ)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCube()
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,HandX*0.5,HandY*0.5,HandZ*0.5
EntityColor ode\mesh,255,255,255

; ### Create Right Arm (Upper)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,6)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp-0.9,yp-1.25,zp)
ode\geom=dCreateCylinder(Space,ArmURad,ArmULen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,ArmURad,ArmULen*0.5,ArmURad
EntityColor ode\mesh,0,255,0

; ### Create Right Arm (Lower)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,7)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp-0.9,yp-2.35,zp)
ode\geom=dCreateCylinder(Space,ArmLRad,ArmLLen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,ArmLRad,ArmLLen*0.5,ArmLRad
EntityColor ode\mesh,0,125,0

; ### Create Right Hand

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,8)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp-0.9,yp-3.05,zp)
ode\geom=dCreateBox(Space,HandX,HandY,HandZ)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCube()
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,HandX*0.5,HandY*0.5,HandZ*0.5
EntityColor ode\mesh,255,255,255

; ### Create Left Leg (Upper)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,9)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp+0.5,yp-3.6,zp)
ode\geom=dCreateCylinder(Space,LegURad,LegULen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,LegURad,LegULen*0.5,LegURad
EntityColor ode\mesh,255,0,0

; ### Create Left Leg (Lower)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,10)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp+0.5,yp-4.9,zp)
ode\geom=dCreateCylinder(Space,LegLRad,LegLLen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,LegLRad,LegLLen*0.5,LegLRad
EntityColor ode\mesh,125,0,0

; ### Create Left Foot

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,11)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp+0.5,yp-5.7,zp-0.25)
ode\geom=dCreateBox(Space,FeetX,FeetY,FeetZ)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCube()
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,FeetX*0.5,FeetY*0.5,FeetZ*0.5
EntityColor ode\mesh,200,0,100

; ### Create Right Leg (Upper)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,12)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp-0.5,yp-3.6,zp)
ode\geom=dCreateCylinder(Space,LegURad,LegULen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,LegURad,LegULen*0.5,LegURad
EntityColor ode\mesh,0,255,0

; ### Create Right Leg (Lower)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,13)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp-0.5,yp-4.9,zp)
ode\geom=dCreateCylinder(Space,LegLRad,LegLLen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,LegLRad,LegLLen*0.5,LegLRad
EntityColor ode\mesh,0,125,0

; ### Create Right Foot

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RDBody(rd,14)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp-0.5,yp-5.7,zp-0.25)
ode\geom=dCreateBox(Space,FeetX,FeetY,FeetZ)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCube()
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,FeetX*0.5,FeetY*0.5,FeetZ*0.5
EntityColor ode\mesh,100,200,0


.CreateJoints

; ### ROOT JOINT TO UPPER-BODY
RDJoint(rd,0)=dJointCreateFixed(world,0)
;dJointSetHingeAnchor(RDJoint(rd,0),xp,yp+0.5,zp)
;dJointSetHingeParam (RDJoint(rd,0),dParamLoStop,-0.7)
;dJointSetHingeParam (RDJoint(rd,0),dParamHiStop,+0.7)
dJointAttach(RDJoint(rd,0),rootBody,RDBody(rd,0))
dJointSetFixed RDJoint(rd,0)

; ### Static Joint To Head
;RDJoint(rd,0)=dJointCreateBall(World,0)
;dJointAttach(RDJoint(rd,0),rootBody,RDBody(rd,0))
;dJointAttach(RDJoint(rd,0),0,RDBody(rd,0))
;dJointSetBallAnchor(RDJoint(rd,0),xp,yp,zp)

; ### Head To Body (Upper)

RDJoint(rd,1)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,1),RDBody(rd,0),RDBody(rd,1))
dJointSetHingeAxis(RDJoint(rd,1),1,0,1)
dJointSetHingeAnchor(RDJoint(rd,1),xp,yp-0.44,zp)
dJointSetHingeParam(RDJoint(rd,1),dParamLoStop,-0.7)
dJointSetHingeParam(RDJoint(rd,1),dParamHiStop,0.7)

; ### Body (Upper) To Body (Lower)

RDJoint(rd,2)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,2),RDBody(rd,1),RDBody(rd,2))
dJointSetHingeAxis(RDJoint(rd,2),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,2),xp,yp-2.05,zp)
dJointSetHingeParam(RDJoint(rd,2),dParamLoStop,-0.25)
dJointSetHingeParam(RDJoint(rd,2),dParamHiStop,0.25)

; ### Left Arm (Upper) To Body (Upper)

RDJoint(rd,3)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,3),RDBody(rd,3),RDBody(rd,1))
dJointSetHingeAxis(RDJoint(rd,3),1,-1,1)
dJointSetHingeAnchor(RDJoint(rd,3),xp+0.9,yp-0.7,zp)
dJointSetHingeParam(RDJoint(rd,3),dParamLoStop,-1.5)
dJointSetHingeParam(RDJoint(rd,3),dParamHiStop,1.5)

; ### Left Arm (Lower) To Left Arm (Upper)

RDJoint(rd,4)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,4),RDBody(rd,4),RDBody(rd,3))
dJointSetHingeAxis(RDJoint(rd,4),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,4),xp+0.9,yp-1.8,zp)
dJointSetHingeParam(RDJoint(rd,4),dParamLoStop,0.0)
dJointSetHingeParam(RDJoint(rd,4),dParamHiStop,2.0)

; ### Left Hand To Left Arm (Lower)

RDJoint(rd,5)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,5),RDBody(rd,5),RDBody(rd,4))
dJointSetHingeAxis(RDJoint(rd,5),0,0,1)
dJointSetHingeAnchor(RDJoint(rd,5),xp+0.9,yp-2.9,zp)
dJointSetHingeParam(RDJoint(rd,5),dParamLoStop,-0.3)
dJointSetHingeParam(RDJoint(rd,5),dParamHiStop,0.3)

; ### Right Arm (Upper) To Body (Upper)

RDJoint(rd,6)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,6),RDBody(rd,6),RDBody(rd,1))
dJointSetHingeAxis(RDJoint(rd,6),1,1,1)
dJointSetHingeAnchor(RDJoint(rd,6),xp-0.9,yp-0.7,zp)
dJointSetHingeParam(RDJoint(rd,6),dParamLoStop,-1.5)
dJointSetHingeParam(RDJoint(rd,6),dParamHiStop,1.5)

; ### Right Arm (Lower) To Right Arm (Upper)

RDJoint(rd,7)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,7),RDBody(rd,7),RDBody(rd,6))
dJointSetHingeAxis(RDJoint(rd,7),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,7),xp-0.9,yp-1.8,zp)
dJointSetHingeParam(RDJoint(rd,7),dParamLoStop,0.0)
dJointSetHingeParam(RDJoint(rd,7),dParamHiStop,2.0)

; ### Right Hand To Right Arm (Lower)

RDJoint(rd,8)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,8),RDBody(rd,8),RDBody(rd,7))
dJointSetHingeAxis(RDJoint(rd,8),0,0,1)
dJointSetHingeAnchor(RDJoint(rd,8),xp-0.9,yp-2.9,zp)
dJointSetHingeParam(RDJoint(rd,8),dParamLoStop,-0.3)
dJointSetHingeParam(RDJoint(rd,8),dParamHiStop,0.3)

; ### Left Leg (Upper) To Body (Lower)

RDJoint(rd,9)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,9),RDBody(rd,9),RDBody(rd,2))
dJointSetHingeAxis(RDJoint(rd,9),1,0,-1)
dJointSetHingeAnchor(RDJoint(rd,9),xp+0.5,yp-2.9,zp)
dJointSetHingeParam(RDJoint(rd,9),dParamLoStop,-1.0)
dJointSetHingeParam(RDJoint(rd,9),dParamHiStop,1.0)

; ### Left Leg (Lower) To Left Leg (Upper)

RDJoint(rd,10)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,10),RDBody(rd,10),RDBody(rd,9))
dJointSetHingeAxis(RDJoint(rd,10),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,10),xp+0.5,yp-4.25,zp)
dJointSetHingeParam(RDJoint(rd,10),dParamLoStop,-2.0)
dJointSetHingeParam(RDJoint(rd,10),dParamHiStop,0.0)

; ### Left Foot To Left Leg (Lower)

RDJoint(rd,11)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,11),RDBody(rd,11),RDBody(rd,10))
dJointSetHingeAxis(RDJoint(rd,11),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,11),xp+0.5,yp-5.5,zp)
dJointSetHingeParam(RDJoint(rd,11),dParamLoStop,-0.25)
dJointSetHingeParam(RDJoint(rd,11),dParamHiStop,0.25)

; ### Right Leg (Upper) To Body (Lower)

RDJoint(rd,12)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,12),RDBody(rd,12),RDBody(rd,2))
dJointSetHingeAxis(RDJoint(rd,12),1,0,1)
dJointSetHingeAnchor(RDJoint(rd,12),xp-0.5,yp-2.9,zp)
dJointSetHingeParam(RDJoint(rd,12),dParamLoStop,-1.0)
dJointSetHingeParam(RDJoint(rd,12),dParamHiStop,1.0)

; ### Right Leg (Lower) To Right Leg (Upper)

RDJoint(rd,13)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,13),RDBody(rd,13),RDBody(rd,12))
dJointSetHingeAxis(RDJoint(rd,13),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,13),xp-0.5,yp-4.25,zp)
dJointSetHingeParam(RDJoint(rd,13),dParamLoStop,-2.0)
dJointSetHingeParam(RDJoint(rd,13),dParamHiStop,0.0)

; ### Right Foot To Right Leg (Lower)

RDJoint(rd,14)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,14),RDBody(rd,14),RDBody(rd,13))
dJointSetHingeAxis(RDJoint(rd,14),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,14),xp-0.5,yp-5.5,zp)
dJointSetHingeParam(RDJoint(rd,14),dParamLoStop,-0.25)
dJointSetHingeParam(RDJoint(rd,14),dParamHiStop,0.25)

End Function

; ###################################################################################################
; ###################################################################################################
; ###################################################################################################


Hi Danny,

With current version V1.22,
it returns error!

ODE internal error 2
--------------------
Bad argument(s) (..\..\ode\src\sphere.cpp:51)

What should we change?
Thanks in advance.

A sphere with zero size is no longer permitted.

Change the following line in the 'CreateRagDoll' function...

rootGeom = dCreateSphere(Space,0)

to

rootGeom = dCreateSphere(Space,0.1)

It should work ok then :)

Thanks a lot.