本文整理汇总了C++中PxPhysics::createCloth方法的典型用法代码示例。如果您正苦于以下问题:C++ PxPhysics::createCloth方法的具体用法?C++ PxPhysics::createCloth怎么用?C++ PxPhysics::createCloth使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类PxPhysics
的用法示例。
在下文中一共展示了PxPhysics::createCloth方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: PxClothParticle
void
PhsXWorld::_addCloth(float mass, std::shared_ptr<nau::scene::IScene> &aScene, std::string name, nau::math::vec3 aVec) {
PxPhysics *gPhysics = &(m_pDynamicsWorld->getPhysics());
std::shared_ptr<nau::scene::SceneObject> &aObject = aScene->getSceneObject(0);
std::shared_ptr<VertexData> &vd = aObject->getRenderable()->getVertexData();
std::vector<std::shared_ptr<MaterialGroup>> &matGroups = aObject->getRenderable()->getMaterialGroups();
std::vector<std::shared_ptr<MaterialGroup>>::iterator matGroupsIter;
PxDefaultMemoryOutputStream writeBuffer;
int count = static_cast<int> (vd->getDataOf(VertexData::GetAttribIndex(std::string("position")))->size());
PxClothParticle *particles = new PxClothParticle[count];
PxClothMeshDesc meshDesc;
matGroupsIter = matGroups.begin();
for (; matGroupsIter != matGroups.end(); matGroupsIter++) {
if ((*matGroupsIter)->getIndexData()->getIndexSize()) {
std::shared_ptr<std::vector<unsigned int>> &indexes = (*matGroupsIter)->getIndexData()->getIndexData();
PxClothParticle *ptls = particles;
std::shared_ptr<std::vector<VertexData::Attr>> points = vd->getDataOf(VertexData::GetAttribIndex(std::string("position")));
for (int i = 0; i < count; i++) {
VertexData::Attr tempPoint = points->at(i);
//ptls[i] = PxClothParticle(PxVec3(tempPoint.x, tempPoint.y, tempPoint.z), (i==0 || i==1) ? 0.0f : 1.0f);
ptls[i] = PxClothParticle(PxVec3(tempPoint.x, tempPoint.y, tempPoint.z), i == 0 ? 0.0f : 0.1f);
}
meshDesc.points.data = reinterpret_cast<const unsigned char *>(&(vd->getDataOf(VertexData::GetAttribIndex(std::string("position")))->at(0)));
meshDesc.points.count = count;
meshDesc.points.stride = 4 * sizeof(float);
meshDesc.invMasses.data = &particles->invWeight;
meshDesc.invMasses.count = count;
meshDesc.invMasses.stride = sizeof(PxClothParticle);
meshDesc.triangles.data = reinterpret_cast<const unsigned char *>(&((*indexes)[0]));
meshDesc.triangles.count = static_cast<int> (indexes->size() / 3);
meshDesc.triangles.stride = 3 * sizeof(unsigned int);
}
}
//float * points = reinterpret_cast<float *>(&(vd->getDataOf(VertexData::GetAttribIndex(std::string("position")))->at(0)));
//PxU32 numParticles = static_cast<int> (vd->getDataOf(VertexData::GetAttribIndex(std::string("position")))->size());
//PxU32 stride = 4 * sizeof(float);
//// create particles
//PxClothParticle* particles = new PxClothParticle[numParticles];
//PxClothParticle* pIt = particles;
//for (PxU32 i = 0; i<numParticles; ++i) {
// pIt->invWeight = i==0 ? 0.0f : 1.0f;
// int tempStride = i*stride;
// pIt->pos = PxVec3(points[tempStride], points[tempStride + 1], points[tempStride + 2]);
//}
PxClothFabric* fabric = PxClothFabricCreate(*gPhysics, meshDesc, PxVec3(0, -1, 0));
PxTransform pose = PxTransform(PxMat44(const_cast<float*> (aScene->getTransform().getMatrix())));
PxClothFlags flags = PxClothFlags();
/*if(!flags.isSet(PxClothFlag::eSCENE_COLLISION))
flags.set(PxClothFlag::eSCENE_COLLISION);
if (!flags.isSet(PxClothFlag::eGPU))
flags.set(PxClothFlag::eGPU);
if (!flags.isSet(PxClothFlag::eSWEPT_CONTACT))
flags.set(PxClothFlag::eSWEPT_CONTACT);*/
cloth = gPhysics->createCloth(pose, *fabric, particles, flags);
cloth->userData = aScene.get();
cloth->setClothFlag(PxClothFlag::eSCENE_COLLISION, true);
cloth->setClothFlag(PxClothFlag::eGPU, true);
cloth->setClothFlag(PxClothFlag::eSWEPT_CONTACT, true);
cloth->setSolverFrequency(300.0f);
cloth->setInertiaScale(0.9f);
cloth->setStretchConfig(PxClothFabricPhaseType::eVERTICAL, PxClothStretchConfig(0.2f));
cloth->setStretchConfig(PxClothFabricPhaseType::eHORIZONTAL, PxClothStretchConfig(0.2f));
cloth->setStretchConfig(PxClothFabricPhaseType::eSHEARING, PxClothStretchConfig(0.75f));
cloth->setStretchConfig(PxClothFabricPhaseType::eBENDING, PxClothStretchConfig(0.2f));
m_pDynamicsWorld->addActor(*cloth);
}