关注知识点:
一、剪切ClipToBounds="True"的改动实现效果
以上设置不剪切边界,并设置镜头位置Position="1,0.5,6"右移,则视野里3D模型会偏左移出边界。
二、ViewBox包含Viewport3D布局
- 内容装饰器ViewBox包含唯一Child的UIElement元素,而Viewport3D继承FrameworkElement,符合要求,ViewBox.Stretch属性已设置子内容适用父空间方式
- 另当Viewport3D为布局元素(如 Canvas)的内容包含时,可通过设置其 Height 和 Width 属性(继承自 FrameworkElement)来指定 Viewport3D 的大小。
三、3D旋转的选择方式
- RotateTransform3D类除了设置绕坐标旋转,还可以另外设置RotateTransform3D.Rotation的Rotation3D值。Rotation3D继承动画抽象类Animatable,子类有绕轴旋转AxisAngleRotation3D和四元旋转QuaternionRotation3D (高深吧,不在此讨论范围,见http://blog.csdn.net/candycat...)
四、3D基本模型怎么组装及显示出三维画面?
- 使用Viewport3D元素的二维布局范围内呈现包含的三维内容,其属性有摄像头Camera及Children(三维抽象类Visual3D子级的集合)
- 继承Visual3D的为 主要呈现三维模型Model3D 对象的 类:ModelVisual3D 、在指定的三维视区边界内呈现二维子对象:Viewport2DVisual3D、抽象三维元素的基类UIElement。
- 而三维模型Model3D 子类有 使用指定的 Material 呈现 Geometry3D的:GeometryModel3D、应用到三维场景的照明的:Light基类(包含AmbientLight/DirectionalLight/PointLightBase)、允许使用许多 三维 模型作为一个单元的:Model3DGroup(示例用的)。
- 抽象基类三维几何Geometry3D类 的子类只有三维三角形基元MeshGeometry3D(示例用的)。
- 通过以上的元素就这样简单组合三维体:使用MeshGeometry3D和material组成一个GometryModel3D的三维几何模型,接下来其或光源Light作为基础三维模型赋值到一个三维可视模型ModelVisual3D单元的内容属性上,接下来可使用多个单元ModelVisual3D组合成一个大的场景ModelVisual3D。例如,使用 Model3D 对象来构建一辆汽车的模型;并使用十个 ModelVisual3D 对象在您的场景中放置十辆汽车。
- 以上的场景ModelVisual3D与摄像头Camera组成Viewport3D显示出来。如有三维变换可在ModelVisual3D的Transform属性上设置。
五、滑块值改变事件驱动及演示版动画值的参数更新
- 整个示例画面更新是由滑块值改变事件驱动的,具体改变哪些元素见代码。
- 需要注意的是每次滑块值变动就获取当前页面下演示版动画时钟当前值ExampleStoryboard.GetCurrentTime(),重新启动Storyboard.Begin()的演示版中的动画,并重新定位操作Storyboard.Seek() 。
- 此处对立方体ModelVisual3D的移动变换中OffsetX值 进行帧动画,在滑块值变化后再次对帧动画中的帧控制点重新赋值,并进行动画时钟更新。
六、立方体X轴移动值的帧动画触发设置问题。
-
为什么要在页面触发?
- 作为页面下同一演示板的一个帧动画,方便随 动画时钟一起更新重定位。
- 其实也可以把帧动画移到在Viewport元素下演示板中触发,不过需要在滑块值改变事件中单独定义此演示板时钟重新进行KeySpline的控制点参数定位。(见代码我后台注释部分)。
-
对演示板时钟操作留意项
- Storyboard.Seek 方法 (FrameworkElement, TimeSpan, TimeSeekOrigin):将此 Storyboard 定位到指定的位置。 Storyboard 在时钟下一次走动时执行请求的定位操作。
- 此方法将演示图板时钟的 CurrentState 更改为 Active。 在下次处理计时周期之前,此方法不会对计时树产生任何影响。 在此之前也不会引发相应的事件,这是其副作用。
- 若要以交互方式控制此演示图板,在调用交互方法时所使用的 containingObject 参数必须与在启动演示图板的框架元素(此处为ExampleStoryboard.Begin(this, true);)时使用的相应参数相同。(另外改变立方体触发代码位置时都需要设置BeginStoryBoard的Name值,否则报错,详细见后台注释代码,注意哪个故事板Storyboar.Begin(哪个BeginStoryBoard.Name))
- 如果使可控演示图板可以控制,则可以对它执行暂停、继续、定位、停止和移除操作。 若要使演示图板在代码中可以控制,必须使用该演示图板的 Begin 方法的适当重载并指定 true 使之可以控制。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。