本文介绍vtkTransformTextureCoods类。
在《VTK纹理映射》文中,我们其实用的都是2D纹理,使用一张图片。它的坐标系是(s,t),即前面提到的u-v。
也可以有3D纹理,它被认为是多个2D Texture。,坐标系s-t-r。
vtkTransformTextureCoods类用来变换纹理坐标的,包括缩放、旋转和平移。即它是一个操作纹理坐标的filter,任何数据集都可以作为输入,同时输出和输入类型一直的数据集。被操作的纹理坐标被看作r-s-t,如上图所示。如果纹理映射是二维的,t 坐标就会被忽略。
vtkSmartPointer<vtkBMPReader> texReader =
vtkSmartPointer<vtkBMPReader>::New();
texReader->SetFileName("E:/TestData/masonry.bmp");
vtkSmartPointer<vtkTexture> texture =
vtkSmartPointer<vtkTexture>::New();
texture->SetInputConnection(texReader->GetOutputPort());
vtkSmartPointer<vtkXMLPolyDataReader> modelReader =
vtkSmartPointer<vtkXMLPolyDataReader>::New();
modelReader->SetFileName("E:/TestData/cow.vtp");
vtkSmartPointer<vtkTextureMapToCylinder> texturemap =
vtkSmartPointer<vtkTextureMapToCylinder>::New();
texturemap->SetInputConnection(modelReader->GetOutputPort());
vtkSmartPointer<vtkTransformTextureCoords> transformTexture =
vtkSmartPointer<vtkTransformTextureCoords>::New();
transformTexture->SetInputConnection(texturemap->GetOutputPort());
transformTexture->SetScale(1, 1, 0); //由于是二维映射,所以第三个参数r-Axis是不起作用的。
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(texturemap->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->SetTexture(texture);
将actor加入自己的vtkRenderer实例中,运行结果:
验证修改r-axis参数,不起作用:
实现重复纹理,将纹理坐标s、t方向进行放大,有[0,1]变换成[0,5]: