# 5.6.2图形处理之纹理映射vtkTextureMapToCylinder

不少人对vtkTextureMapToCylinder很感兴趣，就介绍它。


# vtkTextureMapToCylinder

VTK中定义了多个类实现纹理空间到模型空间的映射，例如vtkTextureMapToPlane通过一个平面建立纹理空间到模型空间的 映射关系；vtkTextureMapToCylinder通过圆柱棉建立映射关系；vtkTextureMapToSphere通过球面建立映射关系。它们的本质是给输入数据的点数据设置纹理坐标，属性数据的一种。

# 示例演示

首先我们对自己生产的圆柱，应用vtkTextureMapToCylinder。利用vtkCylinderSource产生一个圆柱，注意这个圆柱的轴是和全局坐标Y轴平行。

/**********************************************************************

**********************************************************************/
#include <vtkSmartPointer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkTransformTextureCoords.h>
#include <vtkTexture.h>
#include <vtkTextureMapToSphere.h>
#include <vtkTextureMapToCylinder.h>
#include <vtkTexturedSphereSource.h>
#include <vtkCylinderSource.h>

int main (int argc, char *argv[])
{

vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New();

vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();
cylinder->SetHeight(20.0);
cylinder->SetCenter(0, 0, 0);
cylinder->SetResolution(100);

vtkSmartPointer<vtkTextureMapToCylinder> texturemap = vtkSmartPointer<vtkTextureMapToCylinder>::New();
texturemap->SetInputConnection(cylinder->GetOutputPort());
texturemap->SetPreventSeam(0);

vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(texturemap->GetOutputPort());

vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper( mapper );
actor->SetTexture( texture );

vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->SetBackground(1.0, 1.0, 1.0);

vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();

vtkSmartPointer<vtkRenderWindowInteractor> renWinInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renWinInteractor->SetRenderWindow( renderWindow );

renderWindow->SetSize(640, 480);
renderWindow->Render();
renderWindow->SetWindowName("TextureExample");
renderWindow->Render();
renderWindow->Render();
renWinInteractor->Start();

return EXIT_SUCCESS;
}

## 运行结果：

默认情况下，纹理映射是重复的，如果不想重复，可以调用SetPreventSeam(0)。为什么这样呢？vtkTextureMapToCylinder的原理是将数据的点投影到特定线段（默认利用vtkOBBTree求得最长轴作为这个线段），在这个线段上的比例作为纹理坐标的t；投影的夹角来设置纹理坐标的s，默认情况下0度到180度对应0到1,1180度到360度对应0到1。所以纹理映射是重复的。调用SetPreventSeam(0)后，0度到360度对应0到1。

我们发现无论是否设置SetPreventSeam，都存在白线，即纹理映射有问题。这是为什么？求纹理坐标s时，从0度到360度是闭环的，那么在360度或者180度时，从s=1到s=0没有指明如何纹理映射。OpenGL中可以设置镜像重复解决，VTK中不知道如何设置解决。如果知道，请留言。谢谢。

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120