生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道7_三维场景基本要素:光照
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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.光照實驗
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
/
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkLight.h>
#include <vtkCamera.h>
#include <vtkProperty.h>int main()
{vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();cylinder->SetHeight( 3.0 );cylinder->SetRadius( 1.0 );cylinder->SetResolution( 10 ); vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();cylinderMapper->SetInputConnection( cylinder->GetOutputPort() ); vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();cylinderActor->SetMapper( cylinderMapper );vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();renderer->AddActor( cylinderActor );renderer->SetBackground( 1.0, 0, 0 );vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();renWin->AddRenderer( renderer );renWin->SetSize( 640, 480 );renWin->Render();renWin->SetWindowName("RenderCylinder-Lights");vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();iren->SetRenderWindow(renWin);vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();iren->SetInteractorStyle(style);vtkSmartPointer<vtkLight> myLight = vtkSmartPointer<vtkLight>::New();myLight->SetColor(0,1,0);myLight->SetPosition(0,0,6);myLight->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());renderer->AddLight(myLight);vtkSmartPointer<vtkLight> myLight2 =vtkSmartPointer<vtkLight>::New();myLight2->SetColor(0,0,1);myLight2->SetPosition(0,0,-6);myLight2->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());renderer->AddLight(myLight2);iren->Initialize();iren->Start();return EXIT_SUCCESS;}
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軸
總結
以上是生活随笔為你收集整理的VTK修炼之道7_三维场景基本要素:光照的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。