Трехмерные преобразования в процедурном коде
Рассмотрим пример поворота объекта созданного в 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; }
|