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

Применение 3d-преобразований к отдельным элементам 3Dсцены

Для применения различных 3D-преобразований к разным элементам 3Dсцены мы должны описать эти элементы как различные 3Dмодели, то есть создать различные объекты классаModelVisual3D.

<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="303" Width="312" Loaded="Window_Loaded">

<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>

<!-- Определяем первую 3D модель -->

<ModelVisual3D x:Name="MyModel">

<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>

<!-- Определяем вторую 3D модель -->

<ModelVisual3D x:Name="MyModel2">

<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="Red"/>

</MaterialGroup>

</GeometryModel3D.Material>

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

<GeometryModel3D.Transform>

<RotateTransform3D>

<RotateTransform3D.Rotation>

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

</RotateTransform3D.Rotation>

</RotateTransform3D>

</GeometryModel3D.Transform>

</GeometryModel3D>

</ModelVisual3D.Content>

</ModelVisual3D>

</Viewport3D.Children>

</Viewport3D>

<Button Content="Поворот 1-Y" Height="23" HorizontalAlignment="Left" Margin="7,226,0,0" Name="button1" VerticalAlignment="Top" Width="87" Click="button1_Click" />

<Button Content="Поворот 2-X" Height="23" HorizontalAlignment="Left" Margin="103,226,0,0" Name="button2" VerticalAlignment="Top" Width="80" Click="button2_Click" />

<Button Content="Поворот 1-X" Height="23" HorizontalAlignment="Right" Margin="0,226,9,0" Name="button3" VerticalAlignment="Top" Width="87" Click="button3_Click" />

</Grid>

</Window>

В нашем случае каждая модель представлена всего одним полигоном. Результат приведен на рис. 12.1.

Рис. 12.1. 3D сцена из двух 3D моделей

Далее к каждой 3Dмодели можно применять свои трехмерные преобразования, как показано ниже.

private RotateTransform3D myYRotate, myXRotate;

private AxisAngleRotation3D myYAxis, myXAxis;

private Transform3DGroup myTransform1, myTransform2;

private void Window_Loaded(object sender, RoutedEventArgs e)

{

myYRotate = new RotateTransform3D();

myYAxis = new AxisAngleRotation3D();

myYAxis.Axis = new Vector3D(0, 1, 0);

myYAxis.Angle = 7;

myYRotate.Rotation = myYAxis;

myXRotate = new RotateTransform3D();

myXAxis = new AxisAngleRotation3D();

myXAxis.Axis = new Vector3D(1, 0, 0);

myXAxis.Angle = 7;

myXRotate.Rotation = myXAxis;

myTransform1 = new Transform3DGroup();

myTransform2 = new Transform3DGroup();

MyModel.Transform = myTransform1;

MyModel2.Transform = myTransform2;

}

private void button1_Click(object sender, RoutedEventArgs e)

{

myTransform1.Children.Add(myYRotate);

}

private void button2_Click(object sender, RoutedEventArgs e)

{

myTransform2.Children.Add(myXRotate);

}

private void button3_Click(object sender, RoutedEventArgs e)

{

myTransform1.Children.Add(myXRotate);

}

}