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;
}

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

3.参看资料:

1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.  张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.

VTK修炼之道59:图形基本操作进阶_纹理映射相关推荐

  1. VTK修炼之道46:图形基本操作进阶_三角网格体积、表面积、测地距离、包围盒

    1.基本图形操作意义 图形处理,比如图形平滑.多分辨率分析.特征提取等都离不开一些基本的图形操作.掌握这些基本的图形操作有助于理解和深入学习图形处理和分析方法. VTK中提供了多种图形的基本操作,其中 ...

  2. VTK修炼之道58:图形基本操作进阶_点云配准技术(迭代最近点ICP算法)

    1.Iterative Closest Points算法 点云数据配准最经典的方法是迭代最近点算法(Iterative Closest Points,ICP).ICP算法是一个迭代的过程,每次迭代中对 ...

  3. VTK修炼之道57:图形基本操作进阶_点云配准技术(LandMark标记点算法和坐标系显示方法)

    1.点云配准 在计算机逆向工程中,通过三维扫描等实物数字化技术可以获取各种点云数据.但是受到测量环境和设备的影响,再一次测量的情况下,难以获取实物整体的点云数据,因此需要多次从不同角度进行测量.但不同 ...

  4. VTK修炼之道56:图形基本操作进阶_表面重建技术(三维点云曲面重建)

    1.点云重建 虽然Delaunay三角剖分算法可以实现网格曲面重建,但是其应用主要在二维剖分,在三维空间网格生成中遇到了问题.因为在三维点云曲面重建中,Delaunay条件不在满足,不仅基于最大最小角 ...

  5. VTK修炼之道55:图形基本操作进阶_表面重建技术(等值面提取)

    1.等值面提取 等值面(线)提取是一种常用的可视化技术,常应用于医学.地质.气象等领域.例如,在医学图像处理中,由于CT.MRI等图像分辨率越来越高,虽然体绘制技术可以清晰地对数据内部结构进行可视化, ...

  6. VTK修炼之道54:图形基本操作进阶_表面重建技术(三角剖分)

    1.表面重建 通过三维扫描仪所获取的实际物体的空间点云数据仅仅表示物体的几何形状,而无法表达其内部的拓扑结构.拓扑结构对于实际图形处理以及可视化具有更重要的意义.因此,这就需要利用表面重建技术奖点云数 ...

  7. VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)

    1.模型细化 vtk中实现网格细化的累有vtkLinearSubdivisionFilter.vtkLoopsubdivisionFilter.vtkButterflySubdivisionFilte ...

  8. VTK修炼之道52:图形基本操作进阶_多分辨率策略(模型抽取的三种方法)

    1.多分辨率处理策略 模型抽取(Decimation)和细化(Subdivision)是两个相反的操作,是三角形网格模型多分辨处理中的两个重要操作.使用这两个操作可以在保持模型拓扑结构的同时,得到不同 ...

  9. VTK修炼之道51:图形基本操作进阶_连通区域分析

    1.连通区域分析 许多图形数据中,并非只包含一个对象(连通区域).而在处理这些图形数据时,有时需要对每一个对象单独处理或者让其单独显示.比如,利用MarchingCube方法提取三维图像中的等值面,得 ...

最新文章

  1. 什么样的网页百度爱收录?
  2. 计算机系统具有运行可靠性,计算机系统运行可靠性技术.doc
  3. (八)webStorage使用实例——利用storage事件实时监视webStorage中的数据
  4. Java中的OutOfMemoryError
  5. 阿里云rds升级mysql8_为更强大而生的开源关系型数据库来了!阿里云RDS for MySQL 8.0 正式上线!...
  6. Java基础(三)选择和循环结构
  7. php 下拉菜单 不提交 选中的值,在html中怎样可以做到下拉菜单提交后保留选中值不返回默认值...
  8. 【语音播报】基于matlab语音播报【含Matlab源码 507期】
  9. 计算机应用基础全套课件图文,计算机应用基础教程(全套课件)综述.ppt
  10. 单片机学习方法总结资料分享
  11. 离散Hopfield神经网络摘记
  12. 创业失败的18个原因
  13. 信息学奥赛一本通:1153:绝对素数
  14. vue基础-过滤器(Filters)
  15. Rust学习教程32 - 动态数组Vec
  16. 被举报了,越想越后怕...
  17. 特殊儿童领间最灿烂的一缕红——我们入队了
  18. 转载:Docker从入门到上瘾
  19. linux安全清理缓存,架构师小跟班:如何高效又安全的清理Linux服务器上的缓存?...
  20. 马毅与来自高维度的恩赐

热门文章

  1. Java NIO框架Netty教程(一) – Hello Netty
  2. we are the world 群星,
  3. HD 2044 一只小蜜蜂(递推)
  4. poj 2455 Secret Milking Machine(二分枚举+最大流)
  5. NYOJ 875 小M的操作数
  6. Zero-shot Learning / One-shot Learning / Few-shot Learning
  7. like语句百分号前置会使用到索引吗?
  8. C++ code:数值计算之矩形法求解积分问题
  9. 【ElasticSearch】ElasticSearch-SQL插件
  10. 下拉列表select显示ng-options