用PhysX转化地形为trianglemesh

1649 篇文章 11 订阅
1277 篇文章 12 订阅

http://m.blog.csdn.net/blog/perfection_c/4463599

 

在利用NxOgre添加地形的时候遇到了问题,不知道改如何添加地形,使用模型?还是直接读取高度图?因为是刚刚接触到NxOgre对于这些问题很是迷茫,苦苦找不到解决的问题。在网上搜索有关资料也很少,最近在GameRes论坛里面发现了一篇有关于用PhysX转化地形为trianglemesh的文章,所以转过来看看,希望对我以及和我遇到同样问题的朋友有所帮助!

NxActor * CPhysX::CreateTerrainMesh(const NxVec3& pos,const NxU32 length, const NxU32 width,IDirect3DVertexBuffer9* vb,IDirect3DIndexBuffer9* ib)//,const NxReal stride)
{
   NxVec3* fsVerts = NULL;
   WORD* fsFaces = NULL;


   //初始化平面 verts
   NxU32 nbVerts=length*width;


   fsVerts = new NxVec3[nbVerts]; 
   VertexPNUVT* vCol = 0;
   vb->Lock(0,0,(void**)&vCol,0);
   for(DWORD i=0;i<nbVerts;i++)
   {
 memcpy(&fsVerts[i], &vCol[i], sizeof(D3DXVECTOR3));
   }
   vb->Unlock();

   NxU32 nbFaces = (length-1)*(width-1)*2;
   fsFaces = new WORD[nbFaces*3];
   WORD* pIB = NULL;
   ib->Lock(0,0,(void**)&pIB,0);
   memcpy(fsFaces, pIB, sizeof(WORD)*nbFaces*3);
   ib->Unlock();

   NxTriangleMeshDesc fsDesc;
   fsDesc.numVertices = nbVerts;
   fsDesc.numTriangles =nbFaces;
   fsDesc.pointStrideBytes = sizeof(D3DXVECTOR3);
   fsDesc.triangleStrideBytes = 3*sizeof(WORD);
   fsDesc.points = fsVerts;
   fsDesc.triangles = fsFaces; 
   fsDesc.flags =NX_MF_16_BIT_INDICES;

   //因为连续三角网格是不特定常规武器公约因此必须设置,以确保正确的碰撞
   fsDesc.flags |=NX_MF_FLIPNORMALS;

   NxTriangleMeshShapeDesc fsShapeDesc;

   gCooking = NxGetCookingLib(NX_PHYSICS_SDK_VERSION);
   bool ok =  gCooking->NxInitCooking();
      
   // Cooking from memory
   MemoryWriteBuffer buf;
   bool status = gCooking->NxCookTriangleMesh(fsDesc, buf);

 

   fsShapeDesc.meshData = PhysicsSDK->createTriangleMesh(MemoryReadBuffer(buf.data));
    

   if (fsShapeDesc.meshData)
   {
 NxActorDesc actorDesc;
 actorDesc.shapes.pushBack(&fsShapeDesc);
 actorDesc.globalPose.t = pos;
 NxActor* actor = Scene->createActor(actorDesc);
 //SetActorCollisionGroup(actor,3);
 return actor;
 //      gPhysicsSDK->releaseTriangleMesh(*fsShapeDesc.meshData);
   }

return NULL;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
open3d::geometry::TriangleMesh::CreateFromPointCloudAlphaShape 函数是Open3D库中用来根据给定的点云数据创建一个三角网格表达的函数。但当调用这个函数时如果失败,可能由以下几个原因导致: 1. 点云数据为空:函数需要至少存在一个点云数据才能创建三角网格,如果没有输入点云数据,函数将无法执行。 2. Alpha参数设置错误:这个函数需要一个Alpha参数来定义点云数据中点之间的连接程度。如果Alpha参数的值设置得过小,可能导致连接的面过少,从而无法成功创建三角网格。相反,如果Alpha参数的值设置得过大,可能导致连接的面过多,从而导致函数执行时间过长甚至内存溢出。 3. 输入的点云数据不适用于三角网格表示:这个函数是基于Alpha形状重建方法的,对于某些形状的点云数据可能无法成功创建三角网格。例如,如果点云数据中的点分布非常稀疏或是非常集中,都可能导致函数执行失败。 为了解决上述问题,我们可以检查点云数据是否为空、调整Alpha参数的值或者尝试其他适用于形状重建的方法,如Marching Cubes,Poisson Reconstruction等。此外,我们还可以对点云数据进行预处理,例如进行滤波、重采样等操作,以提高函数的成功率。最后,如果上述方法都无法解决问题,可能需要考虑点云数据本身的质量或者使用其他库或方法来处理点云数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值