2

カスタムメッシュデータをロードするインポーターを3dsMaxに実装する必要があります。ロードコードのほとんどを実装しましたが、まだ解決すべき問題が1つあります。

使用する必要のあるデータ形式は、表面の滑らかさを表すために「ハードエッジ」と呼ばれる構造を使用しますが、3ds Maxは「スムージンググループ」を使用します。どちらのアプローチも非常にうまく機能しますが、1つを2つ目に変換する方法が必要です。

基本的に、いくつかのメッシュ頂点/面が3dsにロードされています。次に、ファイル内のハードエッジのリストに基づいて、それらの面のスムージンググループを計算する必要があります。

変換の実装に役立つアルゴリズムや手がかりを教えていただけますか?

グーグルなどを検索してみましたが、スムーシンググループに関するチュートリアルや記事はたくさんありますが、3ds Maxユーザー(モデリング)の観点からです。コードで同じことを行うことについては何も見つかりません(これを行うためのAPIについては尋ねません。APIは知っていますが、SGを計算するためのアルゴリズムが必要です)。

4

1 に答える 1

2

OK、いくつかの回避策を見つけました...

自分のコードの代わりに3DMAXの内部コードを使用しますが、少なくとも機能します。

エッジ構造体のリストまたはベクトルがあると仮定しましょう。

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 に答える