Применение 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); } }
|