Библиотека сайта rus-linux.net
Система VTK
Глава 24 из 1 тома книги "Архитектура приложений с открытым исходным кодом".
Оригинал: VTK, глава из книги "The Architecture of Open Source Applications" том 1.
Автор: Berk Geveci и Will Schroeder
Перевод: Н.Ромоданов
24.2.4. Подсистема рендеринга
На первый взгляд в системе VTK присутствует простая объектно-ориентированная модель визуализации с классами, соответствующими компонентам, с помощью которых создаются трехмерные сцены. Например, объекты vtkActor
являются объектами, рендеринг которых осуществляется с помощью vtkRenderer
в сочетании с vtkCamera
и, возможно, с несколькими объектами vtkRenderer
, существующими в vtkRenderWindow
. Сцена освещается одним или несколькими объектами vtkLight
. Управление положением каждого vtkActor
происходит с помощью vtkTransform
, а внешний вид актера определяется через vtkProperty
. Наконец, геометрическое представление актера определяется с помощью vvtkMapper
. Важную роль в системе VTK играют преобразователи mapper, которые обслуживают завершение обработки данных в конвейере, а также являются интерфейсом системы рендеринга. Рассмотрим следующий пример, в котором мы прореживаем данные и записываем результат в файл, а затем с помощью преобразователя mapper визуализируем их и будем с ними взаимодействовать.
vtkOBJReader *reader = vtkOBJReader::New(); reader->SetFileName("exampleFile.obj"); vtkTriangleFilter *tri = vtkTriangleFilter::New(); tri->SetInputConnection(reader->GetOutputPort()); vtkQuadricDecimation *deci = vtkQuadricDecimation::New(); deci->SetInputConnection(tri->GetOutputPort()); deci->SetTargetReduction( 0.75 ); vtkPolyDataMapper *mapper = vtkPolyDataMapper::New(); mapper->SetInputConnection(deci->GetOutputPort()); vtkActor *actor = vtkActor::New(); actor->SetMapper(mapper); vtkRenderer *renderer = vtkRenderer::New(); renderer->AddActor(actor); vtkRenderWindow *renWin = vtkRenderWindow::New(); renWin->AddRenderer(renderer); vtkRenderWindowInteractor *interactor = vtkRenderWindowInteractor::New(); interactor->SetRenderWindow(renWin); renWin->Render();
Здесь один актер, механизм рендеринга и окно рендеринга создаются с добавлением преобразователя mapper, который подсоединяет конвейер к системе рендеринга. Также обратите внимание на добавление vtkRenderWindowInteractor
, экземпляры которого перехватывают события мыши и клавиатуры и транслируют их в манипуляции с камерой или в другие действия. Этот процесс трансляции определяется через vtkInteractorStyle
(подробнее об этом ниже). По умолчанию настройка многих экземпляров объектов и значений данных происходит за кулисами. Например, конструируется идентичное преобразование (identity transform), а также единственный используемый по умолчанию свет (осветитель) и его свойства.
Со временем эта объектная модель стала еще более сложной. Большая часть сложности была привнесена из разработки производных классов, которые специализируются на каком-то одном из аспектов процесса рендеринга. Теперь объекты vtkActor
уточняются с помощью vtkProp
(подобно тому как свойства prop ищутся на каждой стадии), и есть целая куча этих свойств prop для рендеринга двухмерной графики с оверлеями, текста, специальных трехмерных объектов и даже для поддержки улучшенных методов рендеринга, например, объемного рендеринга или поддержки использования графических процессоров (смотрите рис.24.4).
Поскольку модель данных, поддерживаемая в системе VTK, существенно выросла, аналогичным образом появились различные преобразователи mapper, с помощью которых организуется интерфейс между данными и системой рендеринга. Еще одной областью значительного расширения системы является иерархия трансформаций. То, что первоначально было простой линейной матрицей преобразования размером 4×4, стало мощной иерархией, в которой поддерживаются нелинейные преобразования, в том числе преобразования сплайнов вида thin-plate. Например, исходный класс vtkPolyDataMapper
имел подклассы для конкретных устройств (например, vtkOpenGLPolyDataMapper
). В последние годы он был заменен сложным графическим конвейером, называемым painter-конвейером, показанным на рис.24.4.
Рис.24.4: Изображение классов
В конструкции painter-конвейера поддерживаются различные методы рендеринга данных, которые можно объединять для получения специальных эффектов. Эта возможность значительно превосходит возможности простого преобразователя vtkPolyDataMapper
, который первоначально был реализован в 1994 году.
Другим важным аспектом системы визуализации является подсистема, позволяющая делать выбор. В системе VTK есть иерархия средств выбора типа picker, которые условно делятся на те, что позволяют выбирать свойства vtkProp
с использованием методов, реализованных аппаратно, а не программно (например, прорисовка лучей); а также на те которые после выполнения операции выбора pick позволяют предоставлять информацию с различными уровнями детализации. Например, с помощью некоторых команд picker можно получить информацию о месте XYZ в реальном пространстве без указания, какое было выбрано свойство vtkProp
; тогда как с помощью других команд можно получить не только конкретное свойство vtkProp
, но конкретную точку или ячейку, из которых состоит сетка, определяющая геометрию свойств prop.
Продолжение статьи: События и взаимодействие