Sw2 PhysX
Kiindulás cg.iit.bme.hu/~szecsi/sw2/GraphGameSw2PhysXInitial.zip include és lib könyvtárak beállítása
createResources: physx init static PxDefaultErrorCallback gDefaultErrorCallback; static PxDefaultAllocator gDefaultAllocatorCallback; static PxSimulationFilterShader gDefaultFilterShader = PxDefaultSimulationFilterShader; foundation = PxCreateFoundation(PX_FOUNDATION_VERSION, gDefaultAllocatorCallback, gDefaultErrorCallback); physics = PxCreatePhysics(PX_PHYSICS_VERSION, *foundation, PxTolerancesScale(), false);
PhysX scene létrehozás PxSceneDesc sceneDesc(physics->getTolerancesScale()); sceneDesc.gravity = PxVec3(0.0f, -9.81f, 0.0f); if (!sceneDesc.cpuDispatcher) { cpuDispatcher = PxDefaultCpuDispatcherCreate(1); sceneDesc.cpuDispatcher = cpuDispatcher; } if (!sceneDesc.filterShader) sceneDesc.filterShader = gDefaultFilterShader; scene = physics->createScene(sceneDesc);
anyag material = physics->createMaterial(0.5, 0.5, 0.5);
Labda hozzunk létre egy Ball példányt nézzük meg a konstruktorát gravitáció most legyen (kommentezzük ki a kikapcsolását) paraméterek ballMesh tegyük be az entities vektorba
Eredmény megjelenő labda
animate scene->simulate(dt); scene->fetchResults(true);
Eredmény zuhanó labda
Platform létrehozása mesh betöltése ball mintájára ütközőgeometria Ball mintájára (új Platform osztály) PxBoxGeometry( PxVec3(50, 5, 50)) entitás létrehozása Ball mintájára
Eredmény zuhanó labda és platform
Kinematikus platform actor->setRigidBodyFlag(PxRigidBodyFlag::eKINEMATIC, true); //PxRigidBodyExt::updateMassAndInertia(*actor, density);
Eredmény platformon pattogó labda
Robotkar alkatrészei mesh-ek betöltése ball mintájára ütközőgeometriák Ball mintájára (új osztályok) actor->setActorFlag(PxActorFlag::eDISABLE_GRAVITY, true); entitások ügyesen elhelyezve egyelőre csak a base12 elem elég a platformhoz fogjuk jointolni később majd a többi alkatrész is kell
Joint építő metódus void buildJoint( Entity::P r0, Entity::P r1, const physx::PxVec3& anchor, const physx::PxVec3& axis, int motorKey, int motorBackwardsKey);
Joint építő metódus void Game::buildJoint(Entity::P r0, Entity::P r1, const PxVec3& anchor, const PxVec3& axis, int motorKey, int motorBackwardsKey) { PxVec3 turn = axis.cross(PxVec3(1, 0, 0)); float qangle = asin(turn.magnitude()); PxVec3 qaxis = turn.getNormalized(); if (qangle < 0.0001f) qaxis = PxVec3(0, 1, 0); if (axis.x < 0) qangle += 3.14; }
Joint építő metódus PxD6Joint* joint = PxD6JointCreate(*physics, r0->getActor(), r0->getActor()->getGlobalPose().getInverse() * PxTransform(anchor) * PxTransform(PxQuat(qangle, qaxis)), r1->getActor(), r1->getActor()->getGlobalPose().getInverse() * PxTransform(anchor) * PxTransform(PxQuat(qangle, qaxis)));
Joint építő metódus joint->setMotion(PxD6Axis::eX, PxD6Motion::eLOCKED); joint->setMotion(PxD6Axis::eY, PxD6Motion::eLOCKED); joint->setMotion(PxD6Axis::eZ, PxD6Motion::eLOCKED); joint->setMotion(PxD6Axis::eTWIST, PxD6Motion::eFREE); joint->setMotion(PxD6Axis::eSWING1, PxD6Motion::eLOCKED); joint->setMotion(PxD6Axis::eSWING2, PxD6Motion::eLOCKED); }
buildJoint segítségével elemek kapcsolása platformhoz kötve a base elem függőleges tengely körül foroghat ejtsünk rá pattogó labdákat ügyesen, hogy lássuk hogy tényleg elforog-e
Motor a jointba PxD6JointDrive drive(100000.0f, 100000.0f, PX_MAX_F32, false); joint->setDrive(PxD6Drive::eTWIST, drive); joint->setDrivePosition(PxTransform(PxQuat(1, PxVec3(1.0f, 0.0f, 0.0f))));
Eredmény elfordult, pozíciótartó joint
Joint adatszerkezet Game.h-ba struct JointData { physx::PxD6Joint* joint; int motorKey; int motorBackwardsKey; float angle; }; std::vector<JointData> joints;
Joint mentése a buildJointban JointData jd; jd.joint = joint; jd.motorKey = motorKey; jd.motorBackwardsKey = motorBackwardsKey; jd.angle = 0.0f; joints.push_back(jd);
Game::animate minden jointra aztán a szimuláció keysPressed alapján joint.angle növelés vagy csökkentés setDrivePosition aztán a szimuláció
Eredmény forgatható joint
Feladat építsük meg a teljes robotkart próbáljuk meg vele felvenni a labdát