vtk投影矩阵:从世界到显示



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

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

根据文档,我可以通过将矩阵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提供的代码段不正确。它应该是:

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])!

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

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

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

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

c = M * P * x;

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

相关内容

  • 没有找到相关文章

最新更新