2016-01-04 2 views
0

Я визуализирую триангулированную сетку (polydata) с помощью рендеринга VTK. Я хочу получить облако 3D-точек рендеринга (относительно камеры).VTK - вычислить облако точек для визуализированной сцены

Я нашел аналогичный фрагмент, который делает аналогичную вещь в PCL library, которая использует VTK в качестве инструмента визуализации.

Я реализую функцию PCL в своем коде, и мне удалось получить те же результаты (облако 3D-точек). Однако, я нашел вопрос, что я не знаю, с чего начать, чтобы решить:

  • Для точки, которая должна иметь действительное значение глубины в Z-буфер, 1 (я считаю, что это установленное значение по умолчанию означает НЕ действительную точку).

Я попытался сыграть с клипинговой плоскостью (также известной как nearz/farz), но ничего не улучшилось.

ОБНОВЛЕНИЕ: Проблема решена, потому что я забыл, что координата изображения, определенного VTK, отличается от традиционной. В VTK исходное значение находится внизу слева, а не сверху-слева.

ответ

0

Renderer преобразует отображение < -> мировые координаты. Посмотрите на методы класса vtkViewport: SetDisplayPoint(), DisplayToWorld(), GetWorldPoint(). Этот API использует однородные координаты. Посмотрите на источник любого виджета vtk - во время взаимодействия координаты отображения преобразуются в мировые координаты.

Но если вы пытаетесь получить координаты точки, лежащей на поверхности, вы действительно хотите vtkPointPicker или vtkCellPicker. Посмотрите примеры и тесты этих классов.

0

Я работал над этой же проблемой. Я использую привязки python vtk, но я думаю, вам будет интересно посмотреть на метод RequestData() в this question that I recently posted.. Мой вопрос касается выполнения конвейера, а не про проекции точек.

Ответы mirni определенно работают, но если вы делаете это для каждого пикселя, вы будете делать еще два создания матрицы, умножить матрицу и умножить матрицу на каждый пиксель.

Выполнение этого так, как я сделал в моем методе, сохранялось около 16 секунд на окне 300x300.

+1

Спасибо за информацию, в моем случае, узкое место в скорости, похоже, не связано с преобразованием, но как я получаю глубину, вызывая RenderWindow :: GetZbufferData(). Как получить глубину из окна рендеринга? –

+0

@ linzhang.robot Я могу себе представить, что это узкое место. Я использую vtkWindowToImageFilter(). Вы можете видеть это в сообщении, на которое я ссылался. Кроме того, здесь [пример в C++] (http://www.vtk.org/Wiki/VTK/Examples/Cxx/Utilities/ZBuffer). Обязательно прочтите [это предупреждение] (http://www.vtk.org/doc/nightly/html/classvtkWindowToImageFilter.html#details) –

+0

Да, я использовал 'vtkWindowToImageFilter', и хотя, возможно, GetZbufferData напрямую может быть быстрее. Я использовал 'vtkWindowToImageFilter' для получения цветного изображения моего окна рендеринга, функция' vtkWindowToImageFilter :: Update' на самом деле занимает много времени. Интересно, вызвано ли это некоторой неэффективной операцией копирования памяти vtk с черно-белым графическим процессором и процессором. –