Teigha Visualizeには、マッピング座標が存在しない場合でも正しいテクスチャ設定を使用するためのマッピングメカニズムがあります。このチュートリアルでは、球体を作成し、マッパーを使用してテクスチャを設定します。
ボールの作成方法を見てみましょう。
モデルとデータベースIDがあるとします。データベースへのポインタを取得し、このモデルにエンティティを追加し、それに球体を追加しましょう。
// Open database
OdTvDatabasePtr pTvDb = databaseId.openObject();
// Create entity
OdTvModelPtr modelPtr = modelId.openObject(OdTv::kForWrite);
OdTvEntityId entityId = modelPtr->appendEntity(OD_T("Ball"));
OdTvEntityPtr pEntity = entityId.openObject(OdTv::kForWrite);
// Append sphere to entity
pEntity->appendShellFromSphere(OdTvPoint(3., 3., 3.), 0.9, OdTvVector::kYAxis, OdTvVector::kXAxis, 50);
次に、マテリアルとマテリアルマップを作成し、それをエンティティに設定します。
// Create material with unique name
OdTvMaterialId materialId = pTvDb->createMaterial("Material");
OdTvMaterialPtr pMaterial = materialId.openObject(OdTv::kForWrite);
// Create material map
OdTvMaterialMap materialMap;
// Set texture path to map
materialMap.setSourceFileName(“../resources/Ball.png”);
// Set material map to material
pMaterial->setDiffuse(OdTvMaterialColor(OdTvColorDef(255, 0, 0)), materialMap);
// Set material to mapper
pEntity->setMaterial(materialId);
マッピング投影タイプはエンティティマッパーに設定されます。これは、テクスチャがジオメトリとどのように関連付けられているかを示します。エンティティには、デフォルトの投影kPlanarを持つデフォルトマッパーがあります。
マッパーなしのテクスチャ:
この場合、マッパータイプはkSphereです。
マッパーには2種類あります。
- エンティティ(OdTvMapperDef)に設定され、テクスチャの平行移動、回転、拡大縮小に使用されます。
- 拡散マップ(OdTvMapper)に使用され、テクスチャのオフセット、拡大縮小、回転に使用されます。
それぞれが変換行列を持っていますが、これらの行列は異なる機能を持っています。OdTvMapperDef変換行列は、3Dオブジェクトにテクスチャの位置を設定するために使用されます。平行移動ベクトルは、3Dシステム内のテクスチャUVゼロ位置を平行移動します。たとえば、球体の場合、それは球体の中心になります。また、別の行列位置にデータを設定することで、テクスチャを軸で回転させることもできます。エンティティマッパーの変換行列は通常、変換行列であるため、その要素は3Dに使用される通常の行列と同じ要素です。
OdTvMapperの変換行列は、オブジェクト上のテクスチャのオフセット、拡大縮小、回転に使用されます。この行列の[0][0]の位置には1 / u_scale、[1][1]の位置には1 / v_scaleが入ります。球体にテクスチャを完全に設定するには、[0][0]と[1][1]の位置は1である必要があります。テクスチャのオフセットは、X方向が[0][3]、Y方向が[1][3]です。Xの場合、オフセットはx * 1 / u_scaleとして計算され、Yの場合はy * 1 / v_scaleです。回転の場合、[0][0]にはcos([0][0])、[0][1]にはsin([0][1])(時計回り)または–sin([0][0])(反時計回り)、[1][0]には–sin([1][1])(時計回り)またはsin([1][1])(反時計回り)、[1][1]にはcos([1][1])を設定します。オフセットは、テクスチャの拡大縮小が1より大きい場合にのみ意味があります。
マッパーの使用を容易にするためのいくつかの方法があります。
- OdTvMapperDef::translate() はテクスチャの位置を設定します。
- OdTvMapperDef::rotate() はテクスチャを回転させます。
- OdTvMapperDef::scale() はテクスチャを軸で拡大縮小します。
- OdTvTextureMapper::setSampleSize() はテクスチャのサンプルサイズを設定します。
- OdTvTextureMapper::setOffset() はテクスチャをオフセットします。
- OdTvTextureMapper::setRotation() はテクスチャを回転させます。
// Create material with unique name
OdTvMaterialId materialId = pTvDb->createMaterial("Material");
OdTvMaterialPtr pMaterial = materialId.openObject(OdTv::kForWrite);
// Create material map
OdTvMaterialMap materialMap;
// Create path to texture image file and set it to map
materialMap.setSourceFileName(“../resources/Ball.png”);
// Create entity mapper
OdTvMapperDef entityMapper;
entityMapper.setProjection(OdTvMapperDef::kSphere);
// Translate and rotate texture
entityMapper.translate(3., 3., 3.);
entityMapper.rotate(0., OdaPI / 2., OdaPI / 2.);
// Create material mapper, set texture sample size and set it to map
OdTvTextureMapper materialMapper;
materialMapper.setSampleSize(1., 1.);
materialMap.setMapper(materialMapper);
// Set mapper to entity
pEntity->setEntityMaterialMapper(entityMapper);
// Set material map to material
pMaterial->setDiffuse(OdTvMaterialColor(OdTvColorDef(255, 0, 0)), materialMap);
// Set material to mapper
pEntity->setMaterial(materialId);
結果は、kSphereマッパーを使用した以下のテクスチャです。