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

Трехмерные преобразования

Каждый объект модели имеет свойство Transform, с помощью которого можно перемещать модель, изменять ее направление или размер. Для трехмерных преобразований используются классыTranslateTransform3D(преобразование переноса),ScaleTransform3D(масштабирование) иRotateTransform3D(поворот). WPF также предоставляет классMatrixTransform3D, который позволяет указать те же преобразования в более коротких матричных операциях.

TranslateTransform3Dперемещает все точки вModel3Dв направлении выбранного вектора смещения со свойствамиOffsetX,OffsetYиOffsetZ.

ScaleTransform3Dизменяет масштаб модели с помощью указанного вектора масштаба относительно центральной точки. По умолчаниюScaleTransform3Dрастягивает или сжимает вершины по отношению к точке отсчета (0,0,0). Однако, если преобразуемая модель строится не от начала координат, то при ее масштабировании от начала координат она будет находиться «не на своем месте». В то же время, если вершины модели умножаются на вектор масштабирования, операция масштабирования приведет и к преобразованию модели, и к ее масштабированию.

Трехмерную модель можно поворачивать несколькими способами. При обычном преобразовании поворота указывается ось и угол поворота вокруг этой оси. Класс RotateTransform3Dпозволяет определитьRotation3Dсо свойствомRotation. Затем для определения преобразования следует указать свойстваAxisAngleвRotation3D.

Приведем пример поворота вокруг оси yна 40 градусов.

<GeometryModel3D.Transform>

<RotateTransform3D>

<RotateTransform3D.Rotation>

<AxisAngleRotation3D Axis="0,1,0" Angle="40" />

</RotateTransform3D.Rotation>

</RotateTransform3D>

</GeometryModel3D.Transform>

Пример описания простой трехмерной сцены

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

<Window x:Class="WpfApplication1.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="MainWindow" Height="300" Width="300">

<Grid>

<!-- Viewport3D определяет поврехность и область окна куда проецируется сцена. -->

<Viewport3D ClipToBounds="True" Width="150" Height="150">

<!-- Определяем положение и направление камеры. -->

<Viewport3D.Camera>

<PerspectiveCamera Position="0,0,2" LookDirection="0,0,-1" FieldOfView="45" />

</Viewport3D.Camera>

<!-- Определяем дочернии объекты для Viewport3D -->

<Viewport3D.Children>

<!-- Устанавливаем направления и цвет источника освещения. -->

<ModelVisual3D>

<ModelVisual3D.Content>

<DirectionalLight Color="#FFFFFF" Direction="-1,-1,-1" />

</ModelVisual3D.Content>

</ModelVisual3D>

<ModelVisual3D>

<ModelVisual3D.Content>

<GeometryModel3D>

<!-- Определяем 3D объект -->

<GeometryModel3D.Geometry>

<MeshGeometry3D

TriangleIndices="0,1,2"

Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5">

</MeshGeometry3D>

</GeometryModel3D.Geometry>

<!-- Зададим материал (цвет) объекта -->

<GeometryModel3D.Material>

<MaterialGroup>

<DiffuseMaterial Brush="Blue" />

</MaterialGroup>

</GeometryModel3D.Material>

<!-- повернем объект на 40 градусов вокруг оси Y -->

<GeometryModel3D.Transform>

<RotateTransform3D>

<RotateTransform3D.Rotation>

<AxisAngleRotation3D Axis="0,1,0" Angle="40" />

</RotateTransform3D.Rotation>

</RotateTransform3D>

</GeometryModel3D.Transform>

</GeometryModel3D>

</ModelVisual3D.Content>

</ModelVisual3D>

</Viewport3D.Children>

</Viewport3D>

</Grid>

</Window>