寫在前面:
這篇部落客要也是書上内容的整理。很基礎,但也不能說不重要。在此将書上内容做個整理,便于日後複習時能提綱挈領。
vtkLight基本概念:
就好像劇場裡多樣的燈光一樣,演員身上打了不同角度、不同顔色的燈光,觀衆們看到的形象也是不一樣的。那麼類似的,在三維場景渲染中,燈光也會影響三維物體最終展現的效果。
燈光和相機是三維渲染場景的必備要素。
在沒有明确指定燈光與相機的情況下,vtkRenderer會自動建立預設的燈光和相機。VTK裡用類vtkLight來表示渲染場景中的燈光。
vtkLight分為Positional Light與Direction Light。前者,可翻譯為位置燈光是将光源設定在渲染場景中的某個位置;後者,可翻譯為方向燈光是将光源設定在無窮遠處,這樣光源發射的光線可以認為是平行的。
實際程式設計中,需要包含對應頭檔案。
vtkLight常用函數:
SetColor():設定燈光的顔色,以RGB的形式指定顔色。
- SetColor():設定燈光的顔色。即(R,G,B)。詳細對照表可參考表1。
- SetPosition():設定燈光位置。傳入三維點位置坐标(x,y,z)。
- SetFocalPoint():設定燈光焦點。傳入三維點位置坐标(x,y,z)。
- SetIntensity():設定燈光的強度。傳入double類型的值,從0~1,表示燈光強度。
- SetSwitch()/SwitchOn()/SwitchOff():打開或關閉對應的燈光。如果某個類有提供SetXXX()函數,那麼一般也會有對應的GetXXX()函數來擷取對應的屬性值。此外SetXXX(1)與XXXOn()效果相同。SetXXX(0)與XXXOff()效果相同。
vtkLight更多詳細函數使用可以參考VTK官方文檔:vtkLight Class Reference 。
表1 常用顔色RGB和HSV值的對照
vtkLight使用樣例:
#include <vtkRenderWindow.h>
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkLight.h>
int main(){
vtkSmartPointer<vtkCylinderSource>cylinder=vtkSmartPointer<vtkCylinderSource>::New();
cylinder->SetHeight();
cylinder->SetRadius();
cylinder->SetResolution();
vtkSmartPointer<vtkPolyDataMapper>cylinderMapper=vtkSmartPointer<vtkPolyDataMapper>::New();
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
vtkSmartPointer<vtkActor>cylinderActor=vtkSmartPointer<vtkActor>::New();
cylinderActor->SetMapper(cylinderMapper);
//cylinderActor->SetTexture(texture);
vtkSmartPointer<vtkRenderer>renderer=vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(cylinderActor);
renderer->SetBackground(,,);
vtkSmartPointer<vtkRenderWindow>renwin=vtkSmartPointer<vtkRenderWindow>::New();
renwin->AddRenderer(renderer);
renwin->SetSize(,);
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(,,);
myLight->SetPosition(,,);
myLight->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());
renderer->AddLight(myLight);
vtkSmartPointer<vtkLight> myLight2 =
vtkSmartPointer<vtkLight>::New();
myLight2->SetColor(,,);
myLight2->SetPosition(,,-);
myLight2->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());
renderer->AddLight(myLight2);
iren->Initialize();
iren->Start();
return EXIT_SUCCESS;
}
重點在于:
首先利用vtkSmartPoint指針建立vtkLight對象。然後調用一些函數設定好燈光的屬性,然後調用vtkRenderer::AddLight()函數,将vtkLight添加到vtkRenderer中。即可向渲染場景中添加燈光。運作結果如下:
這裡添加了兩個燈光,而且為了友善觀看,對最初圖像進行了一定旋轉。可以看出不管如何旋轉,燈光效果不變,說明我們改變的隻是自己觀察的角度。