Основы трехмерной графики

43

Трехмерная графика в WPF включает в себя следующие ингредиенты:

Разумеется, наиболее сложные трехмерные сцены содержат множество объектов и могут включать множество источников света. (Можно также создать трехмерный объект, не требующий источника света, если он сам излучает свет.) Однако перечисленные ингредиенты представляют собой хорошую начальную точку.

Трехмерную графику от двухмерной отличают, прежде всего, второй и третий компоненты. Новички в трехмерном программировании иногда предполагают, что трехмерные библиотеки — это лишь упрощенный способ создания трехмерного внешнего вида, такого как светящийся куб или вращающаяся сфера. Но если это все, что нужно, то для такого трехмерного рисования вполне можно ограничиться классами двухмерной графики, о которых рассказывалось ранее. В конце концов, нет причин, которые помешали бы использовать фигуры, трансформации и геометрии, чтобы сконструировать формы, выглядящие объемными. Фактически, это даже проще, чем то же самое, но с применением трехмерных библиотек.

Так в чем же преимущество использования поддержки трехмерной графики в WPF? Первое преимущество состоит в том, что можно создавать эффекты, которые чрезвычайно сложно вычислить на основе эмулируемой трехмерной модели. Хорошим примером могут быть такие эффекты, как отражение, которое становится чрезвычайно сложным, когда приходится иметь дело с множеством источников света и разными материалами с различной отражающей способностью.

Другое преимущество использования трехмерной графической модели заключается в том, что она позволяет взаимодействовать с изображением как с набором трехмерных объектов. Это значительно расширяет возможности программирования. Например, однажды построив требуемую трехмерную сцену, вы получаете простую возможность вращения объекта или вращения камеры вокруг объекта. Для выполнения той же работы на основе двухмерной программной модели потребуется чудовищный объем кода (и знаний математики).

Окно просмотра

Чтобы работать с трехмерным содержимым, понадобится контейнер, который может его в себе разместить. Этот контейнер представлен классом Viewport3D, находящимся в пространстве имен System.Windows.Controls. Класс Viewport3D унаследован от FrameworkElement и потому может быть размещен везде, где размещается любой обычный элемент. Например, его можно использовать в качестве содержимого окна либо страницы или же поместить внутрь более сложной компоновки.

Класс Viewport3D лишь намекает на сложность трехмерного программирования. Он добавляет только два свойства: Camera, определяющее точку зрения на трехмерную сцену, и Children, содержащее все трехмерные объекты, которые должны помещаться на сцене. Достаточно интересно то, что источник света, освещающий сцену, сам является объектом в окне просмотра.

Среди унаследованных свойств класса Viewport3D одно является особенно важным — ClipToBounds. Если оно установлено в true (по умолчанию так и есть), то содержимое, выходящее за пределы окна просмотра, усекается. Если же упомянутое свойство равно false, это содержимое появляется поверх любых соседних элементов. Это поведение аналогично поведению свойства ClipToBounds класса Canvas. Однако при использовании Viewport3D есть одно существенное отличие: производительность. Установив Videport3D. ClipToBounds в false, можно в значительной мере увеличить производительность при визуализации сложной, часто обновляемой трехмерной сцены.

Пройди тесты
Лучший чат для C# программистов