码迷,mamicode.com
首页 > Windows程序 > 详细

[Aaronyang] 写给自己的WPF4.5 笔记22 [3d交互与动画 3/4]

时间:2015-03-17 13:56:58      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

OK,前面我们的3d模型都比较囧啊,最近也看了一点ZAM了解了一下,大致至少可以做个简单的模型用来演示。

1.交互,动起来的思路

   ①修改Model3D对象的变换

   ②修改应用于ModelVisual3D对象的变换,可改变整个场景

   ③修改灯光的变换

   ④修改摄像机的变换

 

1.1 我们使用ZAM做一个球,并贴图

 打开ZAM3D软件,点击球体,然后单击选中球,然后选中材质的位图的第2个地球,拖拽到球上

技术分享技术分享技术分享

右键单击球不释放鼠标,上下调整大小,然后导出xaml,放置桌面,然后桌面会有2个文件,一个xaml一个是图片,我们把他们拷贝到项目去

技术分享  技术分享

我们新建空白窗口,放一个grid,2行,第一行放操作按钮,第二行放这个地球球体

技术分享

拷贝viewport3d代码,然后光标置于<ModelVisual3D.Content后,xaml可视化器就会出现可调整状态,你可以继续调节。

1.1 我们引入  xmlns:tools="clr-namespace:_3DTools;assembly=3DTools",学会使用TrackballDecorator

然后在Viewport3D上方加入 <tools:TrackballDecorator Grid.Row="1"> 并在Viewport3D底部加上  </tools:TrackballDecorator>

OK,运行项目,效果图如下:

技术分享

1.2 事件触发动画

我们找到变换的地方,自己加上名字rotatez,以前这里的的AxisAngleRotation3D的Axis是0 1 0 表示是绕y轴旋转,我换成了001表示绕z轴旋转。

技术分享

我们试着手动调整值,看看xaml会不会动

技术分享

OK,所以我们只要改变这两个属性的值就行了,我们增加一个按钮,增加事件触发器,增加动画

慢着,在这里发现name加不上,好吧,我们加在Model3DGroup上,Model3DGroup是继承Model3D的,所以肯定能变换。

技术分享

我表示外部触发器无法修改定义在resources中的值,所以我们只能修改Transform了,从而修改资源,这里是DynamicResource,所以每次修改都会重新变化。

   <StackPanel Orientation="Horizontal">
            <Button x:Name="autoCircle" Content="自动旋转" Width="83">
                <Button.Triggers>
                    <EventTrigger RoutedEvent="Button.Click">
                        <BeginStoryboard>
                            <Storyboard RepeatBehavior="Forever">
                                <DoubleAnimation To="360"  Duration="0:0:2" Storyboard.TargetName="Scene" Storyboard.TargetProperty="Transform.Children[2].Rotation.Angle"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </Button.Triggers>
            </Button>
            <Button x:Name="movecamera" Content="移动相机" Margin="10,0,0,0" Width="83"/>
        </StackPanel>

我们增加一个按钮,很好,F5运行吧

技术分享

       =============潇洒的版权线==========www.ayjs.net===== Aaronyang ========= AY =========== 安徽 六安 杨洋 ==========   未经允许不许转载 =========

当然这是简单的动画,好的画,用3dsmax提前录制好,触发时候是播放对应动画。不同的状态播放不同的动画。

表示移动相机我还是不太灵活,表示在blend中录制吧

技术分享

    <Storyboard x:Key="movec">
            <Point3DAnimationUsingKeyFrames Storyboard.TargetProperty="(ProjectionCamera.Position)" Storyboard.TargetName="FrontOR6">
                <EasingPoint3DKeyFrame KeyTime="0:0:0.4" Value="0.117,0.052,6.739"/>
                <EasingPoint3DKeyFrame KeyTime="0:0:0.8" Value="0.245,-0.066,6.715"/>
                <EasingPoint3DKeyFrame KeyTime="0:0:1.4" Value="-0.016,-0.114,6.741"/>
                <EasingPoint3DKeyFrame KeyTime="0:0:1.9" Value="-0.17,-0.017,6.733"/>
                <EasingPoint3DKeyFrame KeyTime="0:0:2.2" Value="0.028,0.027,6.747"/>
            </Point3DAnimationUsingKeyFrames>
            <Vector3DAnimationUsingKeyFrames Storyboard.TargetProperty="(ProjectionCamera.UpDirection)" Storyboard.TargetName="FrontOR6">
                <EasingVector3DKeyFrame KeyTime="0:0:0.4" Value="-0.006,0.999,-0.052"/>
                <EasingVector3DKeyFrame KeyTime="0:0:0.8" Value="0.023,0.998,0.062"/>
                <EasingVector3DKeyFrame KeyTime="0:0:1.4" Value="0.022,0.993,0.114"/>
                <EasingVector3DKeyFrame KeyTime="0:0:1.9" Value="0.038,0.999,0.024"/>
                <EasingVector3DKeyFrame KeyTime="0:0:2.2" Value="0.042,0.999,-0.029"/>
            </Vector3DAnimationUsingKeyFrames>
            <Vector3DAnimationUsingKeyFrames Storyboard.TargetProperty="(ProjectionCamera.LookDirection)" Storyboard.TargetName="FrontOR6">
                <EasingVector3DKeyFrame KeyTime="0:0:0.4" Value="-0.117,-0.052,-0.992"/>
                <EasingVector3DKeyFrame KeyTime="0:0:0.8" Value="-0.245,0.066,-0.968"/>
                <EasingVector3DKeyFrame KeyTime="0:0:1.4" Value="0.016,0.114,-0.994"/>
                <EasingVector3DKeyFrame KeyTime="0:0:1.9" Value="0.17,0.017,-0.986"/>
                <EasingVector3DKeyFrame KeyTime="0:0:2.2" Value="-0.028,-0.027,-1"/>
            </Vector3DAnimationUsingKeyFrames>
        </Storyboard>

增加一个按钮使用这个动画

 <Button x:Name="movecamera" Content="移动相机" Margin="10,0,0,0" Width="83">
                <Button.Triggers>
                    <EventTrigger RoutedEvent="ButtonBase.Click">
                        <BeginStoryboard Storyboard="{StaticResource movec}">
                        </BeginStoryboard>
                    </EventTrigger>
                </Button.Triggers>
            </Button>

F5运行效果:

技术分享

OK,到目前为止你应该很好的了解了WPF中的3d一些操作,下一篇,我们来说说ModelUIElement3D类,并演示3d中的命中测试,3d的面上的控件

       =============潇洒的版权线==========www.ayjs.net===== Aaronyang ========= AY =========== 安徽 六安 杨洋 ==========   未经允许不许转载 =========

       -------------------小小的推荐,作者的肯定,读者的支持。推不推荐不重要,重要的是希望大家能把WPF推广出去,别让这么好的技术消失了,求求了,让我们为WPF技术做一份贡献。-----------------

 

[Aaronyang] 写给自己的WPF4.5 笔记22 [3d交互与动画 3/4]

标签:

原文地址:http://www.cnblogs.com/AaronYang/p/4344132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!