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实例的更多相关文章

  1. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

  2. js-静态、原型、实例属性

    本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...

  3. ZIP压缩算法详细分析及解压实例解释

    最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...

  4. EntityFramework Core 1.1是如何创建DbContext实例的呢?

    前言 上一篇我们简单讲述了在EF Core1.1中如何进行迁移,本文我们来讲讲EF Core1.1中那些不为人知的事,细抠细节,从我做起. 显式创建DbContext实例 通过带OnConfiguri ...

  5. redis集成到Springmvc中及使用实例

    redis是现在主流的缓存工具了,因为使用简单.高效且对服务器要求较小,用于大数据量下的缓存 spring也提供了对redis的支持: org.springframework.data.redis.c ...

  6. 流程开发Activiti 与SpringMVC整合实例

    流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...

  7. UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)

    前面[UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理]章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例. 原代码地址:ht ...

  8. echarts+php+mysql 绘图实例

    最近在学习php+mysql,因为之前画图表都是直接在echart的实例demo中修改数据,便想着两相结合练习一下,通过ajax调用后台数据画图表. 我使用的是echart3,相比较第二版,echar ...

  9. 【HanLP】HanLP中文自然语言处理工具实例演练

    HanLP中文自然语言处理工具实例演练 作者:白宁超 2016年11月25日13:45:13 摘要:HanLP是hankcs个人完成一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环 ...

随机推荐

  1. 1-安装kvm及虚拟机

    安装KVM及虚拟机 1.       创建lvm 2.       安装kvm相关的包 需要安装的包 安装好后,进入系统,发现没有eth0 然后重启网络 然后就看到了eth0,以及ip 挂载光盘 ' ...

  2. 【Linux命令】文件和目录操作命令

    本文主要用于常用命令的备忘,具体用法可用man查看,或查询其他资料. cd:改变工作目录 ls:列出目录的内容 mkdir:创建一个目录 cat:连接并显示指定的一个和多个文件的有关信息 cp:将给出 ...

  3. sql一个表中的数据插入到另外一个表中

    声名:a,b ,都是表 复制代码代码如下: --b表存在(两表结构一样)  insert into b select * from a  若两表只是有部分(字段)相同,则 复制代码代码如下: inse ...

  4. linux hosts文件详+mac主机名被莫名其妙修改

    1.名词解析 主机名: 无论是在局域网还是在INTERNET上,每台主机都有一个IP地址,用来区分当前是那一台机器(其实底层是使用机器的物理地址),也就是说IP地址就是一个主机的门牌号,唯一的标示这一 ...

  5. 由一个多线程共享Integer类变量问题引起的。。。

    最近看到一个多线程面试题,有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕上循环打印10次ABCABC- 看到这个题目,首先想到的是解决方法是定义一个Integer类对象,初始化为0,由3个线 ...

  6. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  7. AC日记——砍树 codevs 1388

    1388 砍树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 伐木工人米尔科需要砍倒M米长的木 ...

  8. 新建structs2 web应用及structs.xml常用基础配置

    建立一个structs2 web应用程序 1. 创建一个基本的web应用程序 2. 添加structs2的jar文件到Class Path 将structs2的最小jar包拷到WEB-INF/lib目 ...

  9. 【MySQL】mysql 1449 : The user specified as a definer ('root'@'%') does not exist

    权限问题,授权 给 root  所有sql 权限 1.mysql> grant all privileges on *.* to root@"%" identified by ...

  10. Webpack:前端资源模块化管理和打包工具

    一.介绍: Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生 产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际需要的时候再 ...