VTK修炼之道8_三维场景基本要素:相机
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道8_三维场景基本要素:相机
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.VTK中相機原理及控制屬性
觀眾的眼睛就好比三維渲染場景中的相機,VTK則是用vtkCamera類來表示三維渲染場景中的相機。vtkCamera負責(zé)把三維場景投影到二維平面,如屏幕、圖像等。下圖為相機投影示意圖:從上圖可以看出與相機投影相關(guān)的因素主要有:
相機位置:即相機所在的位置,用方法vtkCamera::SetPosition()設(shè)置。
相機焦點:用方法vtkCamera::SetFocusPoint()設(shè)置,默認的焦點位置在世界坐標系的原點。
朝上方向:即哪個方向為相機朝上的方向。就好比我們直立看東西,方向為頭朝上,看到的東西也是直立的,如果我們倒立看某個東西,這時方向為頭朝下,看到的東西當(dāng)然就是倒立的。相機位置、相機焦點和朝上方向三個因素確定了相機的實際方向,即確定相機的視圖。 投影方向:相機位置到相機焦點的向量方向即為投影方向。
投影方法:確定Actor是如何映射到像平面的。vtkCamera定義了兩種投影方法,一種是正交投影(OrthographicProjection),也叫平行投影(Parallel Projection),即進入相機的光線與投影方向是平行的。另一種是透視投影(PerspectiveProjection),即所有的光線相交于一點。
視角:透視投影時需要指定相機的視角(View Angle),默認的視角大小為30o,可以用方法vtkCamera::SetViewAngle()設(shè)置。
前后裁剪平面:裁剪平面與投影方向相交,一般與投影方向也是垂直的。裁剪平面主要用于評估Actor與相機距離的遠近,只有在前后裁剪平面之間的Actor才是可見的。裁剪平面的位置可以用方法vtkCamera::SetClippingRange()設(shè)置。
2.相機使用方法示例
首先要記住一點的是Camera是Renderer(三維場景)的構(gòu)成要素。 如果想獲取vtkRenderer里默認的相機,可以用方法vtkRenderer::GetActiveCamera()。相機vtkCamera的使用方法:
vtkSmartPointer<vtkCamera>myCamera = vtkSmartPointer<vtkCamera>::New(); myCamera->SetClippingRange(0.0475,2.3786); //這些值隨便設(shè)置的,東靈提供的 myCamera->SetFocalPoint(0.0573,-0.2134, -0.0523); myCamera->SetPosition(0.3245,-0.1139, -0.2932);//是否要保證相機位置-焦點向量 與 相機位置-向上方向 正交?? myCamera->ComputeViewPlaneNormal();//重新計算視平面法向量 平行于 相機-焦點 myCamera->SetViewUp(-0.2234,0.9983, 0.0345); renderer->SetActiveCamera(myCamera); //激活新生成的相機
上述用SetClippingRange();SetFocalPoint();SetPosition()分別設(shè)置相機的前后裁剪平面,焦點和位置。ComputeViewPlaneNormal()方法是根據(jù)設(shè)置的相機位置、焦點等信息,重新計算視平面(View Plane)的法向量。一般該法向量與視平面是垂直的,如果不是垂直的話,Actor等看起來會有一些特殊的效果,如錯切。SetViewUp()方法用于設(shè)置相機朝上方向。最后用方法vtkRenderer::SetActiveCamera()把相機設(shè)置到渲染場景中。
vtkCamera除了提供設(shè)置與相機投影因素相關(guān)的方法之外,還提供了大量的控制相機運動的方法,如:vtkCamera::Dolly(),vtkCamera::Roll(),vtkCamera::Azimuth(),vtkCamera::Yaw(),vtkCamera::Elevation(),vtkCamera::Pitch(),vtkCamera::Zoom()。這些方法具體表示相機是怎么運動,以及相對哪個位置或者方向運動。
3.相機運動方向示意圖
關(guān)于控制相機的運動更詳細的方法應(yīng)該參考Camera說明文檔。
4.相機簡單測試
vtkSmartPointer<vtkCamera> mycamera =vtkSmartPointer<vtkCamera>::New();mycamera->SetFocalPoint(0,0,0);mycamera->SetPosition(-5,0,0);mycamera->SetClippingRange(5.5,6.5);mycamera->ComputeViewPlaneNormal();mycamera->SetViewUp(0,1,0);renderer->SetActiveCamera(mycamera); vtkSmartPointer<vtkCamera> mycamera =vtkSmartPointer<vtkCamera>::New();mycamera->SetFocalPoint(0,0,0);mycamera->SetPosition(-10,0,0);mycamera->SetClippingRange(10.5,11.5);mycamera->ComputeViewPlaneNormal();mycamera->SetViewUp(0,1,0);renderer->SetActiveCamera(mycamera); vtkSmartPointer<vtkCamera> mycamera =vtkSmartPointer<vtkCamera>::New();mycamera->SetFocalPoint(0,0,0);mycamera->SetPosition(-10,0,0);mycamera->SetClippingRange(5,9);mycamera->ComputeViewPlaneNormal();mycamera->SetViewUp(0,1,0);renderer->SetActiveCamera(mycamera); 前后裁剪平面不合法。總結(jié)
以上是生活随笔為你收集整理的VTK修炼之道8_三维场景基本要素:相机的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 评测称IE8成内存消耗王 高出IE7一半
- 下一篇: 飞鸽传书原创代码测试