void Vehicle::loadScene(const std::string &fileName) { //车的父节点 mBaseCarNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(fileName + "BaseCarNode"); //DotSceneLoader* dsl = new DotSceneLoader();//rel //dsl->parseDotScene(fileName + ".scene", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mSceneMgr, mBaseCarNode); mVehicleRenderable = new VehicleRenderable(mSceneMgr, mBaseCarNode); mVehicleRenderable->load(fileName + ".vrf"); //车身节点 mBodyNode = static_cast<Ogre::SceneNode*>(mBaseCarNode->getChild(fileName + "Body")); //轮子节点 mWheels[TOP_LEFT].mSceneNode = static_cast<Ogre::SceneNode*>(mBaseCarNode->getChild(fileName + "LTWheel")); mWheels[TOP_LEFT].mName = fileName + "LTWheel"; mWheels[TOP_RIGHT].mSceneNode = static_cast<Ogre::SceneNode*>(mBaseCarNode->getChild(fileName + "RTWheel")); mWheels[TOP_RIGHT].mName = fileName + "RTWheel"; mWheels[Bottom_LEFT].mSceneNode = static_cast<Ogre::SceneNode*>(mBaseCarNode->getChild(fileName + "LBWheel")); mWheels[Bottom_LEFT].mName = fileName + "LBWheel"; mWheels[Bottom_RIGHT].mSceneNode = static_cast<Ogre::SceneNode*> (mBaseCarNode->getChild(fileName + "RBWheel")); mWheels[Bottom_RIGHT].mName = fileName + "RBWheel"; //设置整体参数 NxBodyDesc bodyDes; //bodyDes.wakeUpCounter = 1E8; bodyDes.mass = 12000;//mVehicleInfo.gMass; //bodyDes.massLocalPose.t = NxVec3(mVehicleInfo.gMassLocalPose.x, mVehicleInfo.gMassLocalPose.y, mVehicleInfo.gMassLocalPose.z); bodyDes.angularDamping = 0.03f; bodyDes.linearDamping = 0.08f; //写入车身的shapeDesc mBoundingBox = mBodyNode->getAttachedObject(0)->getBoundingBox(); NxBoxShapeDesc boxDes; NxVec3 dimen (mBoundingBox.getHalfSize().x, mBoundingBox.getHalfSize().y, mBoundingBox.getHalfSize().z); NxVec3 localPos (mBodyNode->getPosition().x, mBodyNode->getPosition().y, mBodyNode->getPosition().z); ////车身到轮子的距离 //NxReal d1 = NxMath::abs(mBodyNode->getPosition().y - mWheels[0].mSceneNode->getPosition().y); ////包围盒半径之和 //NxReal d2 = mBoundingBox.getHalfSize().y + mWheels[0].mSceneNode->getAttachedObject(0)->getBoundingBox().getHalfSize().y; ////判断轮子是否与车身的包围盒重叠 //if(d1 < d2) //{ // //设置为最大适合高度 // dimen.y = (mBoundingBox.getSize().y - (d2 - d1)) / 2.0f; //} boxDes.dimensions.set(dimen); boxDes.localPose.t = localPos; NxActorDesc actorDesc; actorDesc.body = &bodyDes; actorDesc.globalPose.t = NxVec3(mOriginalPos.x, mOriginalPos.y, mOriginalPos.z); NxQuat quat; quat.setWXYZ(mOriginalQuat.w, mOriginalQuat.x, mOriginalQuat.y, mOriginalQuat.z); actorDesc.globalPose.M.fromQuat(quat); actorDesc.shapes.pushBack(&boxDes); mActor = mNxScene->createActor(actorDesc); mActor->setCMassOffsetLocalPosition(NxVec3(0, -mBoundingBox.getSize().y, 0)); mBodyShape = static_cast<NxBoxShape*>(mActor->getShapes()[0]); //写入轮子的shapeDesc createWheelShapeDesc(&mWheels[TOP_LEFT], true); createWheelShapeDesc(&mWheels[TOP_RIGHT], true); createWheelShapeDesc(&mWheels[Bottom_LEFT], false); createWheelShapeDesc(&mWheels[Bottom_RIGHT], false); //mWheels[TOP_LEFT].mWheelDesc.localPose.t = NxVec3(mBoundingBox.getHalfSize().x, 2, 0); //mWheels[TOP_RIGHT].mWheelDesc.localPose.t = NxVec3(-mBoundingBox.getHalfSize().x, 2, 0); //mWheels[Bottom_LEFT].mWheelDesc.localPose.t = NxVec3(mBoundingBox.getHalfSize().x, -mBoundingBox.getHalfSize().y, 0); //mWheels[Bottom_RIGHT].mWheelDesc.localPose.t = NxVec3(-mBoundingBox.getHalfSize().x, -mBoundingBox.getHalfSize().y, 0); //创建轮子 mWheels[TOP_LEFT].mWheel = static_cast<NxWheelShape*>(mActor->createShape(mWheels[TOP_LEFT].mWheelDesc)); mWheels[TOP_RIGHT].mWheel = static_cast<NxWheelShape*>(mActor->createShape(mWheels[TOP_RIGHT].mWheelDesc)); mWheels[Bottom_LEFT].mWheel = static_cast<NxWheelShape*>(mActor->createShape(mWheels[Bottom_LEFT].mWheelDesc)); mWheels[Bottom_RIGHT].mWheel = static_cast<NxWheelShape*>(mActor->createShape(mWheels[Bottom_RIGHT].mWheelDesc)); NxMaterial* mat = mNxScene->getMaterialFromIndex(0); mat->setFrictionCombineMode(NX_CM_MULTIPLY); mat->setStaticFriction(300.2f); mat->setDynamicFriction(100.5f); }
pWorld*pFactory::createWorld(CK3dEntity* referenceObject, pWorldSettings *worldSettings,pSleepingSettings *sleepSettings) { using namespace vtTools::AttributeTools; using namespace vtTools::ParameterTools; ////////////////////////////////////////////////////////////////////////// //sanity checks : if (!referenceObject || !GetPMan() ) { return NULL; } if (!getPhysicSDK()) { //xLogger::xLog(XL_START,ELOGWARNING,E_LI_MANAGER,"No physic sdk loaded"); return NULL; } int worldAtt = GetPMan()->att_world_object; int surfaceAttribute = GetPMan()->att_surface_props; //exists ? Delete it ! pWorld *w = GetPMan()->getWorld(referenceObject->GetID()); if (w) { GetPMan()->deleteWorld(referenceObject->GetID()); } //our new world : pWorld *result = new pWorld(referenceObject); GetPMan()->getWorlds()->InsertUnique(referenceObject,result); result->initUserReports(); ////////////////////////////////////////////////////////////////////////// //there is no world settings attribute : if (!referenceObject->HasAttribute(worldAtt) ) { referenceObject->SetAttribute(worldAtt); using namespace vtTools; VxVector grav = worldSettings->getGravity(); float sWith = worldSettings->getSkinWith(); AttributeTools::SetAttributeValue<VxVector>(referenceObject,worldAtt,0,&grav); AttributeTools::SetAttributeValue<float>(referenceObject,worldAtt,1,&sWith); } if (!worldSettings) { worldSettings = pFactory::Instance()->createWorldSettings(XString("Default"),GetPMan()->getDefaultConfig()); } if (!worldSettings) { worldSettings = new pWorldSettings(); } ////////////////////////////////////////////////////////////////////////// //pSDK Scene creation : // Create a scene NxSceneDesc sceneDesc; sceneDesc.gravity = pMath::getFrom(worldSettings->getGravity()); sceneDesc.upAxis = 1; sceneDesc.flags |=NX_SF_ENABLE_ACTIVETRANSFORMS; sceneDesc.userNotify =&myNotify; sceneDesc.userContactReport = result->contactReport; NxScene *scene = NULL; if (getPhysicSDK()) { scene = getPhysicSDK()->createScene(sceneDesc); if(scene == NULL) { xLogger::xLog(XL_START,ELOGERROR,E_LI_MANAGER,"Couldn't create scene!"); return NULL; } } result->setScene(scene); scene->setUserContactReport(result->contactReport); scene->setUserTriggerReport(result->triggerReport); NxMaterialDesc *materialDescr = NULL; NxMaterial *material = NULL; if (referenceObject->HasAttribute(surfaceAttribute)) { materialDescr = createMaterialFromEntity(referenceObject); material = result->getScene()->createMaterial(*materialDescr); material->userData = (void*)GetValueFromParameterStruct<int>(referenceObject->GetAttributeParameter(surfaceAttribute) ,E_MS_XML_TYPE); }else{ if (getDefaultDocument()) { materialDescr = createMaterialFromXML("Default",getDefaultDocument()); } if (materialDescr) { material = result->getScene()->createMaterial(*materialDescr); } if (!material) { materialDescr = new NxMaterialDesc(); materialDescr->setToDefault(); material = result->getScene()->getMaterialFromIndex(0); material->loadFromDesc(*materialDescr); } } int z = (int)material->userData; NxMaterial *zeroMaterial = result->getScene()->getMaterialFromIndex(0); zeroMaterial->setDirOfAnisotropy(material->getDirOfAnisotropy()); zeroMaterial->setStaticFriction(material->getStaticFriction()); zeroMaterial->setDynamicFriction(material->getDynamicFriction()); zeroMaterial->setStaticFrictionV(material->getStaticFrictionV()); zeroMaterial->setDynamicFrictionV(material->getDynamicFrictionV()); zeroMaterial->setFrictionCombineMode(material->getFrictionCombineMode()); zeroMaterial->setRestitutionCombineMode(material->getRestitutionCombineMode()); zeroMaterial->setFlags(material->getFlags()); zeroMaterial->userData = material->userData; if (!material) { xLogger::xLog(XL_START,ELOGERROR,E_LI_MANAGER,"Couldn't create default material!"); } result->setDefaultMaterial(material); scene->userData = result; //NxConstraintDominance testDom(1.0, 1.0f); //result->getScene()->setDominanceGroupPair(1, 2,testDom ); //board - debris ////////////////////////////////////////////////////////////////////////// //there is no world settings attribute : /* if (!referenceObject->HasAttribute(GetPMan()->att_sleep_settings) ) { referenceObject->SetAttribute(GetPMan()->att_sleep_settings); using namespace vtTools; AttributeTools::SetAttributeValue<int>(referenceObject,GetPMan()->att_sleep_settings,0,&sSettings->m_SleepSteps); AttributeTools::SetAttributeValue<float>(referenceObject,GetPMan()->att_sleep_settings,1,&sSettings->m_AngularThresold); AttributeTools::SetAttributeValue<float>(referenceObject,GetPMan()->att_sleep_settings,2,&sSettings->m_LinearThresold); AttributeTools::SetAttributeValue<int>(referenceObject,GetPMan()->att_sleep_settings,3,&sSettings->m_AutoSleepFlag); } */ /* result->SleepingSettings(sSettings); ////////////////////////////////////////////////////////////////////////// result->Reference(referenceObject); result->Init(); */ result->_checkForDominanceConstraints(); result->_construct(); return result; //return NULL; }