この記事では、メッシュのスムージングに関する詳細を説明します。
OdDbSubDMeshImplは、スムージングに使用される一連のメソッドを持つクラスです。一般的に、メッシュは以下のメソッドを使用してスムージングできます。
OdResult subdDivideUp ();
OdResult subdDivideDown ();
最初のメソッドは、サブディビジョンレベルを上げることでスムージングレベルを1つ上げます。2番目のメソッドは、サブディビジョンレベルを下げることでスムージングレベルを1つ下げます。
しかし、これらのメソッドはスムージングレベルを設定するだけであり、変更はメッシュデータを再計算するOdResult subdRefine ()を呼び出すことによって適用されます。
したがって、コードは次の形式になります。
…
mesh.subdDivideUp();
mesh.subdRefine();
...
または、次を呼び出すことでスムージングレベルを直接設定できます。
OdResult subdLevel (OdInt32& result)
下の画像は、スムージングを変更するとサンプルソリッドモデルにどのように影響するかを示しています。ここでは、スムージングレベルが0から3に1ずつ増加し、その後3から0に減少しています。
上記の画像では、スムージングレベルの視覚的な表現と、それがsubdDivideUp ()およびsubdDivideDown ()によってどのように影響されるかを確認できます。その後、subdRefine ()が呼び出されると、面、エッジ、頂点が再計算されます。
レベル0では、変更されていないエンティティがあります。スムージングレベル3では、元の面、エッジ、頂点に従って追加の面が計算されます。これにより、スムージングレベル1が得られます。次に、計算が繰り返されますが、すでにスムージングレベル1で取得されたデータが使用され、スムージングレベル2などが得られます。結果として、これによりメッシュをスムージングすることが可能になります。さらに、このスムージングレベルのために計算されたすべてのデータは仮想的なものであり、ファイルに書き込まれることはなく、設定されたスムージングレベルに基づいてレンダリング時に再計算されます。
また、サブエンティティのスムージングを制御することもできます。これはどういう意味でしょうか?メッシュがあり、一部のエッジをスムージングしたいとします。次の画像では、スムージングされたエッジが赤でマークされています。
以下を使用できます。
OdResult setCrease (double creaseVal);
OdResult setCrease (const OdDbFullSubentPathArray & subentPaths, double creaseVal);
これらのメソッドを使用すると、メッシュオブジェクトの面、エッジ、または頂点を「シャープ」にすることができます。これにより、メッシュオブジェクトのどのサブオブジェクトがスムージングスキームの影響を受けないかを示すことができます。
これらのメソッドは、以下のいずれかの値を取ることができるcreaseValを受け入れます。
- -1 — サブエンティティはスムーズ化されません。
- 0 — サブエンティティは常にスムーズ化されます。
- 任意の正の値 — この値がメッシュのスムーズネスレベル以下の場合にのみ、サブエンティティはスムーズ化されます。言い換えれば、この値は特定のサブエンティティのスムージングを開始すべきレベルを示します。現在、このオプションはエッジのみをサポートしており、面と頂点はまだサポートされていません。
例えば、エッジサブエンティティに対してsetCrease (1.); を呼び出し(前の画像を参照)、メッシュのスムーズネスレベルを0から3に変更した場合、スムーズネスレベルが1の場合にのみエッジがスムーズ化されます(下の画像を参照)。