LODProp3D实例
1. Level of detail(LoD)多细节层次描述(简称LoD)是实时绘制复杂几何场景的一种有效工具。基于层次结构的动态简化方法能够根据视点的变化,实时连续地转换场景细节模型。在本例中,实现了球体高、低分辨率两个层次的模型渲染。
2. vtkProp 是渲染场景中能够存在的所有对象的抽象超级类(superclass)比如, all actors, volumes and annotations,包括2D和3D。vtkProp的实例可以相应各种render methods(比如,RenderOpaqueGeometry())。vtkProp也定义了用于拾取(picking)的API、LOD控制和常见的实例变量,这些变量可以控制是否可见、可拾取和是否可拖动等。
3. vtkProp3D 是一个抽象类,在渲染场景(rendering scene)中,用来表示一个实体(比如,vtkProp3D是一个与变换矩阵—transformation matrix相关联的一个vtkProp)。它主要用来处理位置、方向和尺寸缩放等有关的函数。它将这些实例变量组合在一个4x4 transformation matrix 中,比如: [x y z 1] = [x y z 1] Translate(-origin) Scale(scale) Rot(y) Rot(x) Rot (z) Trans(origin) Trans(position). vtkActor和vtkVolume是vtkProp的具体化。构造器默认为: origin(0,0,0) position=(0,0,0) orientation=(0,0,0),初始构造中没有用户定义的矩阵或变换(matrix or transform),也没有纹理映射( texture map)。
3.1 vtkProp3D常用空间变换函数:
设置或获取方向函数:void SetOrientation(double x,double y,double z)、void SetOrientation(double dir[3]),在设置方向时,分别设定该对象沿X、Y和Z轴旋转参数中的x、y和z角度,但是在实际执行时,先沿Z轴旋转z角度,然后沿着X和Y轴依次旋转x、y角度。获取该对象的方向的函数为:double* GetOrientation()、void GetOrientation(double dir[3])、void GetOrientationWXYZ(double dir[3])、double* GetOrientationWXYZ()。
在当前方向下的方向增量函数:void AddOrientation(double x,double y,double z)、void AddOrientation(double dir[3])
角度旋转的设置和获取函数:void RotateX(double)、void RotateY(double)、void RotateZ (double)、void RotateWXYZ(double x,double y,double z).
位置坐标的设置、获取和增量函数:void Set/GetPosition(double x,double y,double z)、void SetPosition(double pos[3])、double* GetPosition(double pos[3])、 void AddPosition(double deltaX,double deltaY,double deltaZ)、void AddPosition(double deltaPosition[3]);
尺度缩放的设置和获取:void SetScale(double s), double* GetScale(),
4. vtkLODProp3D 是用于Prop3D渲染,支持多细节层次描述(LOD)的一个类。所有的映射器(mapper)、属性(property)和纹理(texture)等都可以添加到该对象中。可以估算渲染时间,也可以用来选择一个基于AllocatedRenderTime的LOD。根据mapper/property类型,在场景(scenes)后创建vtkActor或vtkVolume。
/*关于static_cast的介绍网址:
* http://www.cnblogs.com/chio/archive/2007/07/18/822389.html
static_cast:
用法:static_cast < type-id > ( expression )
说明:该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
来源:为什么需要static_cast强制转换?
情况1:void指针->其他类型指针
情况2:改变通常的标准转换
情况3:避免出现可能多种转换的歧义
它主要有如下几种用法:
用于类层次结构中基类和子类之间指针或引用的转换。
进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。
用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
把void指针转换成目标类型的指针(不安全!!)
把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
///////////////////////////////
**关于vtkCommand::ModifiedEvent

#ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
#endif
#include <iostream>
using namespace std;
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkLODProp3D.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkSphereSource.h>
#include <vtkCallbackCommand.h>
#include <vtkProperty.h>
**
*/ void RefreshCallback(vtkObject* caller,
long unsigned int eventId,
void* clientData,
void* callData)
{
vtkSmartPointer<vtkLODProp3D>lodProp=static_cast<vtkLODProp3D*>(clientData);
cout<<"Last rendered LOD:"<<lodProp->GetLastRenderedLODID()<<endl;
} int main()
{
//创建高分辨率的圆球
vtkSmartPointer<vtkSphereSource> highResSphere=vtkSmartPointer<vtkSphereSource>::New();
int res=;
highResSphere->SetThetaResolution(res);
highResSphere->SetPhiResolution(res);
highResSphere->Update();
//高分辨率球的映射器
vtkSmartPointer<vtkPolyDataMapper> highResMapper=vtkSmartPointer<vtkPolyDataMapper>::New();
highResMapper->SetInputConnection(highResSphere->GetOutputPort());
//创建低分辨率的圆球
vtkSmartPointer<vtkSphereSource>lowResSphere=vtkSmartPointer<vtkSphereSource>::New();
//低分辨率球的映射器
vtkSmartPointer<vtkPolyDataMapper> lowResMapper=vtkSmartPointer<vtkPolyDataMapper>::New();
lowResMapper->SetInputConnection(lowResSphere->GetOutputPort());
//分别创建高、低分辨率属性property
//低分辨率属性
vtkSmartPointer<vtkProperty> lowResProperty=vtkSmartPointer<vtkProperty>::New();
lowResProperty->SetDiffuseColor(0.89,0.81,0.34);
lowResProperty->SetInterpolationToFlat();
//高分辨率属性
vtkSmartPointer<vtkProperty> highResProperty=vtkSmartPointer<vtkProperty>::New();
highResProperty->SetDiffuseColor(,0.3882,0.2784);
highResProperty->SetInterpolationToFlat();
//创建vtkLODProp3D
vtkSmartPointer<vtkLODProp3D> prop=vtkSmartPointer<vtkLODProp3D>::New();
prop->AddLOD(highResMapper,highResProperty,);
prop->AddLOD(lowResMapper,lowResProperty,); std::cout<<"There are "<<prop->GetNumberOfLODs()<<" LODs"<<std::endl; //创建显示窗口
//renderer、window和interactor
vtkSmartPointer<vtkRenderer> renderer=vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow=vtkSmartPointer<vtkRenderWindow>::New();
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor=vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindow->AddRenderer(renderer);
renderWindowInteractor->SetRenderWindow(renderWindow); //用prop修改渲染时间
prop->SetAllocatedRenderTime(1e-,renderer);
renderer->AddActor(prop);
//创建回调命令对象,并将自定义的函数设定为该对象的回调函数
vtkSmartPointer<vtkCallbackCommand> refreshCallback=vtkSmartPointer<vtkCallbackCommand>::New();
refreshCallback->SetCallback(RefreshCallback);
refreshCallback->SetClientData(prop);
//添加ModifiedEvent事件侦听器
renderWindow->AddObserver(vtkCommand::ModifiedEvent,refreshCallback);
renderWindowInteractor->Start();
return ;
}
LODProp3D实例的更多相关文章
- 最近学习工作流 推荐一个activiti 的教程文档
全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...
- js-静态、原型、实例属性
本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...
- ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...
- EntityFramework Core 1.1是如何创建DbContext实例的呢?
前言 上一篇我们简单讲述了在EF Core1.1中如何进行迁移,本文我们来讲讲EF Core1.1中那些不为人知的事,细抠细节,从我做起. 显式创建DbContext实例 通过带OnConfiguri ...
- redis集成到Springmvc中及使用实例
redis是现在主流的缓存工具了,因为使用简单.高效且对服务器要求较小,用于大数据量下的缓存 spring也提供了对redis的支持: org.springframework.data.redis.c ...
- 流程开发Activiti 与SpringMVC整合实例
流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...
- UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)
前面[UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理]章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例. 原代码地址:ht ...
- echarts+php+mysql 绘图实例
最近在学习php+mysql,因为之前画图表都是直接在echart的实例demo中修改数据,便想着两相结合练习一下,通过ajax调用后台数据画图表. 我使用的是echart3,相比较第二版,echar ...
- 【HanLP】HanLP中文自然语言处理工具实例演练
HanLP中文自然语言处理工具实例演练 作者:白宁超 2016年11月25日13:45:13 摘要:HanLP是hankcs个人完成一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环 ...
随机推荐
- 4-iscsi
Iscsi 1. 创建lvm 2. 安装scsi服务端软件包 第一种(命令模式) 第二种(配置文件模式) 客户端 Node1 寻找scsi服务器上的储存设备 将scsi设备挂载 ...
- L2-005. 集合相似度
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzwAAAIRCAIAAAAA0S/lAAAgAElEQVR4nO3dzass133v//xPNTszDU
- 中大东校小米路由器mini实现inode上网,ipv6 wifi【中大】【东校】【inode】【ipv6】
还有不到4个月就要毕业了,前几天半夜没事捣鼓小米路由没想到竟然实现了wifi的ipv6. 正好又安利了同学一台小米路由mini,从刷机到inode到ipv6全搞了一遍. 这里将教程写出来,服务学弟妹. ...
- Jquery UI
jQuery UI简介 jQuery UI包含了许多维持状态的小部件(Widget),因此,它与典型的 jQuery 插件使用模式略有不同.所有的 jQuery UI 小部件(Widget)使用相同的 ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
- vs2013 打开vs2010 找不到此项目类型所基于的应用程序 MVC2 升级 MVC5 不能加载Web项目
Upgrading an ASP.NET MVC 2 Project to ASP.NET MVC 3 Tools Update ASP.NET MVC 3 can be installed side ...
- 解读ASP.NET 5 & MVC6系列(9):日志框架
框架介绍 在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net.NLog.CommonLogging使用起来多多少少都有些费劲,和java的SLF4J根本无法相比. ...
- [LeetCode] Minimum Size Subarray Sum 最短子数组之和
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...
- C++知识回顾(一)
感觉世界都是约定好的,每门语言的第一个程序总是Hello World!但是也有一些书似乎是在追求个性,会用一些其他的,但是是Not Hello World!本人需要再学习一下C++,所以从最基础的开始 ...
- java的反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...