1.纹理映射
纹理映射是将纹理空间中的纹理像素映射到屏幕空间中的像素过程。纹理生成过程本质上是将定义的纹理映射到某个三维物体的表面,并参与后续的光计算。在三维图形中,纹理映射被广泛使用,特别是对真实物体的描述。 纹理映射的实现主要是建立纹理空间与模型空间、模型空间与屏幕空间的映射关系,如下图所示
其 纹理空间可以定义为u-v空间,每个坐标轴的范围为(0,1)。对于纹理图像,左下角的坐标为(0,0),右上角(1,1)。对于简单的参数模型,模型与纹理空间的映射关系可以很容易地建立起来,如球面和圆柱面。 根据图形学的三维空间转换,模型空间到屏幕空间的转换很容易实现,因此计算机屏幕图像及时纹理映射后最终显示的结果。 面对无参数曲面的纹理映射技术,通常需要将纹理空间的映射分解为两个简单的映射,并引入一个中介映射介质来包围场景。步骤如下:二维纹理空间映射为简单的三维物体表面(球圆柱形表面等);然后将中介物体表面的纹理映射到模型表面(例如,模型表面的法线和中间建筑模型的角度作为映射点),从纹理空间映射到模型空间。
2.VTK纹理映射映射
VTK从纹理空间到模型空间的映射定义了多个类别
- vtkTextureMapToPlane:从平面到模型空间建立纹理空间的映射关系
- vtkTextureToSphere:在球面上建立映射关系;
- vtkTextureMapToCylinder:映射关系是通过圆柱面建立的;
- vtkTexture:实现加载纹理;
- vtkTransformTextureCoords:实现纹理坐标的平移和缩放。
3.使用vtkTextureMapToCylinder建立纹理映射实例
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle); #include <vtkSmartPointer.h> #include <vtkBMPReader.h> ///阅读纹理图像 #include <vtkTexture.h> //加载纹理图像 #include <vtkXMLPolyDataReader.h>//加载模型数据 #include <vtkTextureMapToCylinder.h>///以圆柱为中介 #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkOrientationMarkerWidget.h> #include <vtkAxesActor.h> #include <vtkOrientationMarkerWidget.>
int main(int argc, char* argv[])
{
vtkSmartPointer<vtkBMPReader> texReader =
vtkSmartPointer<vtkBMPReader>::New();
texReader->SetFileName("data/Lena.bmp");
vtkSmartPointer<vtkTexture> texture =
vtkSmartPointer<vtkTexture>::New();
texture->SetInputConnection(texReader->GetOutputPort());
vtkSmartPointer<vtkXMLPolyDataReader> modelReader =
vtkSmartPointer<vtkXMLPolyDataReader>::New();
modelReader->SetFileName("data/cow.vtp");
//纹理映射
vtkSmartPointer<vtkTextureMapToCylinder> texturemap =
vtkSmartPointer<vtkTextureMapToCylinder>::New();
texturemap->SetInputConnection(modelReader->GetOutputPort());
/*******************************************************************/
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(texturemap->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->SetTexture(texture); //加载纹理图
//设定坐标系
vtkSmartPointer<vtkAxesActor> axes =
vtkSmartPointer<vtkAxesActor>::New();
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->SetBackground(0, 0, 0);
vtkSmartPointer<vtkRenderWindow> rw =
vtkSmartPointer<vtkRenderWindow>::New();
rw->AddRenderer(renderer);
rw->SetSize(640, 480);
rw->SetWindowName("TextureMap");
vtkSmartPointer<vtkRenderWindowInteractor> rwi =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
rwi->SetRenderWindow(rw);
/**********************************************************/
vtkSmartPointer<vtkOrientationMarkerWidget> widget =
vtkSmartPointer<vtkOrientationMarkerWidget>::New();
widget->SetOutlineColor(1, 1, 1);
widget->SetViewport(0, 0, 0.3, 0.3);
widget->SetOrientationMarker(axes);
widget->SetInteractor(rwi);
widget->SetEnabled(1);
widget->InteractiveOn();
/**********************************************************/
renderer->ResetCamera();
rw->Render();
rwi->Start();
return 0;
}