Трехмерные трансформации и анимации

Последнее обновление: 13.03.2016

В прошлой теме в примере в кубом мы использовали вращение - связывали значение движения ползунка с углом поворота куба. Для трехмерных объектов доступны в принципе те же самые трансформации, что и для объектов двухмерных. Мы можем применить трансформацию как на уровне элемента 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.

В итоге при запуске окна мы получим перемещение камеры относительно трехмерного объекта.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850