Создание реалистичных 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 объектов с их собственными материалами, для формирование каждой грани куба. Каждая грань имеет своей материал.