2013-08-06 138 views
2

我在原點對象和我的相機移動(0650650)和焦點設置到原點,即:如何解釋VtkCamera viewTransformMatrix

vtkSmartPointer<vtkCamera> cam = vtkSmartPointer<vtkCamera>::New(); 
renderer->SetActiveCamera(cam); 

cam->SetFocalPoint(0., 0., 0.); 
cam->SetPosition(0., 650, 650); 
cam->SetViewAngle(view_angle_); 

cam->SetViewUp(0., 1., 0.); 

然而,當我得到視圖變換矩陣相機通過:

vtkSmartPointer<vtkMatrix4x4> transform_view = cam->GetViewTransformMatrix(); 

,並打印我得到以下幾點:

| 1 | 0 | 0 |  0 | 
| 0 | cos(45) | -sin(45)|  0 | 
| 0 | sin(45) | cos(45) | -919.239 | 
| 0 | 0 | 0 |  1 | 

在哪裏旋轉部分似乎是正確的(圍繞X軸45度),但翻譯似乎都是錯誤的。如果最後一列不是:

| 0 | 
|650| 
|650| 

或者我做錯了什麼?

回答

0

焦點與「看」點不一樣。焦點可能在相機的前面或後面。這是你場景中所有光線通過的點,可以讓你看到視角。這些光線投射到視圖平面上,這是呈現的內容。

如果您想查看原點,您需要將您的View Plane Normal矢量設置爲從攝像機位置指向原點的歸一化矢量。所以,如果你的相機位置在L位置,那麼View Plane Normal矢量應該是-L/|| L || || ||是l-2規範。

+0

根據vtk文檔(這裏:http://www.vtk.org/doc/release/5.2/html/a00154.html#40f9e41a86e5b7c94fe171e7b9193673)它說,在'GetViewTransformMatrix()**「的方法中ViewTransform僅依賴於三個ivars:位置,FocalPoint和ViewUp矢量。「** – Aly

+0

查看vtkCamera文檔」SetViewPlaneNormal「方法已被棄用。也許你可以展示一些代碼來實現這一點?然而,旋轉矩陣似乎是正確的,所以這不就意味着相機正對着正確的點,在這種情況下的原點? – Aly

+0

該文檔顯示「[ViewPlaneNormal]方法已被棄用。根據ViewShear從DirectionOfProjection自動設置視圖平面法線。」它還說「除非你使用SetViewShear/SetObliqueAngles創建剪切輸出視圖,否則」視圖平面法線「將指向與投影方向相反。」因此,請改用DirectionOfProjection方法......在這種情況下,它只是L/|| L ||。我沒有任何代碼;我從來沒有使用vtk。 – andand

0

這是一個古老的問題,但我會給出一個記錄的答案。


你期望的是變換 w_T_c,即從相機幀到世界框架。

什麼GetViewTransformMatrix方法返回時,是c_T_w,即,從世界上變換到攝像機幀:鑑於世界幀的點p_w,其在相機幀的座標 P_C = c_T_w * p_w

在你的例子中,如果你倒置了你的矩陣,在最後一列中,你將得到你正在尋找的翻譯值。