zoukankan      html  css  js  c++  java
  • VTK 三维场景基本要素:光照

    1.VTK中的光照长得什么样?

    剧场里有各式各样的灯光,三维渲染场景中也一样,可以有多个光照存在。光照和相机是三维渲染场景必备的因素,如果没有指定,vtkRenderer会自动地创建默认的光照和相机。VTK里用类vtkLight来表示渲染场景中的光照。与现实中的灯光类似,VTK中的vtkLight实例也可以打开、关闭,设置光照的颜色,照射位置(即焦点),光照所在的位置,强度等等。
    vtkLight可以分为位置光照(Positional Light,即聚光灯)和方向光照(Direction Light)。位置光照是光源位置在渲染场景中的某个位置,可以指定光照的衰减值、锥角等;方向光照即光源位置在无穷远,光线可以认为是平行的,比如自然界中的太阳光。光源的位置和焦点的连线定义光线的方向,默认的vtkLight即为方向光照。
    vtkLight常的方法有:
    SetColor() — 设置光照的颜色,以RGB的形式指定颜色。
    SetPosition() — 设置光照位置。
    SetFocalPoint() — 设置光照焦点。
    SetIntensity() — 设置光照的强度。
    SetSwitch() / SwitchOn()/ SwitchOff()— 打开或关闭对应的光照。
    vtkLight里也有类似命名风格的方法:SetSwitch() /GetSwitch()/SwitchOn()/ SwitchOff()。不难发现,在VTK里,某个属性的设置都是采取这一类方法,以vtkLight为例,SwitchOn()跟SetSwitch(1)实现的效果是一样,SwitchOff()则与SetSwitch(0)是一样的,GetSwitch()则是用于获取vtkLight对象关闭或打开这个属性的值。如果某个类有提供SetXXX()方法,一般也会提供GetXXX()方法来获取相应的值,这个我们在前面的内容也已经有一些了解。再比如,vtkLight还提供:SetPositional() / GetPositional()/ PositionalOn()/PositionalOff()一类方法来设置位置光照。
    在类vtkLight的头文件vtkLight.h里,找不到类似SetSwitch()/GetSwitch()等方法的原型,但是可以看到以下几行:
    vtkSetMacro(Switch,int);
    vtkGetMacro(Switch,int);
    vtkBooleanMacro(Switch,int);
    顾名思义,vtkSetMacro/vtkGetMacro/vtkBooleanMacro都是宏,展开这几个宏以后就是以上函数的原型。为了保证代码的整洁与复用性,VTK在文件vtkSetGet.h里定义了大量了宏,当你找不到某个函数的原型时,可能这些函数就是由宏展开以后所定义的,所以,在阅读VTK源码的时候,不妨多右击一下某个函数或者关键字,然后点击弹出菜单中的“Go to Definition…”,也就一目了然了。

    2.光照实验

     1 #include <vtkAutoInit.h>
     2 VTK_MODULE_INIT(vtkRenderingOpenGL);
     3 /
     4 #include <vtkSmartPointer.h>
     5 #include <vtkRenderWindow.h>
     6 #include <vtkRenderer.h>
     7 #include <vtkRenderWindowInteractor.h>
     8 #include <vtkInteractorStyleTrackballCamera.h>
     9 #include <vtkCylinderSource.h>
    10 #include <vtkPolyDataMapper.h>
    11 #include <vtkActor.h>
    12 #include <vtkLight.h>
    13 #include <vtkCamera.h>
    14 #include <vtkProperty.h>
    15  
    16 int main()
    17 {
    18     vtkSmartPointer<vtkCylinderSource> cylinder = 
    19     vtkSmartPointer<vtkCylinderSource>::New();
    20     cylinder->SetHeight( 3.0 );
    21     cylinder->SetRadius( 1.0 );
    22     cylinder->SetResolution( 10 ); 
    23  
    24     vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = 
    25         vtkSmartPointer<vtkPolyDataMapper>::New();
    26     cylinderMapper->SetInputConnection( cylinder->GetOutputPort() ); 
    27  
    28     vtkSmartPointer<vtkActor> cylinderActor = 
    29         vtkSmartPointer<vtkActor>::New();
    30     cylinderActor->SetMapper( cylinderMapper );
    31  
    32     vtkSmartPointer<vtkRenderer> renderer = 
    33         vtkSmartPointer<vtkRenderer>::New();
    34     renderer->AddActor( cylinderActor );
    35     renderer->SetBackground( 1.0, 0, 0 );
    36  
    37     vtkSmartPointer<vtkRenderWindow> renWin = 
    38         vtkSmartPointer<vtkRenderWindow>::New();
    39     renWin->AddRenderer( renderer );
    40     renWin->SetSize( 640, 480 );
    41     renWin->Render();
    42     renWin->SetWindowName("RenderCylinder-Lights");
    43  
    44     vtkSmartPointer<vtkRenderWindowInteractor> iren = 
    45         vtkSmartPointer<vtkRenderWindowInteractor>::New();
    46     iren->SetRenderWindow(renWin);
    47  
    48     vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = 
    49         vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
    50     iren->SetInteractorStyle(style);
    51  
    52     vtkSmartPointer<vtkLight> myLight = 
    53         vtkSmartPointer<vtkLight>::New();
    54     myLight->SetColor(0,1,0);
    55     myLight->SetPosition(0,0,6);
    56     myLight->SetFocalPoint(
    57         renderer->GetActiveCamera()->GetFocalPoint());
    58     renderer->AddLight(myLight);
    59  
    60     vtkSmartPointer<vtkLight> myLight2 =
    61         vtkSmartPointer<vtkLight>::New();
    62     myLight2->SetColor(0,0,1);
    63     myLight2->SetPosition(0,0,-6);
    64     myLight2->SetFocalPoint(
    65         renderer->GetActiveCamera()->GetFocalPoint());
    66     renderer->AddLight(myLight2);
    67  
    68     iren->Initialize();
    69     iren->Start();
    70  
    71     return EXIT_SUCCESS;
    72 }

    3.运行结果

    4.经验总结

    1.当我们设置舞台上的光照参数时,要用到照相机Camera信息以及属性Property信息。因此头文件中不仅仅要包括#include<vtkLight.h>必须包括#include<vtkCamera.h>/#include<vtkProperty.h>。

    2.我们设计的是灯光位置,通过一组实验我们大概可以知晓vtk视窗内,XYZ轴的指向。

        

    图一:(-6,0,0)=蓝光灯;(6,0,0)=绿光灯。  X轴

    图二:(0,-6,0)=蓝光灯;(0,6,0)=绿光灯。  Y轴

    图三:(0,0,-6)=蓝光灯;(0,0,6)=绿光灯。  Z轴

  • 相关阅读:
    python网络爬虫——scrapy核心组件介绍、请求传参、下载中间件
    python网络爬虫——Scrapy全站数据爬取【手动请求发送】及post请求的发送
    python网络爬虫——scrapy框架持久化存储
    php常见排序
    php实现快速排序
    mysql读写分离 主从同步
    php预定义字符
    本地Navicat连不上Linux虚拟机MySQL数据库问题
    php yii 命令
    yii 定义场景
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14240965.html
Copyright © 2011-2022 走看看