2

我需要为 3ds Max 实现一个导入器,它将加载一些自定义网格数据。我已经实现了大部分加载代码,但我还有一个问题需要解决。

我需要使用的数据格式使用称为“硬边”的结构来描述表面平滑度,但 3ds Max 使用“平滑组”,虽然这两种方法都工作得很好,但我需要某种方法将一种转换为第二种。

基本上我有一些网格顶点/面加载到 3ds 中,现在我需要根据我的文件中的硬边列表计算这些面的平滑组。

您能否指出任何有助于我实现转换的算法或任何线索?

我尝试搜索google等,有很多关于平滑组的教程和文章,但从3ds Max用户(建模)的角度来看。我找不到任何关于对代码执行相同操作的内容(而且我不会为此询问 API,我知道 API,但我需要一种算法来计算 SG)。

4

1 回答 1

2

好的,我找到了一些解决方法...

它使用 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

我意识到这段代码很慢,特别是对于更大的网格,但这也是我想出的最简单的事情。如果您知道任何更好的方法,请告诉我:)

于 2013-11-04T16:01:25.810 回答