VTK_Learning_图形基本操作进阶_面绘制纹理映射

1.纹理映射

纹理映射是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。纹理生成过程实质上是将所定义的纹理映射为某种三维物体表面的属性,并参与后续的光照计算。在三维图形中,纹理映射运用的十分广泛,尤其是描述具有真实感的物体。

实现纹理映射主要是建立纹理空间与模型空间、模型空间与屏幕空间之间的映射关系,如上图所示。其中纹理空间可以定义为u-v空间,每个坐标轴的范围为(0,1)。对于一个纹理图像,其左下角的坐标为(0,0),右上角坐标为(1,1)。
而对于简单的参数模型,可以方便地建立模型与纹理空间的映射关系,例如球面、圆柱面等。
而根据图形学三维空间变换容易实现模型空间到屏幕空间的变换,因此最终显示在计算机屏幕的图像及时纹理映射后的结果。
面对无参数化曲面的纹理映射技术,通常需要将纹理空间到模型空间的映射分解为两个简单映射,需要引入一个包围景物的中介映射媒介,只要步骤如下:
现将二维纹理空间映射为一个简单的三维物体表面(球面圆柱面等);然后将该中介物体表面的纹理映射到模型表面(例如,以模型表面法线与中建模型的交点作为映射点),这就可以实现由纹理空间到模型空间映射。
 

2.VTK中实现纹理映射

VTK中定义了多个类实现纹理空间到模型空间的映射

  • vtkTextureMapToPlane:通过一个平面建立纹理空间到模型空间的映射关系;
  • vtkTextureToSphere:通过球面建立映射关系;
  • vtkTextureMapToCylinder:通过圆柱面建立映射关系;
  • vtkTexture:实现加载纹理;
  • vtkTransformTextureCoords:实现纹理坐标的平移和缩放。

本实例使用vtkTextureMapToCylinder建立纹理映射,具体实现如下:
 

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
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.h>
 
 
int main(int argc, char *argv[])
{
 
	vtkSmartPointer<vtkBMPReader> texReader =
		vtkSmartPointer<vtkBMPReader>::New();
	texReader->SetFileName("masonry.bmp");
 
	vtkSmartPointer<vtkTexture> texture =
		vtkSmartPointer<vtkTexture>::New();
	texture->SetInputConnection(texReader->GetOutputPort());
 
	vtkSmartPointer<vtkXMLPolyDataReader> modelReader =
		vtkSmartPointer<vtkXMLPolyDataReader>::New();
	modelReader->SetFileName("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;
}

这个实例应用非常简单,输出结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VTK_CURSOR_CUSTOM是VTK(Visualization Toolkit)中提供的一种自定义光标的方式。使用VTK_CURSOR_CUSTOM可以让用户在VTK应用程序中使用自己定义的光标图像,从而增强应用程序的个性化和用户体验。 要使用VTK_CURSOR_CUSTOM,需要按照以下步骤进行操作: 1. 创建自定义光标图像。可以使用任何绘图工具创建PNG、JPEG或BMP格式的图像。 2. 将光标图像加载到VTK中。可以使用vtkImageData或vtkTexture等VTK类来加载图像数据。 3. 创建vtkCursor2D对象并设置自定义光标。vtkCursor2D是VTK中的一个2D光标类,可以在视图中显示自定义光标。 4. 将vtkCursor2D对象添加到vtkRenderWindow中。vtkRenderWindow是VTK中的一个窗口类,可以显示3D场景和2D元素。 5. 最后,将vtkRenderWindow显示出来,用户就可以看到自定义光标了。 下是一个使用VTK_CURSOR_CUSTOM创建自定义光标的示例代码: ```python import vtk # 创建自定义光标图像 cursor_image = vtk.vtkPNGReader() cursor_image.SetFileName("custom_cursor.png") # 创建vtkCursor2D对象并设置自定义光标 cursor = vtk.vtkCursor2D() cursor.SetImageData(cursor_image.GetOutput()) # 创建vtkRenderWindow对象并添加vtkCursor2D对象 ren = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren) iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) iren.SetInteractorStyle(vtk.vtkInteractorStyleImage()) iren.Initialize() cursor.SetRenderer(ren) cursor.SetDisplayPosition(100, 100) cursor.Update() # 显示vtkRenderWindow renWin.Render() iren.Start() ``` 这个示例代码会创建一个自定义的光标图像custom_cursor.png,并将它加载到vtkCursor2D对象中。然后将vtkCursor2D对象添加到vtkRenderWindow中,并显示出来。用户可以在vtkRenderWindow中看到自定义光标,并在应用程序中使用它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值