Трехмерная графика

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

Последнее обновление: 13.03.2016

Работать с графикой в принципе очень интересно, но работать с трехмерной - особенно интересно. И WPF предлагает нам удобный инструментарий для этого. Конечно, создавать суперсложные трехмерные сцены или игры на WPF - очень не простой процесс, и лучше для этого выбрать DirectX, OpenGl, либо специально заточенные под это фреймворки и движки на подобие Unity, Monogame и т.д.. Однако для относительно несложных в том числе бизнес-приложений трехмерные возможности WPF вполне сойдут.

Для создания трехмерной сцены в приложении WPF требуется несколько компонентов:

  • Окно просмотра (Viewport3D), которое и содержит трехмерную сцену.

  • Сам объект или геометрия.

  • Камера, которая устанавливает, как сцена или объект будет отображаться.

  • Освещение, которое и содержит трехмерную сцену.

  • Материал, который вместе с освещением определяет внешний вид трехмерного объекта.

Итак, контейнером верхнего уровня для трехмерной сцены является объект Viewport3D. Формально это такой же объект со всеми свойствами, как кнопка или текстовое поле, которое мы можем позиционировать на форме как угодно.

Для отображения трехмерной сцены в Viewport3D надо установить камеру с помощью свойства Camera. Без камеры мы не сможем лицезреть трехмерные объекты.

Для добавления самих трехмерных объектов в Viewport3D предусмотрено свойство Children, в котором определяются один или несколько объектов ModelVisual3D. А каждый из этих объектов ModelVisual3D, который добавляется в Viewport3D, имеет свойство Content. Это свойство принимает в качестве значения один объект GeometryModel3D, либо объект Model3DGroup, который содержит группу объектов GeometryModel3D, которые уже непосредственно устанавливают форму трехмерного объекта.

Рассмотрим использование Viewport3D и создание простейшей трехмерной фигуры:

<Window x:Class="_3DApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_3DApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="300">
    <Grid>
        <Viewport3D>
            <Viewport3D.Camera>
                <!--Установка камеры - перспективная проекция-->
                <PerspectiveCamera Position="0,0,2" LookDirection="0,0,-2" />
            </Viewport3D.Camera>
            <Viewport3D.Children>
                <ModelVisual3D>
                    <ModelVisual3D.Content>
                        <!--Установка освещения - прямой свет-->
                        <DirectionalLight Color="White" Direction="-1,-1,-2" />
                    </ModelVisual3D.Content>
                </ModelVisual3D>
                <ModelVisual3D>
                    <ModelVisual3D.Content>
                        <GeometryModel3D>
                            <!--Определяем геометрию объекта-->
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D Positions="-0.5,0,0 0,0.5,0 0.5,0,0" TriangleIndices="0, 2,1" />
                            </GeometryModel3D.Geometry>
                            <!--Установка материала - красный цвет-->
                            <GeometryModel3D.Material>
                                <DiffuseMaterial Brush="Red" />
                            </GeometryModel3D.Material>
                        </GeometryModel3D>
                    </ModelVisual3D.Content>
                </ModelVisual3D>
            </Viewport3D.Children>
        </Viewport3D>
    </Grid>
</Window>

Фактически в этом коде мы можем выделить четыре узловые части:

  1. Определение камеры. Без камеры мы не сможем увидеть объект

  2. Определение источника света.

  3. Определение самого трехмерного объекта

  4. Определение материала (цвета) этого объекта

В итоге мы получим треугольник:

Трехмерная сцена и Viewport3D в WPF

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

Среди свойств Viewport3D следует отметить свойство ClipToBounds, которое по умолчанию равно True. Из-за этого содержимое Viewport3D растягивается по горизонтали и вертикали, и если какая-то часть выходит за границы Viewport3D, то ее не видно. Если же свойство ClipToBounds, то трехмерный объект накладыватся поверх смежных элементов. Данный эффект можно увидеть, если, например, задать отступ для Viewport3D:

<Grid>
    <Viewport3D ClipToBounds="False" Margin="0 40 0 0">

Теперь рассмотрим по отдельности все части определени трехмерной сцены.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850