Physx开启double Sided解决卡住的问题

[TOC]

问题描述

有个楼梯的斜面的normal反了,结果会导致模型卡在这个楼梯走不出来,类似于一个封闭的盒子。因为模型现在改不了的缘故,所以就准备技术上先解决一下: 启用double-sided的功能。

  • PVD正面看到楼梯,看不到斜面

  • PVD反面看到的斜面

  • 组合起来看到一个内部封闭的空间,胶囊体掉进来就卡主了

创建double-sided的mesh

PhysX默认是只创建一面三角形的,在PVD里面也可以看到从背面看是没有绘制的。创建三角形几何体的时候设置Flag: PxMeshGeometryFlag::eDOUBLE_SIDED

PxTriangleMeshGeometry(pTriangleMesh, PxMeshScale(PxVec3(gScale.x, gScale.y, gScale.z),
					PxQuat(gScaleRotaion.x, gScaleRotaion.y, gScaleRotaion.z, gScaleRotaion.w)), PxMeshGeometryFlag::eDOUBLE_SIDED);

PVD的double-sided效果,正面是可以看到斜面的了

这样在PVD里面就可以看到生效了,斜面正反面都可以看到了。但是,胶囊体还是卡在里面~

问题解决

  • 我们的移动用的move函数,发现原因是move函数默认不支持double-sided
if(PxMeshQuery::sweep(unitDir, impact.mDistance, geom, pose, nbTris, triangles, sweepHit, getSweepHintFlags(sweepTest->mUserParams), &cachedIndex))
  • eMESH_BOTH_SIDES move函数最终用的sweep函数,最后一个参数是是否支持both sides的,但是默认是false
    bool physx::PxMeshQuery::sweep(    const PxVec3& unitDir, const PxReal maxDistance,
                                      const PxGeometry& geom, const PxTransform& pose,
                                  PxU32 triangleCount, const PxTriangle* triangles,
                                      PxSweepHit& sweepHit, PxHitFlags hintFlags_,
                                      const PxU32* cachedIndex, const PxReal inflation, bool doubleSided)
      {
  • 直接修改SDK代码 最后一个参数设置为true
    if(PxMeshQuery::sweep(unitDir, impact.mDistance, geom, pose, nbTris, triangles, sweepHit, getSweepHintFlags(sweepTest->mUserParams), &cachedIndex, 0, true))

问题解决了

总结

  • 开了double-sided,效率肯定会下降的,这个问题正确的做法是修改模型
我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章