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
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 ; ################################################################################################### ; ################################################################################################### ; ###################################################################################################