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工具包,目标是普及自然语言处理在生产环 ...
随机推荐
- 1-安装kvm及虚拟机
安装KVM及虚拟机 1. 创建lvm 2. 安装kvm相关的包 需要安装的包 安装好后,进入系统,发现没有eth0 然后重启网络 然后就看到了eth0,以及ip 挂载光盘 ' ...
- 【Linux命令】文件和目录操作命令
本文主要用于常用命令的备忘,具体用法可用man查看,或查询其他资料. cd:改变工作目录 ls:列出目录的内容 mkdir:创建一个目录 cat:连接并显示指定的一个和多个文件的有关信息 cp:将给出 ...
- sql一个表中的数据插入到另外一个表中
声名:a,b ,都是表 复制代码代码如下: --b表存在(两表结构一样) insert into b select * from a 若两表只是有部分(字段)相同,则 复制代码代码如下: inse ...
- linux hosts文件详+mac主机名被莫名其妙修改
1.名词解析 主机名: 无论是在局域网还是在INTERNET上,每台主机都有一个IP地址,用来区分当前是那一台机器(其实底层是使用机器的物理地址),也就是说IP地址就是一个主机的门牌号,唯一的标示这一 ...
- 由一个多线程共享Integer类变量问题引起的。。。
最近看到一个多线程面试题,有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕上循环打印10次ABCABC- 看到这个题目,首先想到的是解决方法是定义一个Integer类对象,初始化为0,由3个线 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- AC日记——砍树 codevs 1388
1388 砍树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 伐木工人米尔科需要砍倒M米长的木 ...
- 新建structs2 web应用及structs.xml常用基础配置
建立一个structs2 web应用程序 1. 创建一个基本的web应用程序 2. 添加structs2的jar文件到Class Path 将structs2的最小jar包拷到WEB-INF/lib目 ...
- 【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 ...
- Webpack:前端资源模块化管理和打包工具
一.介绍: Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生 产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际需要的时候再 ...