В прошлой теме в примере в кубом мы использовали вращение - связывали значение движения ползунка с углом поворота куба. Для трехмерных объектов доступны в принципе те же самые трансформации, что и для объектов двухмерных. Мы можем применить трансформацию как на уровне элемента ModelVisual3D, так и на уровне элемента GeometryModel3D.
Для вращения применяется трансформация RotateTransform3D:
<ModelVisual3D.Transform> <RotateTransform3D> <RotateTransform3D.Rotation> <AxisAngleRotation3D x:Name="rotate" Axis="0 1 0" Angle="30" /> </RotateTransform3D.Rotation> </RotateTransform3D> </ModelVisual3D.Transform>
Свойство Axis задает ось вращения. Поскольку координаты X и Z имеют 0, куб будет вращаться только вокруг оси Y. Но мы можем вращать
сразу вокруг нескольких осей как бы по-диагонали, установив свойство, например, так: Axis="1 1 0"
. А свойство Angle
определяет угол, на который поворачивается объект. По умолчанию он равен 0.
Для перемещения применяется трансформация TranslateTransform3D:
<ModelVisual3D.Transform> <TranslateTransform3D x:Name="translate" OffsetZ="0" /> </ModelVisual3D.Transform>
Код ползунка, устанавливающего перемещение по оси Z, мог бы выглядеть так:
<Slider Minimum="-10" Maximum="10" Value="{Binding ElementName=translate, Path= OffsetZ}" />
Эта трансформация имеет свойства OffsetX, OffsetY и OffsetZ, устанавливающих перемещение объекта вдоль осей X,Y и Z соответственно.
Для масштабирования применяется трансформация ScaleTransform3D:
<ModelVisual3D.Transform> <ScaleTransform3D x:Name="scale" ScaleX="0.8" /> </ModelVisual3D.Transform>
Эта трансформация имеет свойства ScaleX, ScaleY и ScaleZ, позволяя масштабировать объект вдоль осей X,Y и Z соответственно.
Также имеется трансформация MatrixTransform3D, которая с помощью свойства Matrix позволяет задать трансформацию объекта.
Кроме того, мы можем комбинировать несколько трансформаций вместе, поместив их в объект Transform3DGroup.
<ModelVisual3D.Transform> <Transform3DGroup> <RotateTransform3D> <RotateTransform3D.Rotation> <AxisAngleRotation3D x:Name="rotate" Axis="0 1 0" Angle="30" /> </RotateTransform3D.Rotation> </RotateTransform3D> </Transform3DGroup> </ModelVisual3D.Transform>
WPF предоставляет нам специальные классы для анимации в трехмерной сцене. Такие анимации могут быть полезны, например, если мы хотим вращать камеру вокруг 3D-объекта. В частности, WPF предоствляет специальные классы анимаций по ключевым кадрам, которые могут применяться к трехмерным структурам: Point3DAnimationUsingKeyFrames и Vector3DAnimationUsingKeyFrames:
<Window x:Class="_3DApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:_3DApp" mc:Ignorable="d" Title="MainWindow" Height="250" Width="350"> <Window.Triggers> <EventTrigger RoutedEvent="Window.Loaded"> <BeginStoryboard> <Storyboard> <Point3DAnimationUsingKeyFrames Storyboard.TargetName="camera" Storyboard.TargetProperty="Position"> <LinearPoint3DKeyFrame Value="0,0.5,3.5" KeyTime="0:0:4"/> <LinearPoint3DKeyFrame Value="-0.3,0.5,3.4" KeyTime="0:0:8"/> <LinearPoint3DKeyFrame Value="-0.5,0.5,3.4" KeyTime="0:0:12"/> <LinearPoint3DKeyFrame Value="-0.2,0.5,3.3" KeyTime="0:0:15"/> </Point3DAnimationUsingKeyFrames> <Vector3DAnimationUsingKeyFrames Storyboard.TargetName="camera" Storyboard.TargetProperty="LookDirection"> <LinearVector3DKeyFrame Value="0.1,0,-3.5" KeyTime="0:0:4"/> <LinearVector3DKeyFrame Value="0.2,0,-3.5" KeyTime="0:0:10"/> <LinearVector3DKeyFrame Value="0.3,0,-3.2" KeyTime="0:0:15"/> </Vector3DAnimationUsingKeyFrames> </Storyboard> </BeginStoryboard> </EventTrigger> </Window.Triggers> <Grid> <Viewport3D> <Viewport3D.Camera> <PerspectiveCamera x:Name="camera" Position="0.5,0.5,3.5" LookDirection="0,0,-3.5" /> </Viewport3D.Camera> <Viewport3D.Children> <ModelVisual3D> <ModelVisual3D.Content> <DirectionalLight Color="White" Direction="-1,-1,-2" /> </ModelVisual3D.Content> </ModelVisual3D> <ModelVisual3D> <ModelVisual3D.Content> <GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D Positions="0,0,0 1,0,0 0,1,0 1,1,0 0,0,1 1,0,1 0,1,1 1,1,1" TriangleIndices="0,2,1 1,2,3 0,4,2 2,4,6 0,1,4 1,5,4 1,7,5 1,3,7 4,5,6 7,6,5 2,6,3 3,6,7"/> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial Brush="Blue" /> </GeometryModel3D.Material> </GeometryModel3D> </ModelVisual3D.Content> </ModelVisual3D> </Viewport3D.Children> </Viewport3D> </Grid> </Window>
В данном случае при загрузке окна будут срабатываеть определенные в нем триггеры, которые будут запускать анимацию. Здесь определено две анимации по ключевым кадрам: Point3DAnimationUsingKeyFrames - для анимации свойства Position объекта камеры и Vector3DAnimationUsingKeyFrames - для анимации вектора LookDirection.
В итоге при запуске окна мы получим перемещение камеры относительно трехмерного объекта.