好的,我找到了一些解决方法...
它使用 3D MAX 内部代码而不是我自己的,但至少它可以工作:
假设我有一个边缘结构的列表或向量:
struct Edge
{
int nEd0;
int nEd1;
};
还有一个检查边缘是否在列表中的函数:
bool findHardEdge( int v1, int v2 );
这是使用 MNMesh 类从硬边计算平滑组的代码:
MNMesh mm = *pMesh; // pMesh contains vert/face data already and is copied to MNMesh
mm.FillInMesh(); // computes helper data in MNMesh
for( int i = 0; i < mm.nume; i++ ) // iterate over all edges
{
int v1 = mm.E(i)->v1;
int v2 = mm.E(i)->v2;
bool found = findHardEdge( v1, v2 ); // check if the edge is a 'hard' one
if( found )
mm.E(i)->SetFlag( 32 ); // mark an edge with some flag
}
mm.SmoothByCreases( 32 ); // this method does the job
mm.OutToTri( *pMesh ); // copy data back to the original mesh instance
我意识到这段代码很慢,特别是对于更大的网格,但这也是我想出的最简单的事情。如果您知道任何更好的方法,请告诉我:)