我测试发现下面的函数得到的mesh是封闭起来的,但是有误差,通过动态切图发现cut得到的开挖体与原始mesh面有空隙。
void KeyinCommands::testMeshCmd(System::String^ unparsed) { ElementId dtmEleID = 15678; ElementId roadEleID = 15683; EditElementHandle dtmEh(dtmEleID, ACTIVEMODEL); EditElementHandle roadEh(roadEleID, ACTIVEMODEL); MeshHeaderHandler* dtmHeaderHandler = dynamic_cast<MeshHeaderHandler*>(dtmEh.GetDisplayHandler()); MeshHeaderHandler* roadHeaderHandler = dynamic_cast<MeshHeaderHandler*>(roadEh.GetDisplayHandler()); PolyfaceHeaderPtr dtmPoly, roadPoly; dtmHeaderHandler->GetMeshData(dtmEh, dtmPoly); roadHeaderHandler->GetMeshData(roadEh, roadPoly); #pragma region use ComputeSingleSheetCutFill /*PolyfaceHeaderPtr fillvol; DVec3d viewVector = DVec3d::From(0, 0, -1); PolyfaceHeaderPtr tempCutPolyface; PolyfaceHeader::ComputeSingleSheetCutFill(*dtmPoly, *roadPoly, viewVector, tempCutPolyface, fillvol); EditElementHandle cutEh; if (tempCutPolyface.IsValid()) { MeshHeaderHandler::CreateMeshElement(cutEh, NULL, *tempCutPolyface, true, *ACTIVEMODEL); cutEh.AddToModel(); }*/ #pragma endregion #pragma region MyRegion bvector<PolyfaceHeaderPtr> resultAaboveB, resultBaboveA; PolyfaceQuery::ComputeCutAndFill(*roadPoly, *dtmPoly, resultAaboveB, resultBaboveA); if (resultAaboveB.size() > 0) { EditElementHandle cutEh; if (resultBaboveA[0].IsValid()) { MeshHeaderHandler::CreateMeshElement(cutEh, NULL, *resultBaboveA[0], true, *ACTIVEMODEL); cutEh.AddToModel(); } } #pragma endregion }
iBugExample.dgn
这个误差很小,我觉得对于地形来说可以忽略不计吧,本身Mesh与实际模型也不完全吻合的。
其实有较大影响的,这个算完后还继续用,不断积累下来影响挺大的。有的案例切出来的空隙看起来很明显,非常影响视觉效果。。
关键是PolyfaceQuery::ComputeCutAndFill(*roadPoly, *dtmPoly, resultAaboveB, resultBaboveA);可以做到无缝隙,就是做不到边界处闭合,很尴尬
Work smart, not just work hard!
能否截图看下您计算得到的mesh体的属性,尤其是体积那一项?(移动到0点附近以及在原来的位置上)
下图所示是两个元素在原始位置,以不同顺序传递给ComputeSingleSheetCutFill之后得到的结果。
Answer Verified By: Grant Zhang
怎么有两个带体积的mesh?
侧面截图,看下边界处是不是视觉上都封闭住了?
HongQiang Guo said:以不同顺序传递给ComputeSingleSheetCutFill之后得到的结果
感谢郭老师测试,我知道问题在哪里了,是我代码的问题,我后面有对这个mesh处理,导致的问题