對 camera 的操作方法如下:
1 vtkCamera *aCamera = vtkCamera::New(); 2 aCamera->SetViewUp (0, 0, -1);//設視角位置
3 aCamera->SetPosition (0, 1, 0);//設觀察對象位
4 aCamera->SetFocalPoint (0, 0, 0);//設焦點
5 aCamera->ComputeViewPlaneNormal();//自動
6 aRenderer->SetActiveCamera(aCamera);
1.SetClippingPlane
設置相機照攝方向的最近端和最遠端切片距離。感覺參數像是平行光投影到體數據上前面一片和最后一片的位置信息。(世界坐標系表示)渲染時好像把平面外的數據剪掉了。
2.SetFocalPoint /SetPosition
(世界坐標系),控制相機距離。
3.ComputeViewPlaneNormal
重置視平面法向,基於當前的位置和焦點。否則會出現斜推剪切效果。
4.SetViewUp
設置攝像機的向上的方向。
5.Zoom
通過改變視角的方法放大對象。
6.SetViewAngle
設置攝像機的視角,默認角度為30度,如果為平行投影則該角度無效。
通常完美視角計算=2*atan((h/2)/d) ,h是renderwindow的高度,d是眼睛到屏幕的距離。
OrthogonalizeViewup()--設置正交角度。
7.修改攝像機位置
設置好焦點后通過Azimuth()修改方位角和Elevation()修改攝像機位置。使攝像機圍繞焦點在球形緯度上運動。例子:
1 Azimuth(150)//表示 camera 的視點位置沿順時針旋轉 150 度角
2 Elevation(60)// 表示 camera 的視點位置沿向上的方面旋轉 60 度角
初始化相機
1 vtkCamera* cam1 = vtkCamera::New(); 2 cam1->SetClippingRange(0.0475572, 2.337786); //參數分別為沿着視向的近、遠剪切面的距離
3 cam1->SetFocalPoint(0.052665, -0.129454, -0.0573973); //焦點:世界坐標系,控制相機方向
4 cam1->SetPosition(0.327637, -0.116299, -0.256418); //位置:世界坐標系,設置相機位置
5 cam1->ComputeViewPlaneNormal(); //重置視平面法向,基於當前的位置和焦點。否則會出現斜推剪切效果
6 cam1->SetViewUp(-0.0225386, 0.999137, 0.034901); //設置相機的“上”方向
7 ren1->SetActiveCamera(cam1); //設置渲染器的相機
設置已有的相機
1 cam1 = ren1->GetActiveCamera(); //獲取渲染器的相機
2 cam1->Zoom(1.4); //放大相機,通過改變視角(SetViewAngle()),
另外,也可以使用Dolly()方法沿着視平面法向移動相機,實現放大或縮小可見角色物體。
基於焦點,使用Azimuth()和Elevation()方法設置相機的方位角和高度角/仰角(度,degree)[球坐標系統]。
注意其中在南極和北極存在奇異點,即視向量平行於視平面法向。此時可以使用OrthogonalizeViewUp()方法強制其正交。但這會改變相機坐標系統。
正交投影vs透視投影
vtkCamera::ParallelProjectionOn()開啟平行/正交投影。此時需通過SetParallelScale()方法控制角色物體的縮放。Zoom不再有效。