2

我在原点有一个物体,正在将相机移动到(0,650,650)并将焦点设置为原点,即:

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|

还是我做错了什么?

4

2 回答 2

2

这是一个老问题,但我会给出一个记录在案的答案。


您期望的是w_T_c的转换,即从相机帧到世界帧。

GetViewTransformMatrix方法返回的是c_T_w,即从世界到相机帧的变换:给定世界帧 p_w 中的一个点在相机帧中的坐标是p_c = c_T_w * p_w

在您的示例中,如果您反转矩阵,则在最后一列中您将获得您正在寻找的翻译值。

于 2016-08-06T07:44:28.950 回答
0

焦点与“看”点不同。焦点可能在相机的前面或后面。这是您的场景的所有光线都将通过的点,以提供您的视角。这些光线被投影到视图平面上,这就是渲染的内容。

如果要查看原点,则需要将 View Plane Normal 向量设置为从相机位置指向原点的归一化向量。因此,如果您的相机位置在位置 L,则 View Plane Normal 向量应为 -L/||L|| 在哪里 || || 是 l-2 范数。

于 2013-08-06T15:46:50.240 回答