【问题标题】:vtk projection matrix: from world to displayvtk 投影矩阵:从世界到显示
【发布时间】:2016-05-25 00:18:43
【问题描述】:

我正在尝试获取一个 4x4 投影矩阵,它将世界中的一个点转换为显示坐标。

有一个像素 (x, y) 和相应的 z 值(来自zbuffer),我通过vtkWorldPointPicker 类获得它的 3D 世界坐标。让我们用 x 来表示结果。

根据documentation,我可以通过将矩阵GetCompositeProjectionTransformMatrix应用于x来计算世界点的视图坐标。接下来,我使用vtkViewport::ViewToDisplay (*) 中的代码将视图转换为初始显示坐标:

dx = (v[0] + 1.0) * (sizex*(v[2]-v[0])) / 2.0 + sizex*v[0];
dy = (v[1] + 1.0) * (sizey*(v[3]-v[1])) / 2.0 + sizey*v[1];

其中sizexsizey 是图像的宽度和高度(以像素为单位),v 是计算得到的视图坐标。

很遗憾,我得到的值与原来的不符:

display [0, 0, 0.716656] // x,y-pixel coordinates and the zbuffer
x = [0.0255492, -0.0392383, 0.00854707] // world coordinates  (using vtkWorldPointPicker)

// camera->GetCompositeProjectionTransformMatrix
P = [
 -1.84177         0         0         0
        0   1.20317   1.39445         0
        0  -757.134   653.275   -9.9991
        0 -0.757126  0.653268         0 ]

v = [-0.0470559, -0.0352919, 25.2931, 0.0352919] // P*x
a = [7697.18, -0.597848] // using (*)

这种方法(通常)是否正确,还是有更传统的方法来做到这一点?感谢您的帮助。

编辑:vtkViewport::ViewToDisplay 提供的 sn-p 不正确。它应该是:

dx = (v[0] + 1.0) * (sizex*(vp[2]-vp[0])) / 2.0 + sizex*vp[0];
dy = (v[1] + 1.0) * (sizey*(vp[3]-vp[1])) / 2.0 + sizey*vp[1];

注意,v 指的是标准化视图坐标,vp 是视口(默认情况下,vp := [0, 0, 1, 1])!

【问题讨论】:

    标签: graphics 3d vtk


    【解决方案1】:

    转换确实有效,尽管可能有内置方法可以获取最终矩阵。

    假设仅使用一个(默认)视口,将视图转换为显示坐标的矩阵为:

    M = [X/2,   0, 0, X/2,
           0, Y/2, 0, Y/2,
           0,   0, 1,   0,
           0,   0, 0,   1]
    

    其中XY 是图像的宽度和高度(以像素为单位)。 因此,给定世界坐标中的一个点x,齐次形式的显示坐标为:

    c = M * P * x;
    

    其中PCompositeProjectionTransformMatrix。归一化(c[i] /= c[3]i = 0,1,2)后,我们得到了原始像素值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 2019-08-10
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      相关资源
      最近更新 更多