Наши партнеры

UnixForum





Библиотека сайта 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.


Продолжение статьи: События и взаимодействие