I've cobbled together an example, cannabalising the ODE Ragdoll demo. It's using quite different parameters to my engine, different ragdoll, etc. Run this and see it working properly in slow motion...
Now if you increase dWorldQuickStep() to speed things up, to say 1.2 you should get passthrough. At least I do! Likewsie changing the gravity to speed things up messes things about. I've found with a few tests that at QStep=1.2, when gravity =0.95 speed is about 'realtime' and the collision works (though with a different result to slowmo mode) but at g=0.94 or 0.96, is bust. dWorldStep() actually performs worse.
If you remove the first dBodyDisable() in the ragdoll creation, the ragdoll drops due to gravity and the collisions are pretty much problem free at higher speeds. It's like the enabling skips a frame's worth of collision so the second frame after the collision, the objects have already penetrated.
; ################################################################################################### ; # JV-ODE - Ragdoll Demo # ; # Code by Jim Williams (VIP3R) # ; ################################################################################################### AppTitle "JV-ODE - Ragdoll Demo" Include "JV-ODE.bb" Graphics3D 800,600,0,2 Global RagDollMax=1 Dim Head(RagDollMax) Dim BodyU(RagDollMax) Dim BodyL(RagDollMax) Dim LArmU(RagDollMax) Dim LArmL(RagDollMax) Dim RArmU(RagDollMax) Dim RArmL(RagDollMax) Dim LLegU(RagDollMax) Dim LLegL(RagDollMax) Dim RLegU(RagDollMax) Dim RLegL(RagDollMax) Dim LFoot(RagDollMax) Dim RFoot(RagDollMax) Dim RDJoint(RagDollMax,12) Type ODEGeom Field body Field geom Field mesh Field mass End Type ; ################################################################################################### ; ### Setup ODE Global World=dWorldCreate() Global Space=dHashSpaceCreate(0) Global ContactGroup=dJointGroupCreate(0) dWorldSetAutoDisableFlag(World,1) dWorldSetGravity(World,0,-0.5,0) dContactSetMode(dContactSlip1+dContactBounce) dContactSetBounce(0.3) dContactSetMu(48) dWorldSetQuickStepNumIterations (World,200) ; default 20 ; ### Create light Global Light=CreateLight() RotateEntity Light,45,-90,0 LightColor Light,255,255,255 AmbientLight 130,130,130 ; ### Create camera Global Camera=CreateCamera() CameraZoom Camera,1.0 CameraClsColor Camera,0,0,0 CameraRange Camera,1,1000 PositionEntity Camera,20,20,-10 RotateEntity Camera,5,45,0 ; ### Create plane dCreatePlane(Space,0,1,0,0) Plane=CreatePlane() EntityAlpha Plane,0.8 PlaneTexture=CreateTexture(128,128,9) ClsColor 0,150,80 Cls Color 200,200,200 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 Color 255,255,255 Mirror=CreateMirror() ; ################################################################################################### CreateRagDoll(count) block.ODEGeom=New ODEGeom x_pos#=-8 y_pos#=15 z_pos#=12 width#=2 length#=2 depth#=2 x_rot#=0 y_rot#=0 z_rot#=0 weight#=100.0 block\body=dBodyCreate(World) block\mass=dMassCreate() dMassSetBoxTotal(block\mass,weight, width, length, depth) dBodySetMass(block\body,block\mass) dBodySetPosition(block\body, x_pos, y_pos, z_pos) dBodySetRotation(block\body, x_rot, y_rot, z_rot) block\geom=dCreateBox(Space,width, length, depth) dGeomSetBody(block\geom,block\body) dGeomContactSetBounce(block\geom,0.5) set_object_friction(block,0.5,weight) dGeomContactSetMode(block\geom,dContactSlip1+dContactBounce) block\mesh=CreateCube() ScaleEntity block\mesh,width/2,length/2,depth/2 seesaw.ODEGeom=New ODEGeom seesaw\mass=dMassCreate() x_pos#=-8 y_pos#=5 z_pos#=8 width#=3 length#=0.5 depth#=15 x_rot#=-20 y_rot#=0 z_rot#=0 weight#=2.0 seesaw\body=dBodyCreate(World) dMassSetBoxTotal(seesaw\mass,weight, width, length, depth) dBodySetMass(seesaw\body,seesaw\mass) dBodySetPosition(seesaw\body, x_pos, y_pos, z_pos) seesaw\geom=dCreateBox(Space,width, length, depth) dGeomSetBody(seesaw\geom,seesaw\body) dGeomContactSetBounce(seesaw\geom,0.5) set_object_friction(seesaw,0.5,weight) dGeomContactSetMode(seesaw\geom,dContactSlip1+dContactBounce) seesaw\mesh=CreateCube() ; Blitz box lengths 2x longer than ODE box length ScaleEntity seesaw\mesh,width/2,length/2,depth/2 dBodyDisable(seesaw\body) seesaw_joint=dJointCreateHinge(World,0) dJointAttach(seesaw_joint, seesaw\body, 0) dJointSetHingeAxis(seesaw_joint,1,0,0) dJointSetHingeAnchor(seesaw_joint,-8,4,8) dJointSetHingeParam(seesaw_joint,dParamLoStop,-dinfinity) dJointSetHingeParam(seesaw_joint,dParamHiStop,dinfinity) dBodySetRotation(seesaw\body, x_rot, y_rot, z_rot) While Not KeyHit(1) UpdateGeoms() dSpaceCollide(Space,World,ContactGroup) dWorldQuickStep(World,0.1) dJointGroupEmpty(ContactGroup) RenderWorld Flip Wend dJointGroupDestroy(ContactGroup) dSpaceDestroy(Space) dWorldDestroy(World) dCloseODE() End ; ################################################################################################### Function CreateRagDoll(rd) xp=-8 yp=9 zp=2 ; ### RagDoll Dimensions headrad#=0.4 bodytx#=1.5 bodyty#=1.5 bodytz#=0.5 bodybx#=1.5 bodyby#=0.75 bodybz#=0.5 larmrad#=0.15 larmlen#=0.9 rarmrad#=0.15 rarmlen#=0.9 llegrad#=0.25 lleglen#=0.8 rlegrad#=0.25 rleglen#=0.8 feetx#=0.5 feety#=0.25 feetz#=1.0 weight#=1.0 ; ### Create Head ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) Head(rd)=ode\body dBodySetRotation(ode\body,0,0,0) dBodySetPosition(ode\body,xp,yp,zp) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) 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 dBodyDisable(ode\body) ; ### Create Body (Upper) ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) BodyU(rd)=ode\body dBodySetRotation(ode\body,0,0,0) dBodySetPosition(ode\body,xp,yp-1.25,zp) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) ode\geom=dCreateBox(Space,bodytx,bodyty,bodytz) dGeomSetBody(ode\geom,ode\body) ode\mesh=CreateCube() EntityPickMode ode\mesh,2 ScaleMesh ode\mesh,bodytx*0.5,bodyty*0.5,bodytz*0.5 EntityColor ode\mesh,0,200,200 dBodyDisable(ode\body) ; ### Create Body (Lower) ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) BodyL(rd)=ode\body dBodySetRotation(ode\body,0,0,0) dBodySetPosition(ode\body,xp,yp-2.5,zp) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) ode\geom=dCreateBox(Space,bodybx,bodyby,bodybz) dGeomSetBody(ode\geom,ode\body) ode\mesh=CreateCube() EntityPickMode ode\mesh,2 ScaleMesh ode\mesh,bodybx*0.5,bodyby*0.5,bodybz*0.5 EntityColor ode\mesh,0,100,100 dBodyDisable(ode\body) ; ### Create Left Arm (Upper) ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) LArmU(rd)=ode\body dBodySetRotation(ode\body,90,0,0) dBodySetPosition(ode\body,xp+1,yp-1.25,zp) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) ode\geom=dCreateCCylinder(Space,larmrad,larmlen) dGeomSetBody(ode\geom,ode\body) ode\mesh=CreateCylinder(8) EntityPickMode ode\mesh,2 ScaleMesh ode\mesh,larmrad,(larmlen*0.5)+larmrad,larmrad RotateMesh ode\mesh,90,0,0 EntityColor ode\mesh,255,0,0 dBodyDisable(ode\body) ; ### Create Left Arm (Lower) ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) LArmL(rd)=ode\body dBodySetRotation(ode\body,90,0,0) dBodySetPosition(ode\body,xp+1,yp-2.5,zp) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) ode\geom=dCreateCCylinder(Space,larmrad,larmlen) dGeomSetBody(ode\geom,ode\body) ode\mesh=CreateCylinder(8) EntityPickMode ode\mesh,2 ScaleMesh ode\mesh,larmrad,(larmlen*0.5)+larmrad,larmrad RotateMesh ode\mesh,90,0,0 EntityColor ode\mesh,125,0,0 dBodyDisable(ode\body) ; ### Create Right Arm (Upper) ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) RArmU(rd)=ode\body dBodySetRotation(ode\body,90,0,0) dBodySetPosition(ode\body,xp-1,yp-1.25,zp) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) ode\geom=dCreateCCylinder(Space,rarmrad,rarmlen) dGeomSetBody(ode\geom,ode\body) ode\mesh=CreateCylinder(8) EntityPickMode ode\mesh,2 ScaleMesh ode\mesh,rarmrad,(rarmlen*0.5)+rarmrad,rarmrad RotateMesh ode\mesh,90,0,0 EntityColor ode\mesh,0,255,0 dBodyDisable(ode\body) ; ### Create Right Arm (Lower) ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) RArmL(rd)=ode\body dBodySetRotation(ode\body,90,0,0) dBodySetPosition(ode\body,xp-1,yp-2.5,zp) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) ode\geom=dCreateCCylinder(Space,rarmrad,rarmlen) dGeomSetBody(ode\geom,ode\body) ode\mesh=CreateCylinder(8) EntityPickMode ode\mesh,2 ScaleMesh ode\mesh,rarmrad,(rarmlen*0.5)+rarmrad,rarmrad RotateMesh ode\mesh,90,0,0 EntityColor ode\mesh,0,125,0 dBodyDisable(ode\body) ; ### Create Left Leg (Upper) ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) LLegU(rd)=ode\body dBodySetRotation(ode\body,90,0,0) dBodySetPosition(ode\body,xp+0.5,yp-3.6,zp) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) ode\geom=dCreateCCylinder(Space,llegrad,lleglen) dGeomSetBody(ode\geom,ode\body) ode\mesh=CreateCylinder(8) EntityPickMode ode\mesh,2 ScaleMesh ode\mesh,llegrad,(lleglen*0.5)+llegrad,llegrad RotateMesh ode\mesh,90,0,0 EntityColor ode\mesh,255,0,0 dBodyDisable(ode\body) ; ### Create Left Leg (Lower) ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) LLegL(rd)=ode\body dBodySetRotation(ode\body,90,0,0) dBodySetPosition(ode\body,xp+0.5,yp-4.9,zp) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) ode\geom=dCreateCCylinder(Space,llegrad,lleglen) dGeomSetBody(ode\geom,ode\body) ode\mesh=CreateCylinder(8) EntityPickMode ode\mesh,2 ScaleMesh ode\mesh,llegrad,(lleglen*0.5)+llegrad,llegrad RotateMesh ode\mesh,90,0,0 EntityColor ode\mesh,125,0,0 dBodyDisable(ode\body) ; ### Create Right Leg (Upper) ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) RLegU(rd)=ode\body dBodySetRotation(ode\body,90,0,0) dBodySetPosition(ode\body,xp-0.5,yp-3.6,zp) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) ode\geom=dCreateCCylinder(Space,rlegrad,rleglen) dGeomSetBody(ode\geom,ode\body) ode\mesh=CreateCylinder(8) EntityPickMode ode\mesh,2 ScaleMesh ode\mesh,rlegrad,(rleglen*0.5)+rlegrad,rlegrad RotateMesh ode\mesh,90,0,0 EntityColor ode\mesh,0,255,0 dBodyDisable(ode\body) ; ### Create Right Leg (Lower) ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) RLegL(rd)=ode\body dBodySetRotation(ode\body,90,0,0) dBodySetPosition(ode\body,xp-0.5,yp-4.9,zp) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) ode\geom=dCreateCCylinder(Space,rlegrad,rleglen) dGeomSetBody(ode\geom,ode\body) ode\mesh=CreateCylinder(8) EntityPickMode ode\mesh,2 ScaleMesh ode\mesh,rlegrad,(rleglen*0.5)+rlegrad,rlegrad RotateMesh ode\mesh,90,0,0 EntityColor ode\mesh,0,125,0 dBodyDisable(ode\body) ; ### Create Left Foot ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) LFoot(rd)=ode\body dBodySetRotation(ode\body,0,0,0) dBodySetPosition(ode\body,xp+0.5,yp-5.7,zp-0.25) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) 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 dBodyDisable(ode\body) ; ### Create Right Foot ode.ODEGeom=New ODEGeom ode\body=dBodyCreate(World) RFoot(rd)=ode\body dBodySetRotation(ode\body,0,0,0) dBodySetPosition(ode\body,xp-0.5,yp-5.7,zp-0.25) dBodySetAutoDisableFlag(ode\body,1) ode\mass=dMassCreate() dMassSetBoxTotal(ode\mass,weight, width, length, depth) dBodySetMass(ode\body,ode\mass) 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 dBodyDisable(ode\body) ; ### Static Joint To Head ;RDJoint(rd,0)=dJointCreateBall(World,0) ;dJointAttach(RDJoint(rd,0),0,Head(rd)) ;dJointSetBallAnchor(RDJoint(rd,0),xp,yp,zp) ; ### Head To Body (Upper) RDJoint(rd,1)=dJointCreateHinge(World,0) dJointAttach(RDJoint(rd,1),Head(rd),BodyU(rd)) dJointSetHingeAxis(RDJoint(rd,1),1,0,0) dJointSetHingeAnchor(RDJoint(rd,1),xp,yp-0.25,zp) dJointSetHingeParam(RDJoint(rd,1),dParamLoStop,-0.5) dJointSetHingeParam(RDJoint(rd,1),dParamHiStop,0.5) ; ### Body (Upper) To Body (Lower) RDJoint(rd,2)=dJointCreateHinge(World,0) dJointAttach(RDJoint(rd,2),BodyU(rd),BodyL(rd)) dJointSetHingeAxis(RDJoint(rd,2),1,0,0) dJointSetHingeAnchor(RDJoint(rd,2),xp,yp-2,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),LArmU(rd),BodyU(rd)) dJointSetHingeAxis(RDJoint(rd,3),1,-1,0) dJointSetHingeAnchor(RDJoint(rd,3),xp+1,yp-0.75,zp) dJointSetHingeParam(RDJoint(rd,3),dParamLoStop,-2.0) dJointSetHingeParam(RDJoint(rd,3),dParamHiStop,2.0) ; ### Left Arm (Lower) To Left Arm (Upper) RDJoint(rd,4)=dJointCreateHinge(World,0) dJointAttach(RDJoint(rd,4),LArmL(rd),LArmU(rd)) dJointSetHingeAxis(RDJoint(rd,4),1,0,0) dJointSetHingeAnchor(RDJoint(rd,4),xp+1,yp-2,zp) dJointSetHingeParam(RDJoint(rd,4),dParamLoStop,0.0) dJointSetHingeParam(RDJoint(rd,4),dParamHiStop,2.0) ; ### Right Arm (Upper) To Body (Upper) RDJoint(rd,5)=dJointCreateHinge(World,0) dJointAttach(RDJoint(rd,5),RArmU(rd),BodyU(rd)) dJointSetHingeAxis(RDJoint(rd,5),1,1,0) dJointSetHingeAnchor(RDJoint(rd,5),xp-1,yp-0.75,zp) dJointSetHingeParam(RDJoint(rd,5),dParamLoStop,-2.0) dJointSetHingeParam(RDJoint(rd,5),dParamHiStop,2.0) ; ### Right Arm (Lower) To Right Arm (Upper) RDJoint(rd,6)=dJointCreateHinge(World,0) dJointAttach(RDJoint(rd,6),RArmL(rd),RArmU(rd)) dJointSetHingeAxis(RDJoint(rd,6),1,0,0) dJointSetHingeAnchor(RDJoint(rd,6),xp-1,yp-2,zp) dJointSetHingeParam(RDJoint(rd,6),dParamLoStop,0.0) dJointSetHingeParam(RDJoint(rd,6),dParamHiStop,2.0) ; ### Left Leg (Upper) To Body (Lower) RDJoint(rd,7)=dJointCreateHinge(World,0) dJointAttach(RDJoint(rd,7),LLegU(rd),BodyL(rd)) dJointSetHingeAxis(RDJoint(rd,7),1,0,0) dJointSetHingeAnchor(RDJoint(rd,7),xp+1,yp-2.75,zp) dJointSetHingeParam(RDJoint(rd,7),dParamLoStop,-1.0) dJointSetHingeParam(RDJoint(rd,7),dParamHiStop,1.0) ; ### Left Leg (Lower) To Left Leg (Upper) RDJoint(rd,8)=dJointCreateHinge(World,0) dJointAttach(RDJoint(rd,8),LLegL(rd),LLegU(rd)) dJointSetHingeAxis(RDJoint(rd,8),1,0,0) dJointSetHingeAnchor(RDJoint(rd,8),xp+1,yp-4.25,zp) dJointSetHingeParam(RDJoint(rd,8),dParamLoStop,-2.0) dJointSetHingeParam(RDJoint(rd,8),dParamHiStop,0.0) ; ### Right Leg (Upper) To Body (Lower) RDJoint(rd,9)=dJointCreateHinge(World,0) dJointAttach(RDJoint(rd,9),RLegU(rd),BodyL(rd)) dJointSetHingeAxis(RDJoint(rd,9),1,0,0) dJointSetHingeAnchor(RDJoint(rd,9),xp-1,yp-2.75,zp) dJointSetHingeParam(RDJoint(rd,9),dParamLoStop,-1.0) dJointSetHingeParam(RDJoint(rd,9),dParamHiStop,1.0) ; ### Right Leg (Lower) To Right Leg (Upper) RDJoint(rd,10)=dJointCreateHinge(World,0) dJointAttach(RDJoint(rd,10),RLegL(rd),RLegU(rd)) dJointSetHingeAxis(RDJoint(rd,10),1,0,0) dJointSetHingeAnchor(RDJoint(rd,10),xp-1,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),LFoot(rd),LLegL(rd)) dJointSetHingeAxis(RDJoint(rd,11),1,0,0) dJointSetHingeAnchor(RDJoint(rd,11),xp+1,yp-5.5,zp) dJointSetHingeParam(RDJoint(rd,11),dParamLoStop,-0.25) dJointSetHingeParam(RDJoint(rd,11),dParamHiStop,0.25) ; ### Right Foot To Right Leg (Lower) RDJoint(rd,12)=dJointCreateHinge(World,0) dJointAttach(RDJoint(rd,12),RFoot(rd),RLegL(rd)) dJointSetHingeAxis(RDJoint(rd,12),1,0,0) dJointSetHingeAnchor(RDJoint(rd,12),xp-1,yp-5.5,zp) dJointSetHingeParam(RDJoint(rd,12),dParamLoStop,-0.25) dJointSetHingeParam(RDJoint(rd,12),dParamHiStop,0.25) End Function Function UpdateGeoms() For ode.ODEGeom=Each ODEGeom ; If dBodyIsEnabled(ode\body) RotateEntity ode\mesh,dGeomGetPitch#(ode\geom),dGeomGetYaw#(ode\geom),dGeomGetRoll#(ode\geom) PositionEntity ode\mesh,dGeomGetPositionX#(ode\geom),dGeomGetPositionY#(ode\geom),dGeomGetPositionZ#(ode\geom) ; End If Next End Function ; ################################################################################################### Function set_object_friction(obj.ODEGeom,friction#,weight) friction=friction/100 friction=friction friction=friction*4 friction=4-friction e#=Log10(weight*10) e=e-friction e=1*(10^e) dGeomContactSetMu(obj\geom,e) End Function
Now if you increase dWorldQuickStep() to speed things up, to say 1.2 you should get passthrough. At least I do! Likewsie changing the gravity to speed things up messes things about. I've found with a few tests that at QStep=1.2, when gravity =0.95 speed is about 'realtime' and the collision works (though with a different result to slowmo mode) but at g=0.94 or 0.96, is bust. dWorldStep() actually performs worse.
If you remove the first dBodyDisable() in the ragdoll creation, the ragdoll drops due to gravity and the collisions are pretty much problem free at higher speeds. It's like the enabling skips a frame's worth of collision so the second frame after the collision, the objects have already penetrated.