VTK修炼之道59:图形基本操作进阶_纹理映射
来源:互联网 发布:2016最新赚钱网络手游 编辑:程序博客网 时间:2024/06/04 07:00
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.
0 0
- VTK修炼之道59:图形基本操作进阶_纹理映射
- VTK修炼之道47:图形基本操作进阶_法向量计算
- VTK修炼之道51:图形基本操作进阶_连通区域分析
- VTK修炼之道48:图形基本操作进阶_符号化操作与模型区率计算
- VTK修炼之道46:图形基本操作进阶_三角网格体积、表面积、测地距离、包围盒
- VTK修炼之道49:图形基本操作进阶_网格平滑(点云的曲面重建技术)
- VTK修炼之道50:图形基本操作进阶_网格模型的特征边 与 封闭性检测
- VTK修炼之道52:图形基本操作进阶_多分辨率策略(模型抽取的三种方法)
- VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)
- VTK修炼之道54:图形基本操作进阶_表面重建技术(三角剖分)
- VTK修炼之道55:图形基本操作进阶_表面重建技术(等值面提取)
- VTK修炼之道56:图形基本操作进阶_表面重建技术(三维点云曲面重建)
- VTK修炼之道58:图形基本操作进阶_点云配准技术(迭代最近点ICP算法)
- VTK修炼之道63:纹理映射体绘制_二维纹理映射
- VTK修炼之道64:纹理映射体绘制_三维纹理映射
- VTK修炼之道57:图形基本操作进阶_点云配准技术(LandMark标记点算法和坐标系显示方法)
- VTK修炼之道23:图像基本操作_灰度图像映射成伪彩色图像(查表法)
- VTK修炼之道23:图像基本操作_灰度图像映射成伪彩色图像(查表法)
- UVa-10905 Children's Game
- SLAM学习资料
- PAT:B1021. 个位数统计 (15)
- android手机的扩容教程,解决手机系统空间不足
- 不带头结点的单链表的常规操作
- VTK修炼之道59:图形基本操作进阶_纹理映射
- UVA1610:Party Games(聚会游戏)
- Tensorflow.org不能访问的处理
- 内部排序之选择排序:简单选择排序,堆排序
- 单例模式--确保一个类只有一个实例,并提供一个全局访问点。
- Hive调优
- Java线程状态
- [置顶] 中文翻译 for S5PV210_iROM
- 一个简单的python数字锁相环