我在理解 VTK 中涉及的转换方面遇到了深刻的问题。 OpenGL 有相当好的文档,我的印象是 VTK 与 OpenGL 非常相似(在很多方面都是如此)。但是当谈到转型时,这似乎是一个完全不同的故事。

这是一个关于所涉及变换的很好的 OpenGL 文档:
http://www.songho.ca/opengl/gl_transform.html

OpenGL中的透视投影矩阵为:

我想看看这个应用于 VTK 的公式是否会给我 VTK 的投影矩阵(通过与 VTK 投影矩阵交叉检查)。

相关的相机和渲染器参数:

camera->SetPosition(0,0,20);
camera->SetFocalPoint(0,0,0);
double crSet[2] = {10, 1000};
renderer->GetActiveCamera()->SetClippingRange(crSet);
double windowSize[2];
renderWindow->SetSize(1280,720);
renderWindowInteractor->GetSize(windowSize);
proj = renderer->GetActiveCamera()->GetProjectionTransformMatrix(windowSize[0]/windowSize[1], crSet[0], crSet[1]);

我为这个配置得到的投影变换矩阵是:

投影矩阵的 (3,3) 和 (3,4) 值(假设它的行和列索引为 1 到 4)应该是 - (f+n)/(fn) 和 -2*f*n/(fn) 分别。在我的 VTK 相机设置中,nearz 是 10,farz 是 1000,因此我应该在矩阵的 (3,3) 和 (3,4) 位置分别得到 -1.020 和 -20.20。但它是 -1010 和 -10000。

我已经更改了我的裁剪范围值以查看更改,并且 (3,3) 位置始终接近 z+farz,这对我来说毫无意义。此外,如果有人能解释为什么在 (1,1) 和 (2,2) 位置是 3.7320,那就太好了。当我更改渲染器窗口的窗口大小时,此值不会更改。对我来说很困惑。

我在 VTKCamera 类引用中看到 GetProjectionTransformMatrix() 返回从相机坐标映射到视口(viewport)坐标的变换矩阵。

VTK Camera Class Reference

这是对 OpenGL 渲染中涉及的变换的一个很好的描述:

OpenGL 投影矩阵是从眼睛坐标映射到剪辑坐标的矩阵。毫无疑问,OpenGL 中的眼睛坐标与 VTK 中的相机坐标相同。但是 OpenGL 中的剪辑坐标与 VTK 的视口(viewport)坐标相同吗?

我的目标是在 VTK 中模拟真实的网络摄像头(已经校准)来渲染 3D 模型。

最佳答案

好吧,您链接到的文档实际上解释了这一点(重点是我的):



和:



请注意,这既不匹配 OpenGL 的窗口空间,也不匹配规范化的设备空间。如果找到这个术语“视口(viewport)坐标”,这是一个糟糕的选择,但尽管如此。更让我烦恼的是,矩阵实际上并没有转换到那个“视口(viewport)空间”,而是转换到一些等效的剪辑空间。只有在透视分割之后,坐标才会在上述“视口(viewport)空间”定义的范围内。



所以这个答案是否定的。但它很接近。基本上,该投影矩阵只是沿 z 维度的缩放和移位,并且很容易在这两者之间进行转换。基本上,您可以简单地从 VTK 的矩阵中取出 znearzfar,并将其放入您在上面链接的那个 OpenGL 投影矩阵公式中,只替换这两个矩阵元素。

关于c++ - VTK的ProjectionTransformMatrix和OpenGL的GL_PROJECTION有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26332662/

10-13 00:02