Создание реалистичных 3D моделей с помощью WPF


    В предыдущей статье о WPF и 3D (http://www.devx.com/dotnet/Article/42370) показано, что все примеры использования относительно простых одноцветных материалов и кисти однозначно определяют цвет модели. Но WFP позволяет сделать материал с помощью кисти, которая не использует стандартные цвета. Ниже приводится список видов кисти для использования в формировании материала.



Drawing: Область и графика, которая может включать фигуры, изображения, текст и даже мультимедиа файлы.

Gradient: Область и графика с линейным и радиальным цветовым градиентом

Image: Область и графика с изображением.

Visual: Область и графика с изображением таких визуальных элементов как Кнопка, Таблицы или Метки.

Пример использования простого материала с синей кистью
<GeometryModel3D.Material>
    <DiffuseMaterial Brush="Blue"/>
</GeometryModel3D.Material>

Для более сложного материала необходимо выбирать более сложную кисть. Следующий код формирует кисть, которая отображает рисунок brick.jpg
<GeometryModel3D.Material>
    <DiffuseMaterial>
        <DiffuseMaterial.Brush>
            <ImageBrush ImageSource="brick.jpg"/>
        </DiffuseMaterial.Brush>
    </DiffuseMaterial>
</GeometryModel3D.Material>

Вот еще один пример, который создает кисти, содержащие этикетки (Label) с градиентом фона. (Такая кисть может быть довольно сложной, если она содержит сложные зрительные эффекты и элемент).

<GeometryModel3D.Material>
    <DiffuseMaterial>
        <DiffuseMaterial.Brush>
            <VisualBrush>
                <VisualBrush.Visual>
                    <Label Content="VB Helper"
                     FontWeight="Bold" FontFamily="Comic Sans MS">
                         <Label.Background>
                            <RadialGradientBrush>
                                <GradientStop Color="White"
                                 Offset="0"/>
                                <GradientStop Color="Blue"
                                 Offset="1"/>
                            </RadialGradientBrush>
                        </Label.Background>
                    </Label>
                </VisualBrush.Visual>
            </VisualBrush>
        </DiffuseMaterial.Brush>
    </DiffuseMaterial>
</GeometryModel3D.Material>

При использовании этих видов кистей, нужно сделать еще одно изменение к объекту MeshGeometry3D: вам нужно указать объекту Direct3D в какой части 3D объекта соответствует какая часть кисти.


Вы определяете отображение кисти объекта путем добавления новых TextureCoordinates атрибутов (текстурные координаты) объекта MeshGeometry3D. Этот атрибут дает координаты точки 3D в 2D пространстве текстуры. Текстура начинается с левого верхнего угла (позиция (0,0) и движется вниз по оси Y и вправо по оси X.

Например, следующий код определяет плоскость Z=1.

<MeshGeometry3D 
 Positions="-1,1,1 -1,-1,1 1,-1,1 1,1,1"
 TriangleIndices="0,1,2 0,2,3"
 TextureCoordinates="0,0 0,1 1,1 1,0"/>

Пример простого приложения TexturedCube, созданного с помощью текстур и сложных материалов и кистей.

 
Пример покрытия куба изображениями и визуальными эффектами


     Обратите внимание на работу с XAML разметкой, и как XAML создает трехмерные объекты. Вы не должны забывать, что объект GeometryModel3D как геометрические данные, определяет предмет и материал, который охватывает его. Это означает, что один материал должен применяться ко всем объектам, определеным как объект GeometryModel3D. Если у вас есть необходиомсть создать несколько объектов с различными материалами и кистями — используйте несколько GeometryModel3D

В данном примере TexturedCube использует шесть различных GeometryModel3D объектов с их собственными материалами, для формирование каждой грани куба. Каждая грань имеет своей материал.