Программирование >>  Расширенный wf 

1 ... 9 10 11 [ 12 ] 13 14 15


Таблица 35.9. Классы 3-D

Класс

Light

Camera

Transform3D

Описание

ViewPort3D ModelVisual3D GeometryModel3D Geometry3D

Material

ViewPort3D определяет поверхность отображения объектов 3-D. Этот элемент содержит все визуальные элементы для трехмерного рисования.

ModelVisual3D содержится в ViewPort3D и содержит все визуальные элементы. Вы можете назначить трансформацию всей модели сразу.

GeometryModel3D содержится внутри ModelVisual3D и состоит из сетки и материала.

Geometry3D - абстрактный базовый класс для определения геометрических фигур. Конкретный класс, производный от Geometry3D - это MeshGeometry3D. С помощью MeshGeometry3D вы можете определять позиции треугольников для построения трехмерной модели

Material - абстрактный базовый класс для определения лицевой и изнаночной поверхности треугольников, определенный свойством MeshGeometry3D.Material и содержащийся внутри GeometryModel3D. В .NET 3.5 определено несколько классов материалов, такие как DiffuseMaterial, EmissiveMaterial и SpecularMaterial. В зависимости от типа материала освещение вычисляется по-разному. EmissiveMaterial предполагает такое вычисление освещения, которое исходит из того, что материал издает свет цвета кисти. DiffuseMaterial издает рассеянный свет, а SpecularMaterial определяет модель материала с зеркальным отражением. С классом MaterialGroup вы можете создавать комбинации, состоящие из разных материалов.

Light - абстрактный базовый класс, описывающий освещение.

Конкретные его реализации: AmbientLight, DirectionalLight,

PointLight и SpotLight. Класс AmbientLight - неестественный свет, равномерно освещает сцену. При таком свете вы не увидите граней. DirectionalLight определяет направленный свет. Примером может служить солнечный свет. Свет поступает с одной стороны, и здесь вы можете видеть грани и тени. PointLight - свет, поступающий из определенной точки и распространяющийся от нее во всех направлениях. SpotLight светит в определенном направлении. Этот свет определяет конус освещенности, так что вы можете получить отдельную ярко освещенную область.

Camera - абстрактный базовый класс для описания камеры, используемой для отображения трехмерной сцены на двумерную. Конкретные его реализации: PerspectiveCamera, OrthographicCamera и MatrixCamera. При использовании PerspectiveCamera трехмерные объекты выглядят тем меньше, чем дальше они находятся. Это отличает его от OrthographicCamera, где расстояние объекта от камеры не влияет на его размер. С помощью MatrixCamera вы можете определять вид и трансформацию матрицы.

Transform3D - абстрактный базовый класс для описания трехмерных трансформаций. Конкретные реализации: RotateTransform3D, ScaleTransform3D, TranslateTransform3D, MatrixTransform3D и Transform3DGroup. Класс TranslateTransform3D позволяет трансформировать объект в направлениях x, y и z. ScaleTransform3D позволяет изменять размер объекта. С помощью класса RotateTransform3D вы можете вращать объект вокруг осей x, y и z. Посредством Transform3DGroup можно комбинировать другие трансформации.




Рис. 35.23. Результирующий треугольник

Треугольник

Этот раздел мы начнем с простого примера 3-D. Модель 3-D состоит из треугольников, поэтому простейшая будет состоять из одного треугольника. Треугольник определяется свойством Position объекта MeshGeometry3D. Все три его точки имеют одинаковую координату z, равную -4, а координате! x/y равны -1 -1, 1 -1, и 0 1. Свойство TriangleIndices задает порядок позиций в порядке против часовой стрелки. Этим свойством вы можете определять видимую сторону треугольника. Одна сторона треугольника показывает цвет, заданный в свойстве Material класса GeometryModel3D, а другая сторона показывает свойство BackMaterial.

Камера, используемая для отображения сценария, позиционируется в точке с координатами 0,0,0, и ориентирована в направлении 0,0,-8. Смещение позиции камеры влево приводит к перемещению прямоугольника вправо и наоборот. Изменение позиции y камеры приводит к увеличению и уменьшению прямоугольника. Свет, используемый в этой сцене - AmbientLight - освещает всю сцену белым цветом. На рис. 35.23 можно видеть конечный результат.

<Window x:Class= Triangle3D.Window1

xmlns= http: schemas.microsoft.com/winfx/200 6/xaml/presentation xmlns:x= http: schemas.microsoft.com/winfx/2 00 6/xaml Title= 3D Height= 300 Width= 300 >

<Grid> <Viewport3D>

<Viewport3D.Camera>

<PerspectiveCamera Position= 0 0 0 LookDirection= 0 0 -8 /> </Viewport3D.Camera> <ModelVisual3D>

<ModelVisual3D.Content> <AmbientLight Color= White />

</ModelVisual3D.Content> </ModelVisual3D> <ModelVisual3D>

<ModelVisual3D.Content> <GeometryModel3D>

<GeometryModel3D.Geometry> <MeshGeometry3D

Positions= -1 -1 -4, 1 -1 -4, 0 1 -4 TriangleIndices= 0, 1, 2 /> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <MaterialGroup> <DiffuseMaterial> <DiffuseMaterial.Brush>

<SolidColorBrush Color= Red /> </DiffuseMaterial.Brush> </DiffuseMaterial> </MaterialGroup> </GeometryModel3D.Material> </GeometryModel3D> </ModelVisual3D.Content> </ModelVisual3D> </Viewport3D> </Grid> </Window>



Изменение освещения

На рис. 35.23 просто показан простой треугольник - этот результат вы можете получить с меньшими усилиями, используя 2-D. Однако отсюда вы можете продолжить, используя средства 3-D. Например, изменяя свет от равномерного (ambient) к локальному (spotlight) с элементом SpotLight, вы можете немедленно изменить внешний вид треугольника. При локальном освещении вы определяете позицию источника света и его направление. Указывая в качестве позиции координаты -1 1 2, вы помещаете источник света над левым углом треугольника на высоту треугольника. Отсюда свет направлен вниз и влево. Вы можете видеть, как при этом выглядит треугольник, на рис. 35.24.

<ModelVisual3D> <ModelVisual3D.Content>

<SpotLight Position= -1 1 -2 Color= White Direction= -1.5, -1, -5 />

</ModelVisual3D.Content> </ModelVisual3D>

Добавление текстур

Вместо использования кисти сплошного цвета для материала треугольника вы можете использовать другу кисть, такую как LinearGradientBrush, как показано в следующем коде XAML. Элемент LinearGradientBrush, определенный с DiffuseMaterial, задает цвета конечных точек градиента - желтый, оранжевый, красный, синий и фиолетовый. Чтобы отобразить двухмерную поверхность такого объекта, как кисть, на трехмерную геометрию, должно быть установлено свойство TextCoordinates. Свойство TextCoordinates определяет коллекцию точек 2-D, которые отображаются на позиции 3-D. На рис. 35.25 показаны двухмерные координаты кисти из примера приложения. Первая позиция в треугольнике, -1 -1, отображается на координаты кисти 0 1; позиция 1 -1, представляющая нижний правый угол, отображается на точку 1 1 кисти, имеющую фиолетовый цвет, а 0 1 отображается на 0.5 0. На рис. 35.26 изображен треугольник из материала градиентной кисти, снова с рассеянным светом.

<ModelVisual3D> <ModelVisual3D.Content> <GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D

Positions= -1 -1 -4, 1 -1 -4, 0 1 -4 TriangleIndices= 0, 1, 2 TextureCoordinates= 0 1, 1 1, 0.5 0 />

</GeometryModel3D.Geometry> <GeometryModel3D.Material> <MaterialGroup>

<DiffuseMaterial> <DiffuseMaterial.Brush>


Рис. 35.24. Изменение освещения треугольника

Рис. 35.25. Двухмерные координаты кисти


Рис. 35.26. Треугольник из материала градиентной кисти



1 ... 9 10 11 [ 12 ] 13 14 15

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика