2014-10-13 2 views
3

У меня возникли серьезные проблемы с пониманием трансформаций, связанных с VTK. OpenGL имеет достаточно хорошую документацию, и у меня создалось впечатление, что VTK очень похож на OpenGL (это во многом). Но когда дело доходит до преобразований, это, по-видимому, совершенно другая история.В чем разница между ProjectionTransformMatrix VTK и GL_PROJECTION OpenGL?

Это хороший OpenGL документации о преобразованиях участвуют: http://www.songho.ca/opengl/gl_transform.html

Проекция матрица перспективы в OpenGL является:

enter image description here

Я хотел бы видеть, если эта формула применяется в ВТК даст мне проекционная матрица VTK (путем перекрестной проверки с матрицей проекции VTK).

релевантной камеры и Renderer Параметры:

camera->SetPosition(0,0,20); 
camera->SetFocalPoint(0,0,0); 
double crSet[2] = {10, 1000}; 
renderer->GetActiveCamera()->SetClippingRange(crSet); 
double windowSize[2]; 
renderWindow->SetSize(1280,720); 
renderWindowInteractor->GetSize(windowSize); 
proj = renderer->GetActiveCamera()->GetProjectionTransformMatrix(windowSize[0]/windowSize[1], crSet[0], crSet[1]); 

проекция матрицы преобразования я получил для этой конфигурации:

enter image description here

The (3,3) и (3,4) значения проекционной матрицы (скажем, индексируются от 1 до 4 для строк и столбцов) должны быть - (f + n)/(fn) и -2 * f * n/(fn) соответственно. В моих настройках камеры VTK ближайший к вам 10, а farz - 1000, и поэтому я должен получить -1.020 и -20.20 соответственно в (3,3) и (3,4) местах матрицы. Но это -1010 и -10000.

Я изменил свои значения диапазона отсечения, чтобы увидеть изменения, и позиция (3,3) всегда близка к + farz, что не имеет для меня никакого смысла. Также было бы здорово, если кто-нибудь сможет объяснить, почему он равен 3,7320 в (1,1) и (2,2) позициях. И это значение НЕ изменяется при изменении размера окна окна рендеринга. Довольно недоумение.

Я вижу в ссылке класса VTKCamera, что GetProjectionTransformMatrix() возвращает матрицу преобразования, которая отображает из координат камеры в координаты просмотра.

VTK Camera Class Reference

Это хорошее изображение преобразований, участвующих в оказании OpenGL:

enter image description here

OpenGL Матрица проекции является матрицей, которая отображает от глаз координат подрезать координаты. Несомненно, координаты глаз в OpenGL совпадают с координатами камеры в VTK. Но являются ли координаты клипов в OpenGL такими же, как координаты вьюрок VTK?

Моя цель состоит в том, чтобы смоделировать настоящую веб-камеру (уже откалиброванную) в VTK для рендеринга 3D-модели.

ответ

2

Ну, документация вы связаны на самом деле объясняет это (курсив мой):

vtkCamera::GetProjectionTransformMatrix:

Возвращает преобразование проекции матрицы, которая преобразует из камеры координаты окна просмотра координаты.Этот метод вычисляет аспект, nearz и фарз, а затем вызывает конкретнее подпись Получить Композитный ProjectionTransformMatrix

с:

vtkCamera::GetCompositeProjectionTransformMatrix:

Возвращение конкатенации ViewTransform и ProjectionTransform. Это преобразование преобразует мировые координаты в координаты вида . «Аспект» - это ширина/высота для окна просмотра , а ближние и дальние - значения Z-буфера, которые сопоставляются с плоскостями ближнего и дальнего отсечения. Координаты точки зрения точки, расположенной внутри усеченного конуса, находятся в диапазоне ([-1, + 1], [- 1, + 1], [nearz, farz]).

Обратите внимание, что это не соответствует оконному пространству OpenGL или нормализованному пространству устройства. Если вы найдете термин «координаты видового экрана» для этого плохого выбора, но как бы то ни было. Что меня больше беспокоит, так это то, что матрица фактически не преобразуется в это «пространство видовых экранов», а в некоторый эквивалент клипа. Только после разрыва перспективы координаты будут находиться в диапазоне, указанном выше для определения «пространства просмотра».

Но есть координаты клипов в OpenGL, такие же, как координаты видового экрана VTK?

Так что ответ четкий нет. Но это близко. В принципе, эта матрица проекций является просто масштабированной и сдвинутой по размеру z, и ее легко конвертировать между этими двумя. В принципе, вы можете просто взять znear и zfar из матрицы VTK и поместить его в формулу матрицы матриц OpenGL, которую вы указали выше, заменив только эти два матричных элемента.

+0

Спасибо за ваше предложение. Моя цель - имитировать камеру VTK с реальными внутренними параметрами веб-камеры. Результаты калибровки веб-камеры дают фокусное расстояние как 646 с uc = 640 и vc = 360. Используя эти три параметра, я считаю, что могу изменить матрицу проекции. Но это возможно в OpenGL, потому что документация четкая. Я не понимаю, что вы подразумеваете, взяв znear и zfar из матрицы VTK. Можете ли вы объяснить немного более подробно? – technOslerphile

+1

@technOslerphile: В матрице VTK 'M', элемент' m22' - это просто '- (f + n)' и 'm23'' '' '' '' '' '' '' '' '' '' '' '' '' '' Таким образом, вы можете восстановить 'f' и' n'. Но вы все равно знаете их, поэтому вы можете их использовать. Чтобы превратить это в стандартную матрицу GL-матрицы 'P', просто установите' p22 = m22/(f-n) 'и' p23 = 2 * m23/(f-n) '. Обратите внимание, что это просто масштаб и сдвиг по размеру 'z', в основном отображающий диапазон матрицы [[-f, -n]' матрицы VTK обратно в диапазон [-1,1] 'GL ожидает, – derhass

Смежные вопросы