Unity3Dはインポートされた.obj頂点数をどのように減らしますか?


8

Unity3Dが.objファイルのインポートをどのように処理するかについて質問があります。私はこのティーポットをインポートしています:http : //groups.csail.mit.edu/graphics/classes/6.837/F03/models/teapot.obj

このティーポットにある頂点の数は3644です。UnityのMeshクラスは、同じ頂点によって共有される各面に対してこれらの頂点を複製する必要があることを知っています。.objからインポートしたキューブでこれを試し、Debug.Log()を使用して頂点の数を出力しました。メッシュの頂点配列には24個の頂点があることがわかりました。

ただし、ティーポットでは元のファイルに3644の頂点があったため、Unityでは頂点の数は18960になります。代わりに、メッシュの頂点配列の長さを出力すると、3260(元のファイルよりも短い)と出力されます。

この最終的な目的は、UnityのWikiからOBJインポータースクリプトを変更して、このスクリプトから生成される頂点の数がUnityのネイティブインポーターと同じになるようにすることです。参照:http ://wiki.unity3d.com/index.php?title=ObjImporter注:このインポーターを使用して頂点数を出力したところ、結果は18960でした。

この頂点の削減がどのように達成されるかについて誰かが知っていますか?


複雑なアルゴリズム、どのUnityが使用するかはわかりませんが、オンラインで見つけることができます。
MickLH 2013年

回答:


5

さまざまな媒体(プログラム、ファイル形式、API)でジオメトリを保存および処理する方法には、いくつかの要因があります。私はいくつかの商用ジオメトリ分析プログラムを実装したので、ある程度の経験があります。

最初に、これはUnityが何かを単純化することとは関係がないと確信しています。しかし、場合には、それがいくつかあるんでした間引きアルゴリズム実装することができますが、私は必ずゲームエンジンは、(メッシュの幾何学的特性を)形状を変更することが想定されていないので、これは、そうではありませんが、通常はその接続を変更することができます彼の最適な構造に合わせるため。

これらの要因のいくつかは次のとおりです。

頂点をユニークにするものは何ですか?

これは、プログラム、API、またはファイル形式が頂点をどのように処理するかによって大きく異なります。頂点は、一意の位置を持つ場合は一意にすることができますが、一意の属性を持つ場合は一意にすることができます。たとえば、2つの頂点が同じ位置を共有するが、法線が異なる場合、OpenGLの場合は「複製」する必要がありますが、これは、あなたが言及した立方体の場合に特に顕著です。

ここに画像の説明を入力してください ハードエッジとスムーズエッジ。

法線は、エッジがハードまたはスムーズと見なされるかどうかを指示できます。頂点がハードエッジに寄与する場合は、現在のレンダリングAPIがこの面を正しくレンダリング(シェーディング)する方法を理解できるように、エッジを複製する必要があります。

ここに画像の説明を入力してください

指数

多くのファイル形式では、面の頂点に頂点位置/ texCoords /法線のいくつかのインデックスを付けることができますが、これは現在のレンダリングAPIの場合とは異なります。これの良い例はObjファイルです。これはUnityにインデックスを再構築させ、多くの属性を複製して頂点インデックスに一致させます。

接続性

実際に接続され、一意である多くの頂点が複数回保存されます。これは、元のファイルライターがメッシュを処理して保存した方法を実行する必要があります。Unityは重複する頂点の数を減らし(異なる属性がある場合は一意ではないことに注意)、品質を犠牲にすることなく、格納と処理をより効率的にします。

これは、元のファイルが許可するポリゴンサイドの数にも関係します。たとえば、Objは、Nサイドポリゴンを許可します。これは、正気なゲームエンジンでは必要ないため、メッシュを三角形分割し、その属性の多くを再計算することになります。頂点の数を変更します。


わかりました!私が使用した.objインポーターでは、頂点は使用される各面で常に複製されます。そのため、ティーポットで常にハードエッジを取得します(これは、別の問題だと思っていたため、これまで言及していません)。正解です。
VitorOliveira 2013年

2

位置、法線、テクスチャ座標が分離されており、各面が各ストリームから任意のインデックスを選択できるため、Obj形式は特に奇妙です。頂点の数を参照するとき、頂点の位置と法線の数は同じではなく、実際には全体の数を参照することはできないと思います。

ロード中に、これらの3つの属性をすべてマージする必要があります。その頂点位置に関連付けられている面が2つの法線に関連付けられているため、1つの頂点位置の複製が終了する可能性があります。これも逆に発生する可能性があるため、ほとんどのローダーにはobjを最適化するステップがありますが、キューブの場合、キューブにはハードエッジがあり、各頂点の法線(またはテクスチャ座標)が異なるため、最適化は機能しません。これが、6つの頂点位置をカウントしたが、それらの位置を1つに複製して24の頂点を作成した理由です。

メッシュをロードするには、位置/法線またはテクスチャ座標を複製できるため、これを最適化することは簡単ではありません。つまり、これら3つのストリームから重複の最小数を選択することになります。


この答えは、concept3dが言ったことを非常に補完するものであり、この問題を理解するのに役立ちました。したがって、今のところ、.objインポーターは常にハードエッジを持っていると思いますが、それを改善したい場合は、アルゴリズムを検索して、どの頂点を複製する必要があるかを知るのに役立つようにします。または少なくとも最適化された)頂点数。
VitorOliveira 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.