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

Задание по лабораторной работе

Создать с помощью описания XAMLтрехмерную сцену, состоящую из нескольких разноцветных объектов. Добавьте к этой сцене несколько источников света. Поместите в отчет изображение этой сцены, полученное при различных трехмерных преобразованиях. Получите разные типы проекций, результат также поместите в отчет. Самостоятельно изучите возможности работы с текстурами. Добавьте в трехмерную сцену объекты с текстурой.

12. Лабораторная работа «Трехмерные преобразования вWpf»

Цель лабораторной работы:изучить принципы построения Динамических 3Dсцен с помощью процедурного кода вWPF. Написать и протестировать программу для анимации трехмерной сцены, состоящей из нескольких объектов.

Связь процедурного кода и объектов описанных вXaml

Среди пространств имен XAML можно выделить одно, которое объявляется почти в каждом файле XAML среды выполнения Windows, — это пространство имен для элементов, которые определены в языке XAML. По соглашению собственное пространство имен языка XAML сопоставляется с префиксом "x".

Префикс "x" (собственное пространство имен языка XAML) содержит несколько программных конструкций, которые часто используются в XAML-коде. Приведем только одну:x:Name, которая задает имя экземпляра объекта времени выполнения, созданного в исполняемом коде по итогам обработки элемента, который определяет этот объект в XAML-коде. Включениеx:Nameв код XAML можно рассматривать как объявление именованных переменных в коде.

Поэтому для доступа в процедурном коде к трехмерной модели необходимо включить x:NameвModelVisual3D:

<ModelVisual3D x:Name="MyModel">

</ModelVisual3D>

Описанной MyModelможно будет далее оперировать в процедурном коде. ОбъектMyModelпринадлежит классуModelVisual3D.

Трехмерные преобразования в процедурном коде

Рассмотрим пример поворота объекта созданного в XAMLвокруг осиy. Предварительно подготовим необходимые объекты в обработчике событияLoaded.

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;

myTransform1 = new Transform3DGroup();

MyModel.Transform = myTransform1;

}

myYRotate, myYAxis, myTransform1 описываются выше как поля класса MainWindow.

Класс RotateTransform3Dотвечает за преобразование поворота. С помощью классаAxisAngleRotation3Dописывается ось, вокруг которой будет произведен поворот. СвойствоAxisописывает направление оси через объект классаVector3D. СвойствоAngleзадает угол поворота в градусах.

Далее создается объект myTransform1классаTransform3DGroup, который ставится в соответствие полюTransformкласса нашей 3D-модели. Этот класс удобно использовать для группы последовательных 3D-преобразований. ФактическиTransform3DGroup представляет собой коллекцию объектов типа Transform3D. Отметим, что на данном этапе описанное преобразование поворота и наша 3D-модель пока ни как не связаны.

Далее создадим на форме кнопку для поворота. Обработчик события этой кнопки будет выглядеть следующим образом.

private void button1_Click(object sender, RoutedEventArgs e)

{

myTransform1.Children.Add(myYRotate);

}

Таким образом, при нажатии на кнопку в коллекцию преобразований с 3D-моделью будет добавляться очередной поворот. Вторым подходом, сокращающим количество элементов коллекции, является способ более раннего связывания 3D-модели с 3D-преобразованиями. Например:

private void Window_Loaded(object sender, RoutedEventArgs e)

{

myYRotate = new RotateTransform3D();

myYAxis = new AxisAngleRotation3D();

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

myYAxis.Angle = 0;

myYRotate.Rotation = myYAxis;

myXRotate = new RotateTransform3D();

myXAxis = new AxisAngleRotation3D();

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

myXAxis.Angle = 0;

myXRotate.Rotation = myXAxis;

myTransform1 = new Transform3DGroup();

MyModel.Transform = myTransform1;

myTransform1.Children.Add(myYRotate);

myTransform1.Children.Add(myXRotate);

}

При обработке события нажатия на кнопке, в этом случае, достаточно менять параметры созданных преобразований. Например, увеличивать угол поворота.

private void button1_Click(object sender, RoutedEventArgs e)

{

myYAxis.Angle += 7;

myXAxis.Angle += 7;

}