vtk等值面体绘制|纹理映射体绘制 附:不透明传输函数,颜色传输函数、光照与阴影

等值面体绘制:

#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkStructuredPoints.h>
#include <vtkStructuredPointsReader.h>
#include <vtkVolumeRayCastIsosurfaceFunction.h>
#include <vtkVolumeRayCastMapper.h>
#include <vtkColorTransferFunction.h>
#include <vtkPiecewiseFunction.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkVolumeProperty.h>
#include <vtkAxesActor.h>
#include <vtkImageShiftScale.h>
#include <vtkImageCast.h>

//等值面体绘制效果
int main(int argc, char *argv[])
{

	vtkSmartPointer<vtkStructuredPointsReader> reader =
		vtkSmartPointer<vtkStructuredPointsReader>::New();
	reader->SetFileName("../mummy.128.vtk");
	reader->Update();

	//等值面绘制函数用来渲染体数据中的特定等值面
	vtkSmartPointer<vtkVolumeRayCastIsosurfaceFunction> rayCastFun =
		vtkSmartPointer<vtkVolumeRayCastIsosurfaceFunction>::New();
	rayCastFun->SetIsoValue(100);//用于设置等值面的值 小于该值的小于该像素的不透明度都设置为0

	//定义一个光线投影体绘制
	vtkSmartPointer<vtkVolumeRayCastMapper> volumeMapper =
		vtkSmartPointer<vtkVolumeRayCastMapper>::New();
	volumeMapper->SetInputData(reader->GetOutput());//接受输入数据
	volumeMapper->SetVolumeRayCastFunction(rayCastFun);//必须设置,否则出错 设置光线投影函数类型

	vtkSmartPointer<vtkVolumeProperty> volumeProperty =
		vtkSmartPointer<vtkVolumeProperty>::New();
	volumeProperty->SetInterpolationTypeToLinear();//设置线性插值类型
	volumeProperty->ShadeOn();
	volumeProperty->SetAmbient(0.2);//阴影色
	volumeProperty->SetDiffuse(0.6);//弥漫性
	volumeProperty->SetSpecular(0.4);//高光 这个属性到0.8有一种“铜”制的效果~~

	////透明度映射函数定义
	//给数据点赋不透明值。体绘制中,需要显示三维数据场的内部结构,因而需要生成具有透明度的图像。
	vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =
		vtkSmartPointer<vtkPiecewiseFunction>::New();
	compositeOpacity->AddPoint(70, 0.00);
	compositeOpacity->AddPoint(90, 0.40);
	compositeOpacity->AddPoint(180, 0.60);
	volumeProperty->SetScalarOpacity(compositeOpacity);

	////颜色映射函数定义
	//给数据点赋颜色值,将分类后的组织信息分别予以不同的颜色,便于图像分析。
	vtkSmartPointer<vtkColorTransferFunction> color =
		vtkSmartPointer<vtkColorTransferFunction>::New();
	color->AddRGBPoint(0.000, 0.00, 0.00, 0.00);
	color->AddRGBPoint(64.00, 1.00, 0.52, 0.30);
	color->AddRGBPoint(190.0, 1.00, 1.00, 1.00);
	color->AddRGBPoint(220.0, 0.20, 0.20, 0.20);
	volumeProperty->SetColor(color);

	// vtkVolume掌管映射器和属性对象,可控制体数据的位置和朝向
	vtkSmartPointer<vtkVolume> volume =
		vtkSmartPointer<vtkVolume>::New();
	volume->SetMapper(volumeMapper);//生成体对象
	volume->SetProperty(volumeProperty);//设置体对象属型

	vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();
	ren->SetBackground(1.0, 1.0, 1.0);
	ren->AddVolume(volume);

	vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
	renWin->AddRenderer(ren);
	renWin->SetSize(640, 480);
	renWin->Render();
	renWin->SetWindowName("IsoSurfaceVolRenderingApp");

	vtkSmartPointer<vtkRenderWindowInteractor> iren =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	iren->SetRenderWindow(renWin);
	ren->ResetCamera();

	renWin->Render();
	iren->Start();

	return EXIT_SUCCESS;
}

忽略掉上面的红字,本来是想做表情包的==

二维纹理映射:

渲染速度快于光线投影体绘制,但是只支持alpha合成技术,而且切片上使用双线性插值实现纹理映射,切片之间不存在插值,渲染质量有所下降;且需要在三个方向上保存相应的纹理图像堆栈,占用内存大

#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkStructuredPoints.h>
#include <vtkStructuredPointsReader.h>
#include <vtkVolumeTextureMapper2D.h>
#include <vtkColorTransferFunction.h>
#include <vtkPiecewiseFunction.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkVolumeProperty.h>
#include <vtkAxesActor.h>
#include <vtkImageShiftScale.h>
#include <vtkImageCast.h>

int main(int argc, char *argv[])
{

	vtkSmartPointer<vtkStructuredPointsReader> reader =
		vtkSmartPointer<vtkStructuredPointsReader>::New();
	reader->SetFileName("../mummy.128.vtk");
	reader->Update();

	//上一份代码的mapper(现查了一下是制图的意思==)叫做vtkVolumeRayCastMapper
	vtkSmartPointer<vtkVolumeTextureMapper2D> volumeMapper =
		vtkSmartPointer<vtkVolumeTextureMapper2D>::New();
	volumeMapper->SetInputData(reader->GetOutput());

	//这部分设置体绘制属性的写法和上一份一样==
	vtkSmartPointer<vtkVolumeProperty> volumeProperty =
		vtkSmartPointer<vtkVolumeProperty>::New();
	volumeProperty->SetInterpolationTypeToLinear();
	volumeProperty->ShadeOn();
	volumeProperty->SetAmbient(0.4);
	volumeProperty->SetDiffuse(0.6);
	volumeProperty->SetSpecular(0.2);

	//透明度设置,老生常谈了==
	vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =
		vtkSmartPointer<vtkPiecewiseFunction>::New();
	compositeOpacity->AddPoint(70, 0.00);
	compositeOpacity->AddPoint(90, 0.40);
	compositeOpacity->AddPoint(180, 0.60);
	volumeProperty->SetScalarOpacity(compositeOpacity);

	//颜色映射函数定义,依旧是一样的 下面的函数也都一样的==怪不得书上不再写了
	vtkSmartPointer<vtkColorTransferFunction> color =
		vtkSmartPointer<vtkColorTransferFunction>::New();
	color->AddRGBPoint(0.000, 0.00, 0.00, 0.00);
	color->AddRGBPoint(64.00, 1.00, 0.52, 0.30);
	color->AddRGBPoint(190.0, 1.00, 1.00, 1.00);
	color->AddRGBPoint(220.0, 0.20, 0.20, 0.20);
	volumeProperty->SetColor(color);

	vtkSmartPointer<vtkVolume> volume =
		vtkSmartPointer<vtkVolume>::New();
	volume->SetMapper(volumeMapper);
	volume->SetProperty(volumeProperty);

	vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();
	ren->SetBackground(1.0, 1.0, 1.0);
	ren->AddVolume(volume);

	vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
	renWin->AddRenderer(ren);
	renWin->SetSize(640, 480);
	renWin->Render();
	renWin->SetWindowName("Texture2DVolRenderingApp");

	vtkSmartPointer<vtkRenderWindowInteractor> iren =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	iren->SetRenderWindow(renWin);
	ren->ResetCamera();

	renWin->Render();
	iren->Start();

	return EXIT_SUCCESS;
}

(配字怎么样

三维纹理映射:

三维映射是将体数据映射到一组与视图平面平行的四边形,避免二维纹理映射方法中因为纹理图像切换产生的瑕疵现象。除了类变成了~3D,其他都一样,注释省略==
vtkSmartPointer<vtkStructuredPointsReader> reader =
		vtkSmartPointer<vtkStructuredPointsReader>::New();
	reader->SetFileName("../mummy.128.vtk");
	reader->Update();

	vtkSmartPointer<vtkVolumeTextureMapper3D> volumeMapper =
		vtkSmartPointer<vtkVolumeTextureMapper3D>::New();
	volumeMapper->SetInputData(reader->GetOutput());

	vtkSmartPointer<vtkVolumeProperty> volumeProperty =
		vtkSmartPointer<vtkVolumeProperty>::New();
	volumeProperty->SetInterpolationTypeToLinear();
	volumeProperty->ShadeOn();
	volumeProperty->SetAmbient(0.4);
	volumeProperty->SetDiffuse(0.6);
	volumeProperty->SetSpecular(0.2);

	vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =
		vtkSmartPointer<vtkPiecewiseFunction>::New();
	compositeOpacity->AddPoint(70, 0.00);
	compositeOpacity->AddPoint(90, 0.40);
	compositeOpacity->AddPoint(180, 0.60);
	volumeProperty->SetScalarOpacity(compositeOpacity);

	vtkSmartPointer<vtkColorTransferFunction> color =
		vtkSmartPointer<vtkColorTransferFunction>::New();
	color->AddRGBPoint(0.000, 0.00, 0.00, 0.00);
	color->AddRGBPoint(64.00, 1.00, 0.52, 0.30);
	color->AddRGBPoint(190.0, 1.00, 1.00, 1.00);
	color->AddRGBPoint(220.0, 0.20, 0.20, 0.20);
	volumeProperty->SetColor(color);

	vtkSmartPointer<vtkVolume> volume =
		vtkSmartPointer<vtkVolume>::New();
	volume->SetMapper(volumeMapper);
	volume->SetProperty(volumeProperty);

	vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();
	ren->SetBackground(1.0, 1.0, 1.0);
	ren->AddVolume(volume);

	vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
	renWin->AddRenderer(ren);
	renWin->SetSize(640, 480);
	renWin->Render();
	renWin->SetWindowName("Texture3DVolRenderingApp");

	int valid = volumeMapper->IsRenderSupported(volumeProperty, ren);
	if (!valid) return EXIT_SUCCESS;//判断是否支持当前渲染

	vtkSmartPointer<vtkRenderWindowInteractor> iren =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	iren->SetRenderWindow(renWin);
	ren->ResetCamera();

	renWin->Render();
	iren->Start();

	return EXIT_SUCCESS;

下面好好说说不透明度传输函数,颜色传输函数、光照与阴影

不透明度传输函数

就是这段文字

vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =
		vtkSmartPointer<vtkPiecewiseFunction>::New();
	compositeOpacity->AddPoint(70,   0.00);
	compositeOpacity->AddPoint(90,   0.40);
	compositeOpacity->AddPoint(180,  0.60);
	volumeProperty->SetScalarOpacity(compositeOpacity);

AddPoint只是其中一种定义标量线性分段函数的方法。第一个参数x是自变量,这里指灰度值;y是映射值,这里指不透明度

addsegment是另一种,直接添加一条线段,即添加两个断点x1,y1,x2,y2

梯度不透明函数添加方法是 SetGradientOpacity()

颜色传输函数

将一个标量映射成一个颜色值,可以是rgb也可以是hsv  rgb换成HSV就可以啦

vtkSmartPointer<vtkColorTransferFunction> color =
		vtkSmartPointer<vtkColorTransferFunction>::New();
	color->AddRGBPoint(0.000,  0.00, 0.00, 0.00);
	color->AddRGBPoint(64.00,  1.00, 0.52, 0.30);
	color->AddRGBPoint(190.0,  1.00, 1.00, 1.00);
	color->AddRGBPoint(220.0,  0.20, 0.20, 0.20);
	volumeProperty->SetColor(color);

光线与阴影

之前的注释这里有点不准确QAQ

        volumeProperty->ShadeOn();//开启阴影效果
	volumeProperty->SetAmbient(0.4);//设置环境光系数
	volumeProperty->SetDiffuse(0.6);//设置散射光系数
	volumeProperty->SetSpecular(0.2);//设置反射光系数

一般情况下,三个系数和=1,为提高亮度,之和可能大于1

在这三个系数中,当环境光占主导时,阴影效果不明显;散射光系数占主导时,显示效果比较粗糙;反射光占主导时,显示效果比较光滑。阴影效果关闭时,等同于环境光系数=1.0,其他两个系数=0

时间: 05-10

vtk等值面体绘制|纹理映射体绘制 附:不透明传输函数,颜色传输函数、光照与阴影的相关文章

css①字体颜色正常显示,背景透明②字体颜色与背景均为透明的设置方法

①字体颜色正常显示,背景颜色透明 color:#fff; background:rgba(0,0,0,0.5);? ②?字体颜色与背景颜色均为透明 color:#fff; background:#000; opacity:0.6;

各种颜色RGB值【附c#中获取颜色的argb值】

各种颜色RGB值 ■RGB(255,192,203)■★●◆pink(粉红) ■RGB(220,20,60)■★●◆crimson(腥红) ■RGB(255,240,245)■★●◆lavenderblush(苍白的紫罗兰红) ■RGB(219,112,147)■★●◆palevioletred(脸红的淡紫红) ■RGB(255,105,180)■★●◆hotpink(热情的粉红) ■RGB(199,21,133)■★●◆mediumvioletred(适中的紫罗兰红) ■RGB(218,112

第04章-VTK基础(6)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本小节内容对应原书的第70页至第83页] 4.13 数据变换 在4.6节里的"Ass

专题:DUILIB Win32 透明效果

Win32 透明效果相关基础知识 Layered Windows 分层窗口.这是Windows2000开始引入的概念,重新定义了窗口的Hit Testing方法,以前都是把窗口按rectangle的方式裁剪,而把窗口加上WS_EX_LAYERED的Style后就可以根据窗口的形状和像素 值进行Hit Testing,这样我们的不规则窗口就变成了真正意义上的独立窗口,而不是传统的被一个不可见的矩形窗口所包含. 分层窗口重绘方式.透明效果产生 创建不规则窗口的三种方式 1. 通过区域相关API设置窗

纹理映射 【转】

9.4 纹理对象 使用纹理对象来存储纹理数据的步骤: 1) 生成纹理对象名称 2) 将纹理对象绑定到纹理数据(包括图像数据数组和纹理属性), 即创建纹理对象. 3) 如果OpenGL实现高性能纹理工作集, 应检查是否有足够的空间来存储所有的纹理对象. 如没有足够空间, 应设置每个纹理对象的优先级, 以确保最常用的纹理留在工作集中 4) 绑定和重新绑定纹理对象, 以便可以将其中的纹理映射到物体上. 9.4.1 生成纹理对象名称 void glGenTextures(GLsizei n, GLint

ie8下jquery改变PNG的opacity出现黑边,ie6下png透明解决办法

目前互联网对于网页效果要求越来越高,不可避免的用到PNG图片,PNG分为几种格 式,PNG8 PNG24 PNG32,其中最常用的,也是显示效果和大小比较适中的则是PNG24,支持半透明,透明,颜色也非常丰富,但由于咱们国人使用IE系列或以IE为内核系列的浏览器占大多数,并且由于 WINDOWS XP在国内市场份额比较大,并且XP上好多人还在用IE6 IE7 IE8等浏览器,而这些浏览器对于PNG支持或多或少都有差距,IE6完全不支持PNG,IE7 IE8支持PNG不完全,在IE7 IE8下面对

VC窗体透明而控件不透明以及Static文本背景透明方法

出自http://my.oschina.net/ypimgt/blog/60951 优点:    1.Dialog 窗体完全透明.     2. 窗体上的控件不透明. DC 绘制的图形不透明.     3. 拖动窗体上用 DC 绘制的图形可以移动窗体. 缺点:     1. 窗体设置透明使用是掩码颜色,所以在窗体上用 DC 绘图的过程当中如果采用了和透明掩码颜色相同的颜色将不会显示出来.     2. 如果将 Border 属性设置成了 NONE ,那么想通过响应 WM_NCHITEST 消息来

java 怎样做出完美动画,(包括透明效果)

<cnmm22动感原创: 有一张 gif  我处理了一下,拿到 java 上,直接 g.draw 是这个效果: 这已经是处理的极限,因为这张图做出来是为白底背景而作,而我的背景是黑底. 但,最终我做出来是这个效果: 可以看到我更酷了:羽毛的颜色完美融合,而且羽毛泛着荧光. 而且我的羽毛可以左右变换 ,我的羽毛在飘动,而且我的炮弹可以变色! 我是怎样做到的?? 要做到这个效果,你不能直接 g.draw gif ,因为gif 色深的问题,他不可能表现出这么完美的透明效果. 我是说,如果你不需要做出荧

CSS实现Div透明,而显示在上面的文字不透明,但也可看到显示在下面的图片内容

CSS实现Div透明,而显示在上面的文字不透明,但也可看到显示在下面的图片内容,DiV透明其实挺简单,主要是为background定义opacity属性,一般这个是最大值是1,数值越接近1,则越不透明,也就是越小越透明,颜色可以自定义.这样可以让图片上的文字更清淅,在一些图片特效中我们会见到这种效果. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/