Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何从视图变换矩阵中提取视图上方向向量、视图角度和焦点?_Opengl_Camera_Computer Vision_Vtk - Fatal编程技术网

Opengl 如何从视图变换矩阵中提取视图上方向向量、视图角度和焦点?

Opengl 如何从视图变换矩阵中提取视图上方向向量、视图角度和焦点?,opengl,camera,computer-vision,vtk,Opengl,Camera,Computer Vision,Vtk,我有一个传感器(一个跟踪器),它相对于世界坐标的旋转和相对于世界坐标的位置是已知的。我正在使用VTK相机渲染世界的3D模型 我已经在世界坐标系中注册了模型 基于跟踪器相对于世界坐标的旋转和位置,已知跟踪器和世界之间的相对位置。因此,如果我可以重新定向VTK摄影机,使其与渲染3D模型的相对位置和方向与跟踪器相对于世界的相对位置和方向相同,我将获得与世界对齐的3D模型 我的直觉告诉我,这可以通过改变VTK相机的上方向、视角、焦点和位置来实现。 跟踪器MAT是一个VTK矩阵,它具有跟踪器在世界坐标系中

我有一个传感器(一个跟踪器),它相对于世界坐标的旋转和相对于世界坐标的位置是已知的。我正在使用VTK相机渲染世界的3D模型

我已经在世界坐标系中注册了模型

基于跟踪器相对于世界坐标的旋转和位置,已知跟踪器和世界之间的相对位置。因此,如果我可以重新定向VTK摄影机,使其与渲染3D模型的相对位置和方向与跟踪器相对于世界的相对位置和方向相同,我将获得与世界对齐的3D模型

我的直觉告诉我,这可以通过改变VTK相机的上方向、视角、焦点和位置来实现。 跟踪器MAT是一个VTK矩阵,它具有跟踪器在世界坐标系中的旋转和位置信息摄影机是VTK摄影机,渲染器是VTK渲染器

record.x、record.y和record.z是跟踪器在世界坐标中的实时位置record.a、record.e和record.r是跟踪器的方位角、仰角和横摇。 基本上这就是我想做的:

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();