【发布时间】: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];
其中sizex 和sizey 是图像的宽度和高度(以像素为单位),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])!
【问题讨论】: