void createChain(const PxTransform& t, PxU32 length, const PxGeometry& g, PxReal separation, JointCreateFunction createJoint) { PxVec3 offset(separation / 2, 0, 0); PxTransform localTm(offset); PxRigidDynamic* prev = NULL; for (PxU32 i = 0; i<length; i++) { PxRigidDynamic* current = PxCreateDynamic(*gPhysics, t*localTm, g, *gMaterial, 1.0f); (*createJoint)(prev, prev ? PxTransform(offset) : t, current, PxTransform(-offset)); gScene->addActor(*current); prev = current; localTm.p.x += separation; } }
// add some physics objects into the scene void AddPhyObjects() { PxRigidStatic* groundPlane = PxCreatePlane(*gPhysics, PxPlane(0, 1, 0, 0), *gMaterial); gScene->addActor(*groundPlane); PxShape* shape = gPhysics->createShape(PxBoxGeometry(1.0f, 1.0f, 1.0f), *gMaterial); PxTransform localTm(PxVec3(-3.0f, 5.0f, 0.f)); PxRigidDynamic* body = gPhysics->createRigidDynamic(localTm); body->attachShape(*shape); PxRigidBodyExt::updateMassAndInertia(*body, 10.0f); gScene->addActor(*body); shape->release(); shape = gPhysics->createShape(PxSphereGeometry(1.0f), *gMaterial); PxTransform localTmS(PxVec3(3.0f, 5.0f, 0.f)); body = gPhysics->createRigidDynamic(localTmS); body->attachShape(*shape); PxRigidBodyExt::updateMassAndInertia(*body, 10.0f); gScene->addActor(*body); shape->release(); PxRigidDynamic* dynamic = PxCreateDynamic(*gPhysics, PxTransform(PxVec3(0, 20, 20)), PxSphereGeometry(1), *gMaterial, 10.0f); dynamic->setAngularDamping(0.5f); dynamic->setLinearVelocity(PxVec3(0, -5, -10)); gScene->addActor(*dynamic); // add capsule into the scene shape = gPhysics->createShape(PxCapsuleGeometry(1.0f, 3.0f), *gMaterial); PxTransform localTmC(PxVec3(3.0f, 5.0f, -3.f)); body = gPhysics->createRigidDynamic(localTmC); body->attachShape(*shape); PxRigidBodyExt::updateMassAndInertia(*body, 10.0f); gScene->addActor(*body); // add a static box as the trigger shape = gPhysics->createShape(PxBoxGeometry(1.0f, 1.0f, 1.0f), *gMaterial); PxTransform localTmTrigger(PxVec3(0.0f, 1.0f, -10.f)); body = gPhysics->createRigidDynamic(localTmTrigger); shape->setFlag(PxShapeFlag::eSIMULATION_SHAPE, false); shape->setFlag(PxShapeFlag::eTRIGGER_SHAPE, true); body->attachShape(*shape); body->setRigidBodyFlag(PxRigidBodyFlag::eKINEMATIC, true); gScene->addActor(*body); shape->release(); }
void JF::Component::ColisionBox::Reset() { // 1) auto* pTransform = GetOwner()->GetComponent<JF::Component::Transform>(); XMFLOAT4X4& rMatrix = pTransform->GetTransformMatrix(); assert(pTransform != nullptr); // 2) m_pShape = m_pPXDevice->GetPhysics()->createShape( PxBoxGeometry(m_Size.x, m_Size.y, m_Size.z), *m_pPXDevice->GetMaterial()); // 3) PxTransform localTm( PxMat44( PxVec4(rMatrix._11, rMatrix._12, rMatrix._13, rMatrix._14), PxVec4(rMatrix._21, rMatrix._22, rMatrix._23, rMatrix._24), PxVec4(rMatrix._31, rMatrix._32, rMatrix._33, rMatrix._34), PxVec4(rMatrix._41, rMatrix._42, rMatrix._43, rMatrix._44) )); // 4) m_pRigidBody = m_pPXDevice->GetPhysics()->createRigidDynamic(localTm); m_pRigidBody->attachShape(*m_pShape); PxRigidBodyExt::updateMassAndInertia(*m_pRigidBody, 10.0f); m_pRigidBody->setLinearVelocity(PxVec3(0, 10, 2.0f)); m_pPXDevice->GetScene()->addActor(*m_pRigidBody); // 5) float cX = 0.0f; float cY = 0.0f; float cZ = 0.0f; float eX = 1.0f; float eY = 1.0f; float eZ = 1.0f; // 정점 JF::Vertex::PosColor vertices[] = { // 1, 1, 1 (0) { XMFLOAT3(cX + eX, cY + eY, cZ + eZ), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) }, // 1, 1, -1 (1) { XMFLOAT3(cX + eX, cY + eY, cZ + -eZ), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) }, // -1, 1, 1 (2) { XMFLOAT3(cX + -eX, cY + eY, cZ + eZ), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) }, // -1, 1, -1 (3) { XMFLOAT3(cX + -eX, cY + eY, cZ + -eZ), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) }, // 1, -1, 1 (4) { XMFLOAT3(cX + eX, cY + -eY, cZ + eZ), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) }, // 1, -1, -1 (5) { XMFLOAT3(cX + eX, cY + -eY, cZ + -eZ), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) }, // -1, -1, 1 (6) { XMFLOAT3(cX + -eX, cY + -eY, cZ + eZ), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) }, // -1, -1, -1 (7) { XMFLOAT3(cX + -eX, cY + -eY, cZ + -eZ), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) } }; m_VertexSize = ARRAYSIZE(vertices); // 인덱스 UINT indices[] = { // Top 0,1, 1,3, 3,2, 0,2, // Bottom 4,5, 5,7, 7,6, 6,4, // Top - Bottom 0,4, 1,5, 2,6, 3,7 }; m_indexCnt = ARRAYSIZE(indices); // Create gRENDERER->CreateVertexBuffer(&vertices[0], sizeof(JF::Vertex::PosColor) * m_VertexSize, &m_VertBuff); gRENDERER->CreateIndexBuffer(&indices[0], sizeof(UINT) * m_indexCnt, &m_IndexBuff); }