首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从视图变换矩阵中提取视图上的向量、视角和焦点?

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

Stack Overflow用户
提问于 2014-09-24 09:01:35
回答 1查看 2.2K关注 0票数 1

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

我已经在世界坐标上注册了模型。

根据跟踪器相对于世界坐标的旋转和位置,知道跟踪器与世界之间的相对位置。因此,如果我能重新定位VTK相机,将其置于与渲染的3D模型相同的相对位置和方向,就像跟踪器的3D模型相对于世界,我将得到一个与世界一致的3D模型。

我的直觉说,这可以通过改变VTK相机的视角上矢量,视角,焦点和位置。trackerMat是一种具有跟踪器在世界坐标下的旋转和位置信息的vtkMatrix。camera是vtkCamera,渲染器是vtkRenderer。

X、、和是跟踪器在世界坐标下的实时位置。记录.a、记录.e和r.是跟踪器的方位、仰角和滚动。基本上,这就是我想做的:

代码语言:javascript
复制
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();

我试着把vtkCamera的方位角、仰角和滚动设置成和跟踪器相同的位置,但结果很奇怪。

这就是为什么我认为我应该设置焦点,视图向量和角度的vtkCamera,而不是角度。vtkCamera位置可以很容易地设置为与跟踪器相同的位置。有什么方法可以从trackerMat中提取视图上的矢量、焦点和视角吗?我的renderWindow大小是1280*720

更新:我通过将vtkCamera焦点设置到不同的位置来进行一系列的试验,看看viewMatrix是如何改变的:

案例1:

代码语言:javascript
复制
camera->SetPosition(0,0,-5);
camera->SetFocalPoint(0,0,0);
vtkSmartPointer<vtkMatrix4x4> viewMat = vtkSmartPointer<vtkMatrix4x4>::New();
viewMat = camera->GetViewTransformMatrix();

在这种情况下,viewMat是:

代码语言:javascript
复制
-1   0   0  0
 0   1   0  0
 0   0   0  -5
 0   0   0   1

案例2:

代码语言:javascript
复制
camera->SetPosition(0,0,-5);
camera->SetFocalPoint(0,0,3);
vtkSmartPointer<vtkMatrix4x4> viewMat = vtkSmartPointer<vtkMatrix4x4>::New();
viewMat = camera->GetViewTransformMatrix();

在这种情况下,viewMat是:

代码语言:javascript
复制
-1   0   0  0
 0   1   0  0
 0   0   0  -5
 0   0   0   1

因此,当焦点仅在z方向上改变时,viewMat将保持不变.合乎道理。

案例3:

代码语言:javascript
复制
camera->SetPosition(0,0,-5);
camera->SetFocalPoint(3,3,3);
vtkSmartPointer<vtkMatrix4x4> viewMat = vtkSmartPointer<vtkMatrix4x4>::New();
viewMat = camera->GetViewTransformMatrix();

在这种情况下,viewMat是:

代码语言:javascript
复制
-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

如果我将viewMat行索引为0到3,列索引为0到3,那么我看到的是,viewMat(0,3)、viewMat(1,3)和viewMat(2,3)并不总是对应于世界坐标中的vtkCamera位置。

投影方向=从摄像机位置指向焦点的单位矢量。-viewMat(2,0)、-viewMat(2,1)和-viewMat(2,2)似乎总是对应于投影方向。

如果将视图向上向量正交化,使其始终垂直于投影方向,则可以这样做:

代码语言:javascript
复制
camera->OrthogonaliseViewUp();

证明了-viewMat(1,0)、-viewMat(1,1)和-viewMat(1,2)总是对应于vtkCamera的viewUp向量。

据我所知,平移向量,viewMat(0,3),viewMat(1,3)和viewMat(2,3),应该在相机坐标中给出你的世界起源。但在vtk看来并非如此。

EN

回答 1

Stack Overflow用户

发布于 2014-09-24 10:45:40

变换矩阵本质上是从原点空间中看到的目标空间的基向量。因此,您感兴趣的信息可以在视图矩阵、准确地说是左上3×3子矩阵、每一行或每列中使用(取决于您想要的映射;在正交矩阵中,视图的左上方3×3应该是正交的,转置是逆的,因此行与列相反)。

注意,在视图转换中没有“焦点”这样的东西,只有正确的方向、向上的方向和视图。但这正是你所需要的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26012755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档