zoukankan      html  css  js  c++  java
  • 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

        

      1 #ifndef INITIAL_OPENGL
      2 #define INITIAL_OPENGL
      3 #include <vtkAutoInit.h>
      4 VTK_MODULE_INIT(vtkRenderingOpenGL)
      5 VTK_MODULE_INIT(vtkInteractionStyle)
      6 VTK_MODULE_INIT(vtkRenderingFreeType)
      7 #endif
      8 #include <iostream>
      9 using namespace std;
     10 #include <vtkSmartPointer.h>
     11 #include <vtkPolyDataMapper.h>
     12 #include <vtkLODProp3D.h>
     13 #include <vtkRenderWindow.h>
     14 #include <vtkRenderer.h>
     15 #include <vtkRenderWindowInteractor.h>
     16 #include <vtkPolyData.h>
     17 #include <vtkSphereSource.h>
     18 #include <vtkCallbackCommand.h>
     19 #include <vtkProperty.h>
     39 **
     40  */
     41 
     42 void RefreshCallback(vtkObject* caller,
     43                      long unsigned int eventId,
     44                      void* clientData,
     45                      void* callData)
     46 {
     47     vtkSmartPointer<vtkLODProp3D>lodProp=static_cast<vtkLODProp3D*>(clientData);
     48     cout<<"Last rendered LOD:"<<lodProp->GetLastRenderedLODID()<<endl;
     49 }
     50 
     51 int main()
     52 {
     53 //创建高分辨率的圆球
     54     vtkSmartPointer<vtkSphereSource> highResSphere=vtkSmartPointer<vtkSphereSource>::New();
     55     int res=100;
     56     highResSphere->SetThetaResolution(res);
     57     highResSphere->SetPhiResolution(res);
     58     highResSphere->Update();
     59     //高分辨率球的映射器
     60     vtkSmartPointer<vtkPolyDataMapper> highResMapper=vtkSmartPointer<vtkPolyDataMapper>::New();
     61     highResMapper->SetInputConnection(highResSphere->GetOutputPort());
     62 //创建低分辨率的圆球
     63     vtkSmartPointer<vtkSphereSource>lowResSphere=vtkSmartPointer<vtkSphereSource>::New();
     64     //低分辨率球的映射器
     65     vtkSmartPointer<vtkPolyDataMapper> lowResMapper=vtkSmartPointer<vtkPolyDataMapper>::New();
     66     lowResMapper->SetInputConnection(lowResSphere->GetOutputPort());
     67 //分别创建高、低分辨率属性property
     68     //低分辨率属性
     69     vtkSmartPointer<vtkProperty> lowResProperty=vtkSmartPointer<vtkProperty>::New();
     70     lowResProperty->SetDiffuseColor(0.89,0.81,0.34);
     71     lowResProperty->SetInterpolationToFlat();
     72     //高分辨率属性
     73     vtkSmartPointer<vtkProperty> highResProperty=vtkSmartPointer<vtkProperty>::New();
     74     highResProperty->SetDiffuseColor(1,0.3882,0.2784);
     75     highResProperty->SetInterpolationToFlat();
     76 //创建vtkLODProp3D
     77     vtkSmartPointer<vtkLODProp3D> prop=vtkSmartPointer<vtkLODProp3D>::New();
     78     prop->AddLOD(highResMapper,highResProperty,0);
     79     prop->AddLOD(lowResMapper,lowResProperty,0);
     80 
     81     std::cout<<"There are "<<prop->GetNumberOfLODs()<<" LODs"<<std::endl;
     82 
     83 //创建显示窗口
     84     //renderer、window和interactor
     85     vtkSmartPointer<vtkRenderer> renderer=vtkSmartPointer<vtkRenderer>::New();
     86     vtkSmartPointer<vtkRenderWindow> renderWindow=vtkSmartPointer<vtkRenderWindow>::New();
     87     vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor=vtkSmartPointer<vtkRenderWindowInteractor>::New();
     88     renderWindow->AddRenderer(renderer);
     89     renderWindowInteractor->SetRenderWindow(renderWindow);
     90 
     91     //用prop修改渲染时间
     92     prop->SetAllocatedRenderTime(1e-1,renderer);
     93     renderer->AddActor(prop);
     94     //创建回调命令对象,并将自定义的函数设定为该对象的回调函数
     95     vtkSmartPointer<vtkCallbackCommand> refreshCallback=vtkSmartPointer<vtkCallbackCommand>::New();
     96     refreshCallback->SetCallback(RefreshCallback);
     97     refreshCallback->SetClientData(prop);
     98     //添加ModifiedEvent事件侦听器
     99     renderWindow->AddObserver(vtkCommand::ModifiedEvent,refreshCallback);
    100 renderWindowInteractor->Start();
    101     return 0;
    102 }
    
    
    
    
  • 相关阅读:
    css切图Sprites
    javascript改变position值实现菜单滚动至顶部后固定
    Cannot create type class java.io.File from value
    关于如何拍摄瓷器(转)
    Struts2的jar问题
    vim的基本操作
    Flask基础
    Flask入门
    MongoDB 之 数据类型
    基于DBUtils实现数据库连接池
  • 原文地址:https://www.cnblogs.com/phoenixdsg/p/6177819.html
Copyright © 2011-2022 走看看