図面でのメッシュの操作

メッシュ (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);
...

このソースコードを実行した結果を以下に示します。左側のメッシュ (シェーディングモード) には法線がありません。右側のメッシュには法線があり、その結果、滑らかなサーフェスが得られます。

 

image1

 

メッシュ (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までのレベルスムージングが適用された結果が以下に示されます。

ワイヤーフレームモード:

 

image2

 

リアリスティックモード:

 

image3

 

メッシュはサーフェスに変換できます。これらのメソッドを使用すると、指定されたエンティティをサーフェスに変換できます。

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);
  …

シェーディングモード:

 

image5

 

ワイヤーフレームモード:

 

image5

 

スムージングレベルが上がると、頂点と面の数も増加します。以下にコード例とレンダリング結果を示します。

… 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) として割り当てられます。

ワイヤーフレームモード:

 

image6

 

スムージング(subdRefine()呼び出し)により、面と頂点の数が変化していることがわかります。
レベル 0: 頂点(3), 面(1);
レベル 1: 頂点(8), 面(3);
レベル 2: 頂点(20), 面(12);
レベル 3: 頂点(62), 面(48);
レベル 4: 頂点(218), 面(192);

今すぐ始める

ODAソフトウェアを60日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す