我们在Mstn中对Mesh附加材质时,材质的纹理贴图是通过材质编辑器中预设置的映射方式映射到Mesh表面上的,如果系统提供的映射方式不能满足我们的使用需求的话,我们还可以通过下图所示的工具去手工调整贴图的位置:
但是这种方式也只能是整体的去调整贴图的位置,如果我们想精确的控制Mesh的每个面对应的贴图纹理坐标该如何实现呢?这里我们就需要给Mesh增加“Param”数据来指定Mesh的每个面对应的贴图纹理坐标了。Mstn SDK在PolyfaceHeader类型下提供了“Param”以及“ParamIndex”两个函数来给Mesh添加这些数据,如下所示:
如下是具体实现代码:
PolyfaceHeaderPtr polyfaceHeader = PolyfaceHeader::CreateFixedBlockIndexed(3); DPoint3d ptArr[4] = { {0,0,0},{10000,0,0},{10000,10000,0},{0,10000,0} }; polyfaceHeader->Point().insert(polyfaceHeader->Point().begin(), ptArr, ptArr + 4); int indexFaceMesh[3] = { 1,2,3 }; polyfaceHeader->PointIndex().insert(polyfaceHeader->PointIndex().begin(), indexFaceMesh, indexFaceMesh + 3); indexFaceMesh[0] = 3; indexFaceMesh[1] = 4; indexFaceMesh[2] = 1; polyfaceHeader->PointIndex().insert(polyfaceHeader->PointIndex().begin(), indexFaceMesh, indexFaceMesh + 3); DPoint2d ptParamArr[4] = { {0.3,0.3},{0.7,0.6},{0.8,0.9},{0,0} }; polyfaceHeader->Param().insert(polyfaceHeader->Param().begin(), ptParamArr, ptParamArr + 4); indexFaceMesh[0] = 1; indexFaceMesh[1] = 2; indexFaceMesh[2] = 3; polyfaceHeader->ParamIndex().insert(polyfaceHeader->ParamIndex().begin(), indexFaceMesh, indexFaceMesh + 3); indexFaceMesh[0] = 1; indexFaceMesh[1] = 2; indexFaceMesh[2] = 3; polyfaceHeader->ParamIndex().insert(polyfaceHeader->ParamIndex().begin(), indexFaceMesh, indexFaceMesh + 3); EditElementHandle eehMesh; DraftingElementSchema::ToElement(eehMesh, *polyfaceHeader, NULL, *ACTIVEMODEL); eehMesh.AddToModel();
可以看到新创建出的Mesh元素多了如下所示的数据:
此时我们对创建出的Mesh去附加材质时,纹理贴图就按照我们这里设置的纹理坐标去映射到Mesh元素的表面了。