メッシュ (OdDbSubDMesh) は、サーフェスを形成する頂点のセットです。メッシュには、色や法線などの機能が含まれます。
色を使用すると、メッシュの個々の要素 (面、頂点) の色を設定できます。
- OdResult setVertexNormalArray(OdGeVector3dArray& arrNorm) メソッド — 頂点法線の配列を提供します。
- OdResult getNormalArray (OdGeVector3dArray& normalArray) const メソッド — レベル0 (ベース) の頂点法線配列を返します (計算します)。
- OdResult getSubDividedNormalArray(OdGeVector3dArray& normalArray) const — スムーズ化されたメッシュの頂点法線配列を返します (計算します)。
法線の場合、getNormalArray(…) および getSubDividedNormalArray(…) メソッドは、すべての頂点の法線を計算します。また、手動で計算された頂点法線の配列 (setVertexNormalArray(…) を使用) を提供することもできます。ただし、法線はレベルゼロメッシュの制御点と1対1で対応している必要があります。頂点法線配列の長さは、制御点配列の長さと一致する必要があります。
OdDbSubDMesh クラスの getNormal メソッドを使用すると、メッシュサーフェス上の法線を計算できます。以下にソースコードの例を示します。
OdDbSubDMeshPtr pMesh = OdDbSubDMesh::createObject();
...
pMesh->setCylinder(90., 60., 90., 3, 3, 3, 4);
OdGeVector3dArray normals;
pMesh->getSubDividedNormalArray(normals);
pMesh->setVertexNormalArray(normals);
...
このソースコードを実行した結果を以下に示します。左側のメッシュ (シェーディングモード) には法線がありません。右側のメッシュには法線があり、その結果、滑らかなサーフェスが得られます。
メッシュ (OdDbSubDMesh) には、0から4までの5段階の滑らかさのレベルがあります。滑らかさのレベルを再定義 (再割り当て) できます。滑らかさのレベルがサーフェスに適用され、subdRefine() メソッドが呼び出されると、すべてのサーフェスプロパティ (頂点、エッジ、面) が再計算されます。また、サーフェスは新しい滑らかさのレベル (たとえば4) を受け取り、そのレベルはゼロとして受け入れられます。
ソースコードの例:
…
for (int levSmooth = 0; levSmooth <= 4; levSmooth++)
{
OdDbSubDMeshPtr pMesh = OdDbSubDMesh::createObject();
pMesh->setCylinder(90., 60., 90., 3, 3, 3, levSmooth);
res = pMesh->subdRefine();
}
…
作成されたメッシュを開いてレンダリングすると、0から4までのレベルスムージングが適用された結果が以下に示されます。
ワイヤーフレームモード:
リアリスティックモード:
メッシュはサーフェスに変換できます。これらのメソッドを使用すると、指定されたエンティティをサーフェスに変換できます。
OdResult convertToSurface (bool bConvertAsSmooth, const OdDbSubentId& id, OdDbSurfacePtr& pSurface) const;
- bool bConvertAsSmooth – isn`t supported yet.
- const OdDbSubentId& id – specified entity, which will be converted to surface.
- OdDbSurfacePtr& pSurface – resulting surface.
OdResult convertToSurface (bool bConvertAsSmooth, bool optimize, OdDbSurfacePtr& pSurface) const;
- bool bConvertAsSmooth, bool optimize – isn`t supported yet.
- OdDbSurfacePtr& pSurface – resulting surface.
また、メッシュを3Dソリッドに変換することもできます。OdDbSubDMesh の API メソッドを以下に示します。
OdResult convertToSolid (bool bConvertAsSmooth, bool optimize, OdDb3dSolidPtr& pSolid) const;
- bool bConvertAsSmooth, bool optimize – isn`t supported yet.
- OdDb3dSolidPtr& pSolid – resulting solid.
OdDbSubDMesh API を使用すると、標準プリミティブ (ボックス、球、円柱、ピラミッド、くさび、円錐、トーラス) を作成できます。以下に、これらの操作のコード例と描画結果を示します。
…
OdDbSubDMeshPtr pMesh = OdDbSubDMesh::createObject();
pMesh->setBox(30, 30, 30, 3, 3, 3, 0);
OdDbSubDMeshPtr pMesh1 = OdDbSubDMesh::createObject();
pMesh1->setSphere(30., 10, 10, 4);
OdDbSubDMeshPtr pMesh2 = OdDbSubDMesh::createObject();
pMesh2->setCone(30., 30., 30., 3, 3, 3, .0, 4);
OdDbSubDMeshPtr pMesh3 = OdDbSubDMesh::createObject();
pMesh3->setPyramid(90., 60., 3, 3, 3, 3, .0, 0);
OdDbSubDMeshPtr pMesh4 = OdDbSubDMesh::createObject();
pMesh4->setTorus(90., 3, 3, .2, 0, 4);
OdDbSubDMeshPtr pMesh5 = OdDbSubDMesh::createObject();
pMesh5->setWedge(100., 100., 100., 2, 2, 2, 2, 2, 0);
…
シェーディングモード:
ワイヤーフレームモード:
スムージングレベルが上がると、頂点と面の数も増加します。以下にコード例とレンダリング結果を示します。
… database preparation
for (int levSmooth = 0; levSmooth <= 4; levSmooth++)
{
OdDbSubDMeshPtr pNew = OdDbSubDMesh::createObject();
OdGePoint3dArray vertexArray;
OdInt32Array faceArray;
vertexArray.append(OdGePoint3d(0, 0, 0));
vertexArray.append(OdGePoint3d(1, 0, 0));
vertexArray.append(OdGePoint3d(1, 1, 0));
vertexArray.append(OdGePoint3d(2, 2, 0));
faceArray.append(3);
faceArray.append(0);
faceArray.append(1);
faceArray.append(2);
pNew->setSubDMesh(vertexArray, faceArray, levSmooth); // eOk
pNew->subdRefine();
... saving database
}
注: subdRefine() メソッドが呼び出されると、メッシュは対応する滑らかさに再計算されますが、現在の滑らかさのレベルはベース (0) として割り当てられます。
ワイヤーフレームモード:
スムージング(subdRefine()呼び出し)により、面と頂点の数が変化していることがわかります。
レベル 0: 頂点(3), 面(1);
レベル 1: 頂点(8), 面(3);
レベル 2: 頂点(20), 面(12);
レベル 3: 頂点(62), 面(48);
レベル 4: 頂点(218), 面(192);