void InitPhysX() { gFoundation = PxCreateFoundation(PX_PHYSICS_VERSION, gDefaultAllocatorCallback, gDefaultErrorCallback); gPhysicsSDK = PxCreatePhysics(PX_PHYSICS_VERSION, *gFoundation, PxTolerancesScale() ); if(gPhysicsSDK == NULL) { cerr<<"Error create PhysX."<<endl; } PxSceneDesc sceneDesc(gPhysicsSDK->getTolerancesScale()); sceneDesc.gravity = PxVec3(0.0f, -9.8f, 0.0f); sceneDesc.cpuDispatcher = PxDefaultCpuDispatcherCreate(1); sceneDesc.filterShader = PxDefaultSimulationFilterShader; gScene = gPhysicsSDK->createScene(sceneDesc); PxMaterial* material = gPhysicsSDK->createMaterial(0.5,0.5,0.5); PxTransform planePos = PxTransform(PxVec3(0.0f),PxQuat(PxHalfPi, PxVec3(0.0f, 0.0f, 1.0f))); PxRigidStatic* plane = gPhysicsSDK->createRigidStatic(planePos); plane->createShape(PxPlaneGeometry(), *material); gScene->addActor(*plane); PxTransform boxPos(PxVec3(0.0f, 10.0f, 0.0f)); PxBoxGeometry boxGeometry(PxVec3(2,2,2)); gBox = PxCreateDynamic(*gPhysicsSDK, boxPos, boxGeometry, *material, 1.0f); gScene->addActor(*gBox); }
void PhysXRigidManager::addStaticBody(const std::string & scene, physx::PxScene * world, physx::PxCooking * mCooking, nau::physics::IPhysics::BoundingVolume shape, physx::PxMaterial * material) { PxPhysics *gPhysics = &(world->getPhysics()); PxRigidStatic * staticActor; PxTransform trans = PxTransform(PxMat44(rigidBodies[scene].info.extInfo.transform)); switch (shape.sceneShape) { case nau::physics::IPhysics::BOX: { staticActor = PxCreateStatic( world->getPhysics(), trans, PxBoxGeometry(shape.max[0], shape.max[1], shape.max[2]), *material ); } break; case nau::physics::IPhysics::SPHERE: { staticActor = PxCreateStatic( world->getPhysics(), trans, PxSphereGeometry(shape.max[0]), *material ); } break; case nau::physics::IPhysics::CAPSULE: { staticActor = PxCreateStatic( world->getPhysics(), trans, PxCapsuleGeometry( shape.max[0], shape.max[1] ), *material ); } break; default: { if (scene.compare("plane") == 0) { staticActor = PxCreatePlane( world->getPhysics(), PxPlane(0.0f, 1.0f, 0.0f, 0.0f), *material ); } else { staticActor = gPhysics->createRigidStatic(trans); PxTriangleMeshGeometry triGeom(gPhysics->createTriangleMesh(*getTriangleMeshGeo(world, mCooking, rigidBodies[scene].info.extInfo, true))); //triGeom.triangleMesh = gPhysics->createTriangleMesh(*getTriangleMeshGeo(world, mCooking, rigidBodies[scene].extInfo, true)); staticActor->createShape(triGeom, *material); } } break; } staticActor->userData = static_cast<void*> (new std::string(scene)); world->addActor(*staticActor); rigidBodies[scene].info.actor = staticActor; }
void PhsXWorld::_addRigid(float mass, float friction, float restitution, std::shared_ptr<nau::scene::IScene> &aScene, std::string name, nau::math::vec3 aVec) { PxPhysics *gPhysics = &(m_pDynamicsWorld->getPhysics()); if (mass == 0.0f) { PxRigidStatic* staticActor; if (name.compare("plane") == 0) { staticActor = PxCreatePlane(*gPhysics, PxPlane(0.0f, 1.0f, 0.0f, 0.0f), *(gPhysics->createMaterial(friction, friction, restitution)) ); } else { /*if (name.compare("box") == 0) { staticActor = PxCreateStatic(*gPhysics, PxTransform(PxMat44(const_cast<float*> (aScene->getTransform().getMatrix()))), PxBoxGeometry(1.0f,1.0f,1.0f), *(gPhysics->createMaterial(1.0f, 1.0f, 0.6f)) ); } else {*/ staticActor = gPhysics->createRigidStatic(PxTransform(PxMat44(const_cast<float*> (aScene->getTransform().getMatrix())))); PxTriangleMeshGeometry triGeom; triGeom.triangleMesh = gPhysics->createTriangleMesh(getTriangleMeshGeo(m_pDynamicsWorld, aScene)); staticActor->createShape(triGeom, *(gPhysics->createMaterial(friction, friction, restitution))); //} } staticActor->userData = aScene.get(); m_pDynamicsWorld->addActor(*staticActor); } else { PxRigidDynamic* dynamic; //if (name.compare("ball") == 0) { // dynamic = PxCreateDynamic(*gPhysics, // PxTransform(PxMat44(const_cast<float*> (aScene->getTransform().getMatrix()))), // PxSphereGeometry(1), // *(gPhysics->createMaterial(0.5f, 0.5f, 0.6f)), // 10.0f // ); // //dynamic->setLinearVelocity(PxVec3(0, -50, -100)); //} //else { PxTransform trans = PxTransform(PxMat44(const_cast<float*> (aScene->getTransform().getMatrix()))); dynamic = gPhysics->createRigidDynamic(trans); PxConvexMesh * convexMesh = gPhysics->createConvexMesh(getTriangleMeshGeo(m_pDynamicsWorld, aScene, false)); PxConvexMeshGeometry convGeom(convexMesh); //PxConvexMeshGeometry convGeom(convexMesh, PxMeshScale(0.5f)); //convGeom.convexMesh = gPhysics->createConvexMesh(getTriangleMeshGeo(m_pDynamicsWorld, aScene, false)); //PxShape *shape = dynamic->createShape(convGeom, *(gPhysics->createMaterial(0.5f, 0.5f, 0.6f)), PxShapeFlag::eSIMULATION_SHAPE | PxShapeFlag::eVISUALIZATION | PxShapeFlag::eSCENE_QUERY_SHAPE); PxShape *shape = dynamic->createShape(convGeom, *(gPhysics->createMaterial(friction, friction, restitution))); //shape->setFlag(PxShapeFlag::eSIMULATION_SHAPE, true); //dynamic->setRigidBodyFlag(PxRigidBodyFlag::eKINEMATIC, false); //} dynamic->userData = aScene.get(); //dynamic->setAngularDamping(0.5f); //dynamic->setLinearVelocity(velocity); m_pDynamicsWorld->addActor(*dynamic); } }