2016-05-25 4 views
0

Я пытаюсь получить матрицу проецирования 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])!

ответ

0

Преобразование действительно действительно, хотя могут быть встроенные способы получения окончательной матрицы.

Предполагая, что только один (по умолчанию) видовой экран используется матрица преобразования вид в координатах дисплея:

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

, где X и Y ширина и высота изображения в пикселях. Следовательно, учитывая точку x в мировой системе координат, отображение координат в гомогенной форме, являются:

c = M * P * x; 

где P является CompositeProjectionTransformMatrix. После нормализации (c[i] /= c[3], i = 0,1,2) мы получаем исходные значения пикселей.