Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП Практикум по КГ (версия 6).docx
Скачиваний:
165
Добавлен:
29.05.2015
Размер:
10.09 Mб
Скачать

Задание объектов трехмерной сцены

Для задания объектов на трехмерной сцене используется класс GeometryModel3D, в котором можно определить полигональную сетку, состоящую из треугольников, с помощью классаMeshGeometry3D. Каждый треугольник в полигональной сетке представляется с помощью индексов в списке вершин. Список вершин определяется свойствомPositions, а набор примитивов определяется через свойствоTriangleIndices.

Приведем пример:

<GeometryModel3D>

<GeometryModel3D.Geometry>

<MeshGeometry3D

Positions="-1 -1 0 1 -1 0 -1 1 0 1 1 0"

TriangleIndices="0 1 2 1 3 2" />

</GeometryModel3D.Geometry>

</GeometryModel3D>

В итоге на сцене представлены два треугольника с двумя общими вершинами (с индексами «0» и «1»). В списке вершин находится четыре вершины.

При построении полигональной сетки важен порядок перечисления вершин для каждого полигона. Для видимых граней этот порядок должен идти по направлению движения часовой стрелки, для не видимых - в другую сторону. Порядок перечисления вершин позволяет вычислить нормали для полигонов, что необходимо для удаления невидимых граней и расчета освещенности. Однако нормали можно определить также вручную через свойство Normals.

Применение материалов к модели

Для определения характеристик поверхности модели приложение WPF использует абстрактный класс Material. Конкретные подклассы классаMaterialопределяют некоторые характеристики внешнего вида поверхности модели, и каждый из них предоставляет свойствоBrush(кисть), которому можно передать значениеSolidColorBrush,TileBrushилиVisualBrush.

Класс DiffuseMaterialопределяет, что кисть будет применена к модели, как если бы она была освещена рассеянным светом. Использование классаDiffuseMaterialбольше всего напоминает применение кистей непосредственно в моделях двухмерный; поверхности модели не отражают свет, как блестящие поверхности.

Класс SpecularMaterialопределяет, что кисть будет применена к модели, как если бы поверхность модели была твердой или блестящей, способной отражать блики. Можно установить степень гладкости или «глянца» текстуры, задав значение свойстваSpecularPower.

Класс EmissiveMaterialпозволяет указать, что текстура будет применена, как если бы модель излучала свет, эквивалентный цвету кисти. Это не делает модель светящейся; однако это иначе влияет на затенение, чем если бы текстура была создана с помощью классаDiffuseMaterialилиSpecularMaterial.

Для повышения производительности противоположные поверхности объекта GeometryModel3D(грани, которые невидимы, поскольку находятся на противоположной стороне модели относительно камеры) удаляются из сцены. Чтобы указать классMaterialдля применения к противоположной поверхности модели, например плоскости, задайте свойствоBackMaterialмодели.

Следующий пример кода демонстрирует применение сплошного цвета и использование полупрозрачности.

<GeometryModel3D.Material>

<DiffuseMaterial>

<DiffuseMaterial.Brush>

<SolidColorBrush Color="Cyan" Opacity="0.3"/>

</DiffuseMaterial.Brush>

</DiffuseMaterial>

</GeometryModel3D.Material>