5.6.2图形处理之纹理映射vtkTextureMapToCylinder

标签: vtkTextureMapToCylinder 纹理映射 VTK vtkCylinderSource
14人阅读 评论(0) 收藏 举报
分类:
不少人对vtkTextureMapToCylinder很感兴趣,就介绍它。

vtkTextureMapToCylinder

  VTK中定义了多个类实现纹理空间到模型空间的映射,例如vtkTextureMapToPlane通过一个平面建立纹理空间到模型空间的 映射关系;vtkTextureMapToCylinder通过圆柱棉建立映射关系;vtkTextureMapToSphere通过球面建立映射关系。它们的本质是给输入数据的点数据设置纹理坐标,属性数据的一种。

示例演示

  首先我们对自己生产的圆柱,应用vtkTextureMapToCylinder。利用vtkCylinderSource产生一个圆柱,注意这个圆柱的轴是和全局坐标Y轴平行。

/**********************************************************************

Copyright (c) Mr.Bin. All rights reserved.
For more information visit:   http://blog.csdn.net/webzhuce

**********************************************************************/
#include <vtkSmartPointer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkTransformTextureCoords.h>
#include <vtkTexture.h>
#include <vtkTextureMapToSphere.h>
#include <vtkTextureMapToCylinder.h>
#include <vtkBMPReader.h>
#include <vtkTexturedSphereSource.h>
#include <vtkCylinderSource.h>

int main (int argc, char *argv[])
{
    vtkSmartPointer<vtkBMPReader> imageReader = vtkSmartPointer<vtkBMPReader>::New();
    imageReader->SetFileName("E:/TestData/lena.bmp");

    vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New();
    texture->SetInputConnection(imageReader->GetOutputPort());

    vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();
    cylinder->SetHeight(20.0);
    cylinder->SetCenter(0, 0, 0);
    cylinder->SetRadius(3.0);
    cylinder->SetResolution(100);

    vtkSmartPointer<vtkTextureMapToCylinder> texturemap = vtkSmartPointer<vtkTextureMapToCylinder>::New();
    texturemap->SetInputConnection(cylinder->GetOutputPort());
    texturemap->SetPreventSeam(0);

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(texturemap->GetOutputPort());

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper( mapper );
    actor->SetTexture( texture );

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->SetBackground(1.0, 1.0, 1.0);

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer( renderer );

    vtkSmartPointer<vtkRenderWindowInteractor> renWinInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renWinInteractor->SetRenderWindow( renderWindow );

    renderWindow->SetSize(640, 480);
    renderWindow->Render();
    renderWindow->SetWindowName("TextureExample");
    renderWindow->Render();
    renderWindow->Render();
    renWinInteractor->Start();

    return EXIT_SUCCESS;
}

运行结果:

这里写图片描述

   默认情况下,纹理映射是重复的,如果不想重复,可以调用SetPreventSeam(0)。为什么这样呢?vtkTextureMapToCylinder的原理是将数据的点投影到特定线段(默认利用vtkOBBTree求得最长轴作为这个线段),在这个线段上的比例作为纹理坐标的t;投影的夹角来设置纹理坐标的s,默认情况下0度到180度对应0到1,1180度到360度对应0到1。所以纹理映射是重复的。调用SetPreventSeam(0)后,0度到360度对应0到1。
前面提到vtkCylinderSource生成圆柱的轴平行于Y轴,所以如果圆柱的高度小于直径时,纹理主要映射到圆柱的的圆面。如下图所示。
这里写图片描述
  我们发现无论是否设置SetPreventSeam,都存在白线,即纹理映射有问题。这是为什么?求纹理坐标s时,从0度到360度是闭环的,那么在360度或者180度时,从s=1到s=0没有指明如何纹理映射。OpenGL中可以设置镜像重复解决,VTK中不知道如何设置解决。如果知道,请留言。谢谢。
这里写图片描述

代码下载

查看评论

osg小场景 渲染技术

osg小场景渲染技术,包括纹理烘培,纹理贴图,shader编写工作。混合渲染技术及纹理高光等,让场景更加真实的渲染。金属质感及水流流向效果的展示。
  • 2017年12月31日 15:10

VTK纹理映射之vtkTransformTextureCoods

本文介绍vtkTransformTextureCoods类。 纹理坐标系  在《VTK纹理映射》文中,我们其实用的都是2D纹理,使用一张图片。它的坐标系是(s,t),即前面提到的u-v。也可以有3D纹...
  • webzhuce
  • webzhuce
  • 2017-04-03 14:28:20
  • 987

$.getJson方法清除缓存

$.getJson方法当重复请求同一页面时,只从缓存中加载数据,要想每次重新加载需要将URL后面跟动态参数 $.getJson("a.ashx?t="+new Date() ,"{a:b}",fun...
  • dannywj1371
  • dannywj1371
  • 2011-04-11 22:15:00
  • 1650

VTK纹理映射

本文介绍VTK中纹理映射。 纹理映射  纹理映射是创建逼真效果的强大的图形工具,其原理是渲染时把二维的图像“贴”到物体的表面啥昂,根据二维图像渲染出丰富多彩的效果,所有也叫纹理贴图。纹理映射需要三个要...
  • webzhuce
  • webzhuce
  • 2017-04-03 14:43:02
  • 1432

VTK之自定义Filter类

一个Filter类定义了RequestData()函数,当Filter调用Update()后,即可响应RequestData()函数。 VTK管线机制  VTK中通过管线机制来实现组合各种算法处理数据...
  • webzhuce
  • webzhuce
  • 2017-07-23 12:47:30
  • 518

VTK图形处理之自定义纹理映射Filter

CMakeLists.txt文件代码如下:CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(TextureMap) FIND_PACKAGE(VTK REQUIR...
  • webzhuce
  • webzhuce
  • 2017-10-31 22:49:54
  • 117

纹理映射

(图像拼接的项目中要用到纹理映射,用opencv自带的cvwarpperspective太慢,考虑用查表方式的映射来改善) 百度到以下内容,备用: 转自:http://www.cnblogs.com/...
  • u014352792
  • u014352792
  • 2015-11-19 21:00:41
  • 652

纹理映射的两种方式

纹理映射有两种方式Ø         加载一个已创建好的纹理文件,然后再应用该纹理数据。Ø         另外一种是按顺序逐个计算出纹理内容,即我们首先创建一个“空”纹理,然后再基于一些已定义的参数...
  • Iamduoluo
  • Iamduoluo
  • 2010-08-09 15:36:00
  • 1028

纹理映射技术

第六集 纹理映射技术   为使建立的3D模型更接近现实世界中的物体, 简单的颜色变换已经无能为力, 这时我们就需要纹理映射技术了.       这一集我们讲解基础的纹理映射...
  • liusandian
  • liusandian
  • 2016-08-17 15:48:17
  • 359

立方体的纹理映射算法

  • 2009年10月29日 12:42
  • 284KB
  • 下载
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 23万+
    积分: 3597
    排名: 1万+
    交流学习
      VTK交流群:678462859
    博客专栏
    最新评论