void RagdollDemo::initPhysics() { // Setup the basic world setTexturing(true); setShadows(true); setCameraDistance(btScalar(5.)); m_collisionConfiguration = new btDefaultCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); btVector3 worldAabbMin(-10000,-10000,-10000); btVector3 worldAabbMax(10000,10000,10000); m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); m_solver = new btSequentialImpulseConstraintSolver; m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); //m_dynamicsWorld->getDispatchInfo().m_useConvexConservativeDistanceUtil = true; //m_dynamicsWorld->getDispatchInfo().m_convexConservativeDistanceThreshold = 0.01f; // Setup a big ground box { btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-10,0)); #define CREATE_GROUND_COLLISION_OBJECT 1 #ifdef CREATE_GROUND_COLLISION_OBJECT btCollisionObject* fixedGround = new btCollisionObject(); fixedGround->setCollisionShape(groundShape); fixedGround->setWorldTransform(groundTransform); m_dynamicsWorld->addCollisionObject(fixedGround); #else localCreateRigidBody(btScalar(0.),groundTransform,groundShape); #endif //CREATE_GROUND_COLLISION_OBJECT } // Spawn one ragdoll btVector3 startOffset(1,0.5,0); //spawnRagdoll(startOffset); startOffset.setValue(-1,0.5,0); //spawnRagdoll(startOffset); CreateBox(0, 0., 2., 0., 1., 0.2, 1.); // Create the box //leg components CreateCylinder(1, 2. , 2., 0., .2, 1., 0., 0., M_PI_2); //xleft horizontal CreateCylinder(2, -2., 2., 0., .2, 1., 0., 0., M_PI_2); //xright (negative) horizontal CreateCylinder(3, 0, 2., 2., .2, 1., M_PI_2, 0., 0.); //zpositive (into screen) CreateCylinder(4, 0, 2., -2., .2, 1., M_PI_2, 0., 0.); //znegative (out of screen) CreateCylinder(5, 3.0, 1., 0., .2, 1., 0., 0., 0.); //xleft vertical CreateCylinder(6, -3.0, 1., 0., .2, 1., 0., 0., 0.); //xright vertical CreateCylinder(7, 0., 1., 3.0, .2, 1., 0., 0., 0.); //zpositive vertical CreateCylinder(8, 0., 1., -3.0, .2, 1., 0., 0., 0.); //znegative vertical //The axisworldtolocal defines a vector perpendicular to the plane that you want the bodies to rotate in //hinge the legs together //xnegative -- right //two bodies should rotate in y-plane through x--give axisworldtolocal it a z vector btVector3 local2 = PointWorldToLocal(2, btVector3(-3., 2., 0)); btVector3 local6 = PointWorldToLocal(6, btVector3(-3., 2., 0)); btVector3 axis2 = AxisWorldToLocal(2, btVector3(0., 0., 1.)); btVector3 axis6 = AxisWorldToLocal(6, btVector3( 0., 0., 1.)); CreateHinge(0, *body[2], *body[6], local2, local6, axis2, axis6); joints[0]->setLimit(btScalar(0.), btScalar(M_PI_2+M_PI_4)); //positive -- left //give axisworldtolocal a z vector btVector3 local1 = PointWorldToLocal(1, btVector3(3., 2., 0)); btVector3 local5 = PointWorldToLocal(5, btVector3(3., 2., 0)); btVector3 axis1 = AxisWorldToLocal(1, btVector3( 0., 0., 1.)); btVector3 axis5 = AxisWorldToLocal(5, btVector3(0., 0., 1.)); CreateHinge(1, *body[1], *body[5], local1, local5, axis1, axis5); joints[1]->setLimit(btScalar(M_PI_4), btScalar(M_PI_4)); //zpositive -- back //rotates in y-plane through z--give it an x vector btVector3 local3 = PointWorldToLocal(3, btVector3(0, 2., 3.)); btVector3 local7 = PointWorldToLocal(7, btVector3(0, 2., 3.)); btVector3 axis3 = AxisWorldToLocal(3, btVector3(1., 0., 0.)); btVector3 axis7 = AxisWorldToLocal(7, btVector3(1., 0., 0.)); CreateHinge(2, *body[3], *body[7], local3, local7, axis3, axis7); joints[2]->setLimit(btScalar(0.), btScalar(M_PI_2+M_PI_4)); //znegative -- front btVector3 local4 = PointWorldToLocal(4, btVector3(0, 2., -3.)); btVector3 local8 = PointWorldToLocal(8, btVector3(0, 2., -3.)); btVector3 axis4 = AxisWorldToLocal(4, btVector3(1., 0., 0.)); btVector3 axis8 = AxisWorldToLocal(8, btVector3(1., 0., 0.)); CreateHinge(3, *body[4], *body[8], local4, local8, axis4, axis8); joints[3]->setLimit(btScalar(M_PI_4), btScalar(M_PI_4)); //hinge the legs to the body //xright to main btVector3 localHinge2 = PointWorldToLocal(2, btVector3(-1, 2., 0)); btVector3 mainHinge2 = PointWorldToLocal(0, btVector3(-1, 2., 0)); btVector3 localAxis2 = AxisWorldToLocal(2, btVector3(0., 0., 1.)); btVector3 mainAxis2 = AxisWorldToLocal(0, btVector3( 0., 0., 1.)); CreateHinge(4, *body[0], *body[2], mainHinge2, localHinge2, mainAxis2, localAxis2); //joints[4]->setLimit(btScalar(-M_PI_2-M_PI_4), btScalar(M_PI_4)); //xleft to main btVector3 localHinge1 = PointWorldToLocal(1, btVector3(1, 2., 0)); btVector3 mainHinge1 = PointWorldToLocal(0, btVector3(1, 2., 0)); btVector3 localAxis1 = AxisWorldToLocal(1, btVector3(0., 0., 1.)); btVector3 mainAxis1 = AxisWorldToLocal(0, btVector3( 0., 0., 1.)); CreateHinge(5, *body[0], *body[1], mainHinge1, localHinge1, mainAxis1, localAxis1); //joints[5]->setLimit(btScalar(-M_PI_2), btScalar(M_PI_2)); //zpositive (back) to main btVector3 localHinge3 = PointWorldToLocal(3, btVector3(0., 2., 1)); btVector3 mainHinge3 = PointWorldToLocal(0, btVector3(0., 2., 1)); btVector3 localAxis3 = AxisWorldToLocal(3, btVector3(1., 0., 0.)); btVector3 mainAxis3 = AxisWorldToLocal(0, btVector3( 1., 0., 0.)); CreateHinge(6, *body[0], *body[3], mainHinge3, localHinge3, mainAxis3, localAxis3); //joints[6]->setLimit(btScalar(-M_PI_2-M_PI_4), btScalar(M_PI_4)); btVector3 localHinge4 = PointWorldToLocal(4, btVector3(0., 2., -1)); btVector3 mainHinge4= PointWorldToLocal(0, btVector3(0., 2., -1)); btVector3 localAxis4 = AxisWorldToLocal(4, btVector3(1., 0., 0. )); btVector3 mainAxis4 = AxisWorldToLocal(0, btVector3( 1., 0., 0.)); CreateHinge(7, *body[0], *body[4], mainHinge4, localHinge4, mainAxis4, localAxis4); //joints[7]->setLimit(btScalar(-M_PI_2), btScalar(M_PI_2)); clientResetScene(); }
void RagDoll::InitRagdoll() { Release(); InitBones((Bone*)m_pRootBone); Bone* Head_End = (Bone*)D3DXFrameFind(m_pRootBone, "Head_End"); Bone* Head = (Bone*)D3DXFrameFind(m_pRootBone, "Head"); Bone* Neck = (Bone*)D3DXFrameFind(m_pRootBone, "Neck"); Bone* Pelvis = (Bone*)D3DXFrameFind(m_pRootBone, "Pelvis"); Bone* Spine = (Bone*)D3DXFrameFind(m_pRootBone, "Spine"); Bone* R_Shoulder = (Bone*)D3DXFrameFind(m_pRootBone, "Shoulder_Right"); Bone* L_Shoulder = (Bone*)D3DXFrameFind(m_pRootBone, "Shoulder_Left"); Bone* U_R_Arm = (Bone*)D3DXFrameFind(m_pRootBone, "Upper_Arm_Right"); Bone* U_L_Arm = (Bone*)D3DXFrameFind(m_pRootBone, "Upper_Arm_Left"); Bone* L_R_Arm = (Bone*)D3DXFrameFind(m_pRootBone, "Lower_Arm_Right"); Bone* L_L_Arm = (Bone*)D3DXFrameFind(m_pRootBone, "Lower_Arm_Left"); Bone* R_Hand = (Bone*)D3DXFrameFind(m_pRootBone, "Hand_Right"); Bone* L_Hand = (Bone*)D3DXFrameFind(m_pRootBone, "Hand_Left"); Bone* R_Pelvis = (Bone*)D3DXFrameFind(m_pRootBone, "Pelvis_Right"); Bone* L_Pelvis = (Bone*)D3DXFrameFind(m_pRootBone, "Pelvis_Left"); Bone* R_Thigh = (Bone*)D3DXFrameFind(m_pRootBone, "Thigh_Right"); Bone* L_Thigh = (Bone*)D3DXFrameFind(m_pRootBone, "Thigh_Left"); Bone* R_Calf = (Bone*)D3DXFrameFind(m_pRootBone, "Calf_Right"); Bone* L_Calf = (Bone*)D3DXFrameFind(m_pRootBone, "Calf_Left"); Bone* R_Foot = (Bone*)D3DXFrameFind(m_pRootBone, "Foot_Right"); Bone* L_Foot = (Bone*)D3DXFrameFind(m_pRootBone, "Foot_Left"); Bone* R_Foot_End = (Bone*)D3DXFrameFind(m_pRootBone, "Foot_Right_End"); Bone* L_Foot_End = (Bone*)D3DXFrameFind(m_pRootBone, "Foot_Left_End"); D3DXQUATERNION q, q2; D3DXQuaternionIdentity(&q); D3DXQuaternionRotationAxis(&q2, &D3DXVECTOR3(0.0f, 0.0f, 1.0f), D3DX_PI * -0.5f); //Head OBB* o01 = CreateBoneBox(Head, Head_End, D3DXVECTOR3(0.3f, 0.2f, 0.2f), q); //Right Arm OBB* o03 = CreateBoneBox(U_R_Arm, L_R_Arm, D3DXVECTOR3(0.3f, 0.12f, 0.12f), q); OBB* o04 = CreateBoneBox(L_R_Arm, R_Hand, D3DXVECTOR3(0.3f, 0.12f, 0.12f), q); //Left Arm OBB* o06 = CreateBoneBox(U_L_Arm, L_L_Arm, D3DXVECTOR3(0.3f, 0.12f, 0.12f), q); OBB* o07 = CreateBoneBox(L_L_Arm, L_Hand, D3DXVECTOR3(0.3f, 0.12f, 0.12f), q); //Spine OBB* o08 = CreateBoneBox(Spine, Neck, D3DXVECTOR3(0.5f, 0.35f, 0.15f), q); //Right Leg OBB* o09 = CreateBoneBox(R_Thigh, R_Calf, D3DXVECTOR3(0.4f, 0.15f, 0.15f), q); OBB* o10 = CreateBoneBox(R_Calf, R_Foot, D3DXVECTOR3(0.4f, 0.14f, 0.14f), q); OBB* o11 = CreateBoneBox(R_Foot, R_Foot_End, D3DXVECTOR3(0.15f, 0.06f, 0.12f), q2); //Left Leg OBB* o12 = CreateBoneBox(L_Thigh, L_Calf, D3DXVECTOR3(0.4f, 0.15f, 0.15f), q); OBB* o13 = CreateBoneBox(L_Calf, L_Foot, D3DXVECTOR3(0.4f, 0.14f, 0.14f), q); OBB* o14 = CreateBoneBox(L_Foot, L_Foot_End, D3DXVECTOR3(0.15f, 0.06f, 0.12f), q2); //Constraints CreateTwistCone(Neck, o01, o08, D3DX_PI * 0.15f, D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f), D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f)); CreateTwistCone(L_Pelvis, o08, o12, D3DX_PI * 0.5f, D3DXVECTOR3(0.3f, D3DX_PI * 0.5f, -D3DX_PI * 0.5f), D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f)); CreateHinge(L_Calf, o12, o13, 0.0f, -2.0f, D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f), D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f)); CreateHinge(L_Foot, o13, o14, 1.5f, 1.0f, D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f), D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f)); CreateTwistCone(R_Pelvis, o08, o09, D3DX_PI * 0.5f, D3DXVECTOR3(0.3f, D3DX_PI * 0.5f, -D3DX_PI * 0.5f), D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f)); CreateHinge(R_Calf, o09, o10, 0.0f, -2.0f, D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f), D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f)); CreateHinge(R_Foot, o10, o11, 1.5f, 1.0f, D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f), D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f)); CreateTwistCone(U_L_Arm, o08, o06, D3DX_PI * 0.6f, D3DXVECTOR3(0.0f, D3DX_PI * 0.75f, D3DX_PI * 0.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f)); CreateHinge(L_L_Arm, o06, o07, 2.0f, 0.0f, D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f), D3DXVECTOR3(0.0f, 0.0f, D3DX_PI * 0.5f)); CreateTwistCone(U_R_Arm, o08, o03, D3DX_PI * 0.6f, D3DXVECTOR3(0.0f, D3DX_PI * 0.75f, D3DX_PI * 0.0f), D3DXVECTOR3(D3DX_PI, 0.0f, 0.0f)); CreateHinge(L_R_Arm, o03, o04, 2.0f, 0.0f, D3DXVECTOR3(0.0f, 0.0f, -D3DX_PI * 0.5f), D3DXVECTOR3(0.0f, 0.0f, -D3DX_PI * 0.5f)); //Assign Pelvis bone to Spine OBB Pelvis->m_pObb = o08; D3DXVECTOR3 PelvisPos(Pelvis->CombinedTransformationMatrix(3, 0), Pelvis->CombinedTransformationMatrix(3, 1), Pelvis->CombinedTransformationMatrix(3, 2)); Pelvis->m_pivot = o08->SetPivot(PelvisPos); }
virtual bool BulldozerTest::Setup(Pint& pint, const PintCaps& caps) { CreateMeshesFromRegisteredSurfaces(pint, caps, *this, &mHighFrictionMaterial); VehicleData* UserData = ICE_NEW(VehicleData); pint.mUserData = UserData; const float TrackWidth = mInsideCylinder.mHalfHeight + mOutsideCylinder.mHalfHeight*2.0f; const float TrackGap = 0.1f; const Point ChassisExtents(3.0f, 2.0f, 1.0f); const float GroundClearance = 0.5f; const Point ChassisPos(0.0f, ChassisExtents.y+GroundClearance, 0.0f); const float ChassisMass = 100.0f; const float ChassisGap = (TrackWidth+TrackGap)*2.0f; const float SideDistToGround = 0.5f*2.0f; const Point SideExtents(4.0f, 0.2f, 0.2f); const Point LeftSidePos(SideExtents.x-ChassisExtents.x, SideExtents.y+SideDistToGround, -ChassisExtents.z-ChassisGap-SideExtents.z); const Point RightSidePos(SideExtents.x-ChassisExtents.x, SideExtents.y+SideDistToGround, ChassisExtents.z+ChassisGap+SideExtents.z); const float SideMass = 1.0f; PINT_BOX_CREATE ChassisBoxDesc; ChassisBoxDesc.mExtents = ChassisExtents; ChassisBoxDesc.mRenderer = CreateBoxRenderer(ChassisExtents); PintObjectHandle ChassisObject = null; if(1) { // Caterpillar tracks const udword NbGears = 3; Point GearOffsets[3]; const float GearMass = 10.0f; GearOffsets[0] = Point(0.0f, 2.0f, 0.0f); GearOffsets[1] = Point(-2.0f, 0.0f, 0.0f); GearOffsets[2] = Point(2.0f, 0.0f, 0.0f); if(0) { CaterpillarTrackObjects CTO; for(udword i=0;i<2;i++) { const float Coeff = i ? -1.0f : 1.0f; const Point Pos(0.0f, 1.5f, Coeff*(ChassisExtents.z+TrackGap+TrackWidth)); CreateCaterpillarTrackWIP(pint, CTO, &mHighFrictionMaterial, Pos, mInsideCylinder, GetRegisteredRenderers()[0], mOutsideCylinder, GetRegisteredRenderers()[1], NbGears, GearOffsets, GearMass ); } } else { PINT_SHAPE_CREATE* StartShape = null; PINT_SHAPE_CREATE* CurrentShape = null; for(udword i=0;i<2;i++) { const float Coeff = i ? -1.0f : 1.0f; /*const*/ Point Pos(0.0f, 1.5f, Coeff*(ChassisExtents.z+TrackGap+TrackWidth)); Pos -= ChassisPos; { Point GearCenter(0.0f, 0.0f, 0.0f); for(udword i=0;i<NbGears;i++) { const Point GearPos = Pos + GearOffsets[i]; GearCenter += GearPos; } GearCenter /= float(NbGears); StartShape = CreateGearHolderShapes(StartShape, CurrentShape, Pos, GearCenter, NbGears, GearOffsets, mInsideCylinder, &mHighFrictionMaterial, GearCenter); } } PintObjectHandle GearHolder = null; if(StartShape) { if(1) { ChassisBoxDesc.mNext = StartShape; PINT_OBJECT_CREATE ChassisObjectDesc; ChassisObjectDesc.mPosition = ChassisPos; ChassisObjectDesc.mShapes = &ChassisBoxDesc; ChassisObjectDesc.mMass = ChassisMass; GearHolder = CreatePintObject(pint, ChassisObjectDesc); ChassisObject = GearHolder; } else { PINT_OBJECT_CREATE ObjectDesc; ObjectDesc.mShapes = StartShape; ObjectDesc.mMass = 10.0f; ObjectDesc.mPosition = Point(0.0f, 0.0f, 0.0f); GearHolder = CreatePintObject(pint, ObjectDesc); } while(StartShape) { PINT_SHAPE_CREATE* NextShape = const_cast<PINT_SHAPE_CREATE*>(StartShape->mNext); DELETESINGLE(StartShape); StartShape = NextShape; } } if(1) { UserData->mChassis = GearHolder; UserData->mFront[0].mParent = GearHolder; UserData->mFront[1].mParent = GearHolder; UserData->mRear[0].mParent = GearHolder; UserData->mRear[1].mParent = GearHolder; for(udword i=0;i<2;i++) { const float Coeff = i ? -1.0f : 1.0f; /*const*/ Point Pos(0.0f, 1.5f, Coeff*(ChassisExtents.z+TrackGap+TrackWidth)); Point GearCenter(0.0f, 0.0f, 0.0f); for(udword j=0;j<NbGears;j++) { const Point GearPos = Pos + GearOffsets[j]; GearCenter += GearPos; } GearCenter /= float(NbGears); GearCenter -= ChassisPos; CaterpillarTrackObjects CTO; CreateCaterpillarTrackWIP(pint, CTO, &mHighFrictionMaterial, Pos, mInsideCylinder, GetRegisteredRenderers()[0], mOutsideCylinder, GetRegisteredRenderers()[1], NbGears, GearOffsets, GearMass, GearHolder, &GearCenter); { UserData->mFront[i].mWheel = CTO.mGears[1]; UserData->mRear[i].mWheel = CTO.mGears[2]; } } } } } PintObjectHandle LeftSideObject = CreateBoxObject(pint, SideExtents, LeftSidePos, SideMass); PintObjectHandle RightSideObject = CreateBoxObject(pint, SideExtents, RightSidePos, SideMass); const Point HingeAxis(0.0f, 0.0f, 1.0f); CreateHinge(pint, ChassisObject, LeftSideObject, Point(-ChassisExtents.x, -ChassisExtents.y+SideExtents.y, -ChassisExtents.z-ChassisGap), Point(-SideExtents.x, 0.0f, SideExtents.z), HingeAxis, HingeAxis); CreateHinge(pint, ChassisObject, RightSideObject, Point(-ChassisExtents.x, -ChassisExtents.y+SideExtents.y, ChassisExtents.z+ChassisGap), Point(-SideExtents.x, 0.0f, -SideExtents.z), HingeAxis, HingeAxis); // Blade if(1) { const float BladeMinSize = ChassisExtents.z + ChassisGap + SideExtents.z * 2.0f; const float BladeSize = BladeMinSize + 0.5f; const Point BladeExtents(0.1f, 0.75f, BladeSize); const Point BladePos( LeftSidePos.x + SideExtents.x + BladeExtents.x, SideDistToGround + BladeExtents.y, 0.0f); const float BladeMass = 1.0f; PintObjectHandle BladeObject = CreateBoxObject(pint, BladeExtents, BladePos, BladeMass); const float dz = fabsf(BladePos.z - LeftSidePos.z); CreateHinge(pint, BladeObject, LeftSideObject, Point(-BladeExtents.x, -BladeExtents.y+SideExtents.y, -dz), Point(SideExtents.x, 0.0f, 0.0f), HingeAxis, HingeAxis); CreateHinge(pint, BladeObject, RightSideObject, Point(-BladeExtents.x, -BladeExtents.y+SideExtents.y, dz), Point(SideExtents.x, 0.0f, 0.0f), HingeAxis, HingeAxis); { const Point Ext1(-BladeExtents.x, BladeExtents.y, dz); const Point p1 = BladePos + Ext1; const Point Ext0(0.0f, SideExtents.y, 0.0f); const Point p0 = RightSidePos + Ext0; CreatePrismatic(pint, p0, p1, RightSideObject, Ext0, BladeObject, Ext1); } { const Point Ext1(-BladeExtents.x, BladeExtents.y, -dz); const Point p1 = BladePos + Ext1; const Point Ext0(0.0f, SideExtents.y, 0.0f); const Point p0 = LeftSidePos + Ext0; CreatePrismatic(pint, p0, p1, LeftSideObject, Ext0, BladeObject, Ext1); } for(udword i=0;i<2;i++) { const float Coeff = i ? -1.0f : 1.0f; const float Offset = Coeff*0.5f; const Point Ext0(ChassisExtents.x, ChassisExtents.y, Offset); const Point p0 = ChassisPos + Ext0; const Point Ext1(-BladeExtents.x, 0.0f, Offset); const Point p1 = BladePos + Ext1; CreatePrismatic(pint, p0, p1, ChassisObject, Ext0, BladeObject, Ext1); } } if(1) { PINT_CONVEX_CREATE ConvexCreate[14]; MyConvex C[14]; for(udword i=0;i<14;i++) { C[i].LoadFile(i); ConvexCreate[i].mNbVerts = C[i].mNbVerts; ConvexCreate[i].mVerts = C[i].mVerts; ConvexCreate[i].mRenderer = CreateConvexRenderer(ConvexCreate[i].mNbVerts, ConvexCreate[i].mVerts); } const float Amplitude = 1.5f; const udword NbLayers = 12; const udword NbX = 12+4; const udword NbY = 12+4; BasicRandom Rnd(42); for(udword j=0;j<NbLayers;j++) { const float Scale = 4.0f; for(udword y=0;y<NbY;y++) { for(udword x=0;x<NbX;x++) { const float xf = (float(x)-float(NbX)*0.5f)*Scale; const float yf = (float(y)-float(NbY)*0.5f)*Scale; const Point pos = Point(xf+40.0f, Amplitude + (Amplitude * 2.0f * float(j)), yf); const udword Index = 10 + Rnd.Randomize() % 4; PintObjectHandle Handle = CreateSimpleObject(pint, &ConvexCreate[Index], 0.1f, pos); ASSERT(Handle); } } } } return true; }
void RagdollDemo::initPhysics() { // Setup the basic world setTexturing(true); setShadows(true); setCameraDistance(btScalar(5.)); m_collisionConfiguration = new btDefaultCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); btVector3 worldAabbMin(-10000,-10000,-10000); btVector3 worldAabbMax(10000,10000,10000); m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); m_solver = new btSequentialImpulseConstraintSolver; m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); //m_dynamicsWorld->getDispatchInfo().m_useConvexConservativeDistanceUtil = true; //m_dynamicsWorld->getDispatchInfo().m_convexConservativeDistanceThreshold = 0.01f; // Setup a big ground box { btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-10,0)); #define CREATE_GROUND_COLLISION_OBJECT 1 #ifdef CREATE_GROUND_COLLISION_OBJECT btCollisionObject* fixedGround = new btCollisionObject(); fixedGround->setCollisionShape(groundShape); fixedGround->setWorldTransform(groundTransform); m_dynamicsWorld->addCollisionObject(fixedGround); #else localCreateRigidBody(btScalar(0.),groundTransform,groundShape); #endif //CREATE_GROUND_COLLISION_OBJECT } // Spawn one ragdoll btVector3 startOffset(1,0.5,0); //spawnRagdoll(startOffset); startOffset.setValue(-1,0.5,0); //spawnRagdoll(startOffset); CreateBox(0, 0., 0., 1., 1., 1., 0.2); // fore limbs CreateCylinder(1, 1., 0., 1., 0.1, 1., 1); CreateCylinder(2, -1., 0., 1., 0.1, 1., 1); CreateCylinder(3, 0., 1., 1., 0.1, 1., 2); CreateCylinder(4, 0., -1., 1., 0.1, 1., 2); CreateCylinder(5, 1.5, 0., .5, 0.1, 1., 3); CreateCylinder(6, -1.5, 0., .5, 0.1, 1., 3); CreateCylinder(7, 0., 1.5, .5, 0.1, 1., 3); CreateCylinder(8, 0., -1.5, .5, 0.1, 1., 3); btVector3 v = PointWorldToLocal(0, btVector3(0,1,0)); /* std::cerr << "v " << v[0] << " " << v[1] << " " << v[2] << std::endl; */ printf("(%f, %f, %f)\n", v[0], v[1], v[2]); CreateHinge(0, 0, 1, 0.5, 0., 1., 0., -1., 0.); CreateHinge(1, 0, 2, -.5, 0., 1., 0., 1., 0.); CreateHinge(2, 0, 3, 0., .5, 1., 1., 0., 0.); CreateHinge(3, 0, 4, 0., -.5, 1., -1., 0., 0.); CreateHinge(4, 1, 5, 1.5, 0., 1., 0., -1., 0.); CreateHinge(5, 2, 6, -1.5, 0., 1., 0., 1., 0.); CreateHinge(6, 3, 7, 0., 1.5, 1., 1., 0., 0.); CreateHinge(7, 4, 8, 0., -1.5, 1., -1., 0., 0.); clientResetScene(); }