C++ 如何解释VtkCamera viewTransformMatrix
我在原点有一个对象,正在将相机移动到(0650650),并将焦点设置到原点,即:C++ 如何解释VtkCamera viewTransformMatrix,c++,math,opengl,geometry,vtk,C++,Math,Opengl,Geometry,Vtk,我在原点有一个对象,正在将相机移动到(0650650),并将焦点设置到原点,即: vtkSmartPointer<vtkCamera> cam = vtkSmartPointer<vtkCamera>::New(); renderer->SetActiveCamera(cam); cam->SetFocalPoint(0., 0., 0.); cam->SetPosition(0., 650, 650); cam->SetViewAngle(vi
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.);
旋转部分似乎正确(围绕x轴旋转45度),但平移似乎完全错误。如果最后一列不是:
| 0 |
|650|
|650|
还是我做错了什么?焦点与“注视”点不同。焦点可能在相机的前面或后面。这是一个点,场景中的所有光线都将通过该点以提供您的视图透视。这些光线被投影到视图平面上,视图平面就是渲染的平面
如果要查看原点,需要将视图平面法向量设置为从摄影机位置指向原点的规格化向量。因此,如果您的相机位置在位置L,则视图平面法向量应为-L/| | | L | | | | | | |是L-2范数。这是一个老问题,但我会给出一个答案以供记录。
您所期望的是变换w_T_c,即从相机帧到世界帧 GetViewTransformMatrix方法返回的是c_T_w,即从世界到摄影机帧的变换:给定世界帧p_w中的一个点,其在摄影机帧中的坐标为p_c=c_T_w*p_w
在您的示例中,如果您反转矩阵,则在最后一列中,您将得到您要查找的平移值。根据vtk文档(此处:)的说明,在方法
GetViewTransformMatrix()
“ViewTransform仅取决于三个IVAR:位置、焦点和ViewUp向量。”查看vtkCamera文档后,方法SetViewPlaneNormal
已被弃用。也许您可以展示一些代码来实现这一点?然而,旋转矩阵似乎是正确的,所以这不意味着相机面对的是正确的点,即本例中的原点吗?文档中说“[ViewPlaneNormal]方法已被弃用。视图平面法线是根据ViewShear从DirectionOfProjection自动设置的。”它还说“[视图平面法线]将指向与投影方向相反的方向,除非已使用SetViewShear/SetColliqueAngles创建剪切输出视图。“因此,请改用DirectionOfProjection方法。。。在这种情况下,它就是L/| | L | |。我没有任何代码;我从未使用过vtk。为了回应您的第一个评论,文档还声明“[vtkCamera类]提供了定位和定向视点和焦点的方法”。这意味着他们将视点和焦点视为通常不同的,与这两个术语的常用用法一致。他们可能使用焦点和相机位置(人为地)约束相机属性;然而,我阅读的文档中没有提到这些约束。简而言之,我看不出文档中的两个语句是如何协调的。
| 1 | 0 | 0 | 0 |
| 0 | cos(45) | -sin(45)| 0 |
| 0 | sin(45) | cos(45) | -919.239 |
| 0 | 0 | 0 | 1 |
| 0 |
|650|
|650|