Я пытаюсь получить матрицу проецирования 4x4, которая преобразует точку в мире в координаты отображения.vtk матрица проекции: от мира к дисплею
Имея пиксель (x, y) и соответствующее значение z (из zbuffer
), я получаю его 3D-координаты мира с классом vtkWorldPointPicker
. Обозначим результат x.
По documentation, можно вычислить координаты вида мировой точки, применяя матрицу GetCompositeProjectionTransformMatrix
к й. Далее, я использую преобразование с целью начальных координат отображения, используя код найденный в 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
неверен. Должно быть:
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]
)!