Teigha BIMのアセット用ヘルパークラスを使用したテクスチャ付きマテリアルの作成

Teigha BIMは、セラミック、コンクリート、汎用、グレージング、広葉樹、組積造CMU、金属、メタリックペイント、ミラー、プラスチックビニール、ソリッドガラス、石、壁用塗料、水という14種類のデフォルトマテリアルをサポートしています。各マテリアルには、色、仕上げスタイル、バンプなどのマテリアルレンダリングプロパティを含むレンダリングアセットがあります。マテリアルにはテクスチャも定義できます。

ほとんどすべてのデフォルトマテリアルがテクスチャをサポートしています。テクスチャは金属、ミラー、水のマテリアルだけのものではありません。テクスチャは要素の「スキン」として使用でき、ビットマップファイルを使用してマテリアルの仕上げ効果を定義することも可能です。マテリアルのテクスチャにアクセスしたり設定したりするには、適切なプロパティを使用する必要があります。例えば、石のマテリアルには「stone_color」プロパティでテクスチャを設定できますが、石のマテリアルにはマテリアルの仕上げスタイルを定義する「stone_pattern_map」もあります。

Teigha BIMは、組み込みマテリアルを作成し、マテリアルプロパティにアクセスするためのOdBmAppearanceAssetHelperクラスを提供します。ヘルパークラスのコンストラクタでマテリアルのデフォルトテクスチャを設定できます。他のテクスチャはマテリアルプロパティを通じてアクセス可能です。マテリアルテクスチャのデータを取得、設定、または変更するには、ヘルパークラスOdBmUnifiedBitmapSchemaHelperを使用できます。

テクスチャ付きの新しい汎用マテリアルを作成する例:

OdBmMaterialElemPtr pMaterialElem = OdBmMaterialElem::createObject();
OdBmMaterialTrackingPtr pMaterialTrackingMgr = pDb->getAppInfo(OdBm::ManagerType::MaterialTracking);
OdBmObjectId matObjId = pMaterialTrackingMgr->addMaterial(L"Textured_Material", pMaterialElem);
pMaterialElem->setDatabaseDefaults(pDb);

OdBmAppearanceAssetElemPtr pAppAsset = OdBmAppearanceAssetElem::createObject();
OdBmAppearanceAssetHelper appAssetHelper = OdBmAppearanceAssetHelper(pDb, pMaterialElem->getName(), pAppAsset, OdBm::PredefinedAppearanceAsset::kGeneric, L"texture.png");
OdBmMaterialPtr pMaterial = pMaterialElem->getMaterial();
appAssetHelper.applyToMaterial(pMaterial);

// set properties of material texture
OdBmAssetPtr textureAsset;
OdTf::ErrorStatus es = appAssetHelper.getTextureAsset(textureAsset);
OdBmUnifiedBitmapSchemaHelper textureHelper(textureAsset);

textureHelper.setLinkTextureTransforms(true);
textureHelper.setOffsetLock(true);
textureHelper.setRealWorldOffset(OdGePoint2d(50., 50.), OdBm::kDUT_DECIMAL_INCHES);
textureHelper.setRealWorldScale(OdGePoint2d(50., 50.), OdBm::kDUT_DECIMAL_INCHES);
textureHelper.setScaleLock(false);
textureHelper.setUVRepeat(true, true);
textureHelper.setWAngle(OdaPI4);
textureHelper.setBlur(1.5);
textureHelper.setFiltering(1);
textureHelper.setInvert(false);

データベース内の既存のマテリアルのテクスチャにアクセスする例。

OdBmDatabasePtr pDbDst = app->readFile(L"myMaterial_tmp.rvt", true);
OdBmMaterialElemPtr pMaterialElem = pDbDst->getObjectId(0xFEEE).safeOpenObject();

OdBmAppearanceAssetElemPtr pAppearanceAssetElem = pMaterialElem->getMaterial()->getAppearanceAssetId().safeOpenObject();
OdBmAppearanceAssetHelper appAssetHelper = OdBmAppearanceAssetHelper(pAppearanceAssetElem);
// set properties of default (in diffuse channel) material texture
OdBmAssetPtr textureAsset;
OdTf::ErrorStatus es = appAssetHelper.getTextureAsset(textureAsset);
OdBmUnifiedBitmapSchemaHelper textureHelper(textureAsset);

データベース内の既存のマテリアルのテクスチャにアクセスする例。いくつかの追加機能が使用されます。

static OdString getSchemaName(const OdBmAsset* pAsset) 
{
  OdString schemaName;
  if (pAsset->getAPropertyString(ASSET_PROP_UIDEFINITION, schemaName) == OdTf::eOk) 
  {
    schemaName.replace(L"\\", L"/");
    OdInt32 nSlashPos = schemaName.reverseFind(L"/")+1;
    schemaName = schemaName.mid(nSlashPos, schemaName.find(L"UI.xml")-nSlashPos);
  }
  else 
    schemaName = pAsset->getName().left(pAsset->getName().find(L"Schema"));

  return schemaName;
}

メインコード:

OdBmDatabasePtr pDbDst = app->readFile(L"Stone.rfa", true);
OdBmMaterialElemPtr pMaterialElem = pDbDst->getObjectId(0xFEEE).safeOpenObject();
OdBmAssetPtr pAsset = pMaterialElem ->getMaterial()->getAsset();
OdBmAPropertyPtr pProperty;
if (pAsset->getAProperty(L”stone_pattern_map”, pProperty) && !pProperty.isNull()) 
{
  OdBmObjectPtrArray connAssets;
  pProperty->getAConnected(connAssets);
  for(OdBmObjectPtrArray::const_iterator it = connAssets.begin(); it != connAssets.end(); it++) 
  {
    OdBmAssetPtr pBitmapAsset = *it;
    OdString schemaName = ::getSchemaName(pBitmapAsset);
    if (schemaName.iCompare(L"UnifiedBitmap") != 0)
      continue;

    OdBmUnifiedBitmapSchemaHelper helper(pBitmapAsset);
    // work with texture mapping
    break;    
  }
}

今すぐ始める

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

無料で試す