Opengl 如何从视图变换矩阵中提取视图上方向向量、视图角度和焦点?
我有一个传感器(一个跟踪器),它相对于世界坐标的旋转和相对于世界坐标的位置是已知的。我正在使用VTK相机渲染世界的3D模型 我已经在世界坐标系中注册了模型 基于跟踪器相对于世界坐标的旋转和位置,已知跟踪器和世界之间的相对位置。因此,如果我可以重新定向VTK摄影机,使其与渲染3D模型的相对位置和方向与跟踪器相对于世界的相对位置和方向相同,我将获得与世界对齐的3D模型 我的直觉告诉我,这可以通过改变VTK相机的上方向、视角、焦点和位置来实现。 跟踪器MAT是一个VTK矩阵,它具有跟踪器在世界坐标系中的旋转和位置信息摄影机是VTK摄影机,渲染器是VTK渲染器 record.x、record.y和record.z是跟踪器在世界坐标中的实时位置record.a、record.e和record.r是跟踪器的方位角、仰角和横摇。 基本上这就是我想做的:Opengl 如何从视图变换矩阵中提取视图上方向向量、视图角度和焦点?,opengl,camera,computer-vision,vtk,Opengl,Camera,Computer Vision,Vtk,我有一个传感器(一个跟踪器),它相对于世界坐标的旋转和相对于世界坐标的位置是已知的。我正在使用VTK相机渲染世界的3D模型 我已经在世界坐标系中注册了模型 基于跟踪器相对于世界坐标的旋转和位置,已知跟踪器和世界之间的相对位置。因此,如果我可以重新定向VTK摄影机,使其与渲染3D模型的相对位置和方向与跟踪器相对于世界的相对位置和方向相同,我将获得与世界对齐的3D模型 我的直觉告诉我,这可以通过改变VTK相机的上方向、视角、焦点和位置来实现。 跟踪器MAT是一个VTK矩阵,它具有跟踪器在世界坐标系中
vtkSmartPointer<vtkMatrix4> trackerMat = vtkSmartPointer<vtkMatrix4>::New();
vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
camera->SetPosition(record.x, record.y, record.z);
camera->SetFocalPoint(f.x, f.y, f.z);
camera->SetViewUp(viewUp.x, viewUp.y, viewUp.z);
camera->SetViewAngle(viewAngle);
renderer->SetActiveCamera(camera);
renderer->GetRenderWindow()->Render();
案例2:
因此,当焦点仅在z方向上更改时,viewMat将保持不变。有道理
案例3:
如果我将viewMat行索引为0到3,将列索引为0到3,那么我看到的是viewMat(0,3)、viewMat(1,3)和viewMat(2,3)并不总是对应于世界坐标中的vtkCamera位置
投影方向=从相机位置指向焦点方向的单位矢量。
似乎-viewMat(2,0)、-viewMat(2,1)和-viewMat(2,2)始终对应于投影方向
如果通过执行以下操作正交化视图上方向向量,使其始终垂直于投影方向:
camera->OrthogonaliseViewUp();
然后可以看到,-viewMat(1,0)、-viewMat(1,1)和-viewMat(1,2)始终对应于vtkCamera的viewUp向量
据我所知,平移向量,viewMat(0,3)、viewMat(1,3)和viewMat(2,3),应该以相机坐标给出世界原点。但在vtk中似乎并非如此 变换矩阵本质上是从原点空间看的目标空间的基向量。因此,您感兴趣的信息可以在视图矩阵中使用,左上角的3×3子矩阵是精确的,每个行或列(取决于您想要的映射;在正交矩阵中,视图的左上角的3×3应该是正交的,转置是相反的,因此行与列是相反的) 请注意,在视图转换中没有“焦点”这样的东西,只有向右、向上和视图方向。但这正是你需要的
-1 0 0 0
0 1 0 0
0 0 0 -5
0 0 0 1
camera->SetPosition(0,0,-5);
camera->SetFocalPoint(0,0,3);
vtkSmartPointer<vtkMatrix4x4> viewMat = vtkSmartPointer<vtkMatrix4x4>::New();
viewMat = camera->GetViewTransformMatrix();
-1 0 0 0
0 1 0 0
0 0 0 -5
0 0 0 1
camera->SetPosition(0,0,-5);
camera->SetFocalPoint(3,3,3);
vtkSmartPointer<vtkMatrix4x4> viewMat = vtkSmartPointer<vtkMatrix4x4>::New();
viewMat = camera->GetViewTransformMatrix();
-0.936 0 0.351 1.755
-0.116 0.943 -0.310 -1.551
-0.331 -0.331 -0.883 -4.417
0 0 0 1
camera->OrthogonaliseViewUp();