天天看點

VTK學習-vtkLight

寫在前面:

這篇部落客要也是書上内容的整理。很基礎,但也不能說不重要。在此将書上内容做個整理,便于日後複習時能提綱挈領。

vtkLight基本概念:

就好像劇場裡多樣的燈光一樣,演員身上打了不同角度、不同顔色的燈光,觀衆們看到的形象也是不一樣的。那麼類似的,在三維場景渲染中,燈光也會影響三維物體最終展現的效果。

燈光和相機是三維渲染場景的必備要素。

在沒有明确指定燈光與相機的情況下,vtkRenderer會自動建立預設的燈光和相機。VTK裡用類vtkLight來表示渲染場景中的燈光。

vtkLight分為Positional Light與Direction Light。前者,可翻譯為位置燈光是将光源設定在渲染場景中的某個位置;後者,可翻譯為方向燈光是将光源設定在無窮遠處,這樣光源發射的光線可以認為是平行的。

實際程式設計中,需要包含對應頭檔案。

vtkLight常用函數:

SetColor():設定燈光的顔色,以RGB的形式指定顔色。

  1. SetColor():設定燈光的顔色。即(R,G,B)。詳細對照表可參考表1。
  2. SetPosition():設定燈光位置。傳入三維點位置坐标(x,y,z)。
  3. SetFocalPoint():設定燈光焦點。傳入三維點位置坐标(x,y,z)。
  4. SetIntensity():設定燈光的強度。傳入double類型的值,從0~1,表示燈光強度。
  5. SetSwitch()/SwitchOn()/SwitchOff():打開或關閉對應的燈光。如果某個類有提供SetXXX()函數,那麼一般也會有對應的GetXXX()函數來擷取對應的屬性值。此外SetXXX(1)與XXXOn()效果相同。SetXXX(0)與XXXOff()效果相同。

vtkLight更多詳細函數使用可以參考VTK官方文檔:vtkLight Class Reference 。

表1 常用顔色RGB和HSV值的對照

VTK學習-vtkLight

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中。即可向渲染場景中添加燈光。運作結果如下:

VTK學習-vtkLight

這裡添加了兩個燈光,而且為了友善觀看,對最初圖像進行了一定旋轉。可以看出不管如何旋轉,燈光效果不變,說明我們改變的隻是自己觀察的角度。

繼續閱讀