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工具包,目标是普及自然语言处理在生产环 ...
随机推荐
- 烂泥:ubuntu 14.04搭建OpenVPN服务器
本文由秀依林枫提供友情赞助,首发于烂泥行天下 公司分部需要连接公司内部的服务器,但是该服务器只允许公司内部的网络访问. 为了解决这个问题,打算使用VPN.对于VPN以前使用最多的是PPTP这个解决方案 ...
- ubuntu-Linux系统读取USB摄像头数据(uvc)
这几天在做小车的过程中,需要用到图像采集.我想现在用的摄像头是UVC免驱的.根据国嵌的教程中有一个gspca摄像头的程序.我发现把gspca的采集程序用到uvc上时,在显示图像的时候提示没有huffm ...
- cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'mvc:annotation-driven'.
spring 配置文件报错报错信息:cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be ...
- [LeetCode] K-th Smallest in Lexicographical Order 字典顺序的第K小数字
Given integers n and k, find the lexicographically k-th smallest integer in the range from 1 to n. N ...
- AppBox_v2.0完整版免费下载,暨AppBox_v3.0正式发布!
文章更新: AppBox v6.0中实现子页面和父页面的复杂交互 AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. AppBox ...
- SQLite源程序分析之sqlite3.c
/****************************************************************************** ** This file is an a ...
- 关于mirai病毒的一些研究
首页好像只能显示随笔,之前发在文章里面的,见文章http://www.cnblogs.com/mrchang/articles/6210681.html
- tensorflow 一些好的blog链接和tensorflow gpu版本安装
pading :SAME,VALID 区别 http://blog.csdn.net/mao_xiao_feng/article/details/53444333 tensorflow实现的各种算法 ...
- 文本文件关键字替换(Java)
代码实现如下: import java.io.File; import java.io.PrintWriter; import java.util.Scanner; public class File ...
- 页内多个input全选不干扰且只用一段代码。
//html内容 <body> <div id="d1"> <input type="checkbox" class=" ...