几何图形及动画、3D模型相关知识点

扩展:

clipboard.png

  1. ProjectionCamera 类:透视和正交投影摄像机的一个抽象基类。

    1. ProjectionCamera.LookDirection 属性:获取或设置定义摄像机在世界坐标中的拍摄方向的 Vector3D。
    2. ProjectionCamera.UpDirection 属性:获取或设置定义摄像机向上方向的 Vector3D。
    3. PerspectiveCamera.FieldOfView 属性:摄像机的水平视角(以度为单位)。 默认值为 45。

clipboard.png

  1. Visual3D 类:提供可视三维对象通用的服务和属性,其中包括命中测试、坐标转换和边界框计算。与 Model3D 类不同,Visual3D 对象不能被共享或重用。

    1. Visual3D 对象被优化以成为场景节点。 例如,它们缓存边界。 应尽可能对您的场景中的对象的唯一实例使用 Visual3D 对象。
    2. 此用法与 Model3D 对象的用法相反,这些对象为优化用于共享和重用的轻量对象。 例如,使用 Model3D 对象来构建一辆汽车的模型;并使用十个 ModelVisual3D 对象在您的场景中放置十辆汽车。
    3. 通过使用 VisualTreeHelper 类上的静态方法来访问 Visual3D 服务。

clipboard.png

  1. Model3D 类:为 三维 模型提供功能。

    1. 此类对象包括 GeometryModel3D、 Light 和 Model3DGroup。
    2. 将 ModelVisual3D 类用于呈现 Model3D 对象。 您可以通过使用 Model3DGroup 组合 Model3D,从而形成一个单一模型。 您可以共享 ModelVisual3D 对象间的 Model3D 对象以使多个实例位于一个场景中。

clipboard.png

  1. ModelVisual3D 类:提供一个呈现 Model3D 对象的 Visual3D。

    1. ModelVisual3D 类具有使您能够构建 ModelVisual3D 对象树状结构的 Children 属性。
    2. ModelVisual3D 对象被优化为场景节点。 例如,它们缓存边界。 如果可能,请将 ModelVisual3D 对象用于场景中的唯一对象实例。 此用法与 Model3D 对象的用法相反,这些对象为优化用于共享和重用的轻量对象。 例如,使用 Model3D 对象来构建一辆汽车的模型;并使用十个 ModelVisual3D 对象在您的场景中放置十辆汽车。

clipboard.png

MeshGeometry3D 类:用于生成三维形状的三角形基元。

  1. 开发人员可使用 MeshGeometry3D 指定位置、法线和纹理坐标信息。 Positions 属性是必需的。
  2. 假定法线与网格基元的正面相关。环绕顺序(指定构成网格每个三角形的 Position 的顺序)确定了给定面是正面还是背面。正面三角形以逆时针顺序环绕;背面三角形以顺时针顺序环绕。
  3. MeshGeometry3D.Positions 属性:获取或设置 MeshGeometry3D 的顶点位置的集合。
  4. MeshGeometry3D.TriangleIndices 属性:获取或设置 MeshGeometry3D 的三角形索引的集合。

    1. 对于给定的三维网格而言,指定三角形的顶点位置的顺序确定了此三角形面是正面还是背面。
    2. WPF三维实现采用逆时针环绕顺序;也就是说,当从网格的正面看时,应以逆时针顺序指定用于确定正面网格三角形的位置的点。
    3. 对 TriangleIndices 属性的设置为可选操作。 如果不指定索引,则以非索引的方式绘制三角形。 每个组的三个位置将成为一个三角形。
  5. MeshGeometry3D.TextureCoordinates 属性:获取或设置 MeshGeometry3D 的纹理坐标的集合。

    1. 纹理坐标用于确定将 Material 映射到构成网格的三角形的顶点的方式。注意 如果未为 MeshGeometry3D 指定纹理坐标,则可能无法按照预期呈现其 Material。

clipboard.png

Material 类:材料的抽象基类。

材料将纹理提供给三维几何图形。 当与光源组合使用时,材料可使三维图面在场景中可见。
  1. DiffuseMaterial 类:可用于将诸如 SolidColorBrush 或 TileBrush 之类的二维画笔应用到光线漫射的三维模型。
    代码将 DrawingGroup 定义为 DrawingBrush 的内容。 DrawingBrush 设置为应用于三维平面的 DiffuseMaterial 的 Brush 属性。

ps:

  1. RenderOptions.CacheInvalidationThresholdMinimum 附加属性:获取或设置给定 DependencyObject 的缓存失效阈值最小值。一个表示缓存失效阈值最小值的 Double 值。 注册的默认值为 0.707。

    1. 此连接的属性由 TileBrush 及其派生的类型支持。 它打算与带有中间图面的画笔一起使用,比如 DrawingBrush 和 VisualBrush。 仅当 CachingHint 属性设置为 Cache 时,此属性才有效。
    2. 默认情况下,WPF 不缓存 DrawingBrush 和 VisualBrush 对象的已呈现内容。 在内容或场景中对画刷的使用均不更改的静态情况下,不缓存该内容是有利的,因为它可以节省视频内存。
    3. 通过将画笔上的 CachingHint 附加属性设置为 Cache,可以使用图块画笔对象的缓存版本来提高性能。
    4. CacheInvalidationThresholdMinimum 和 CacheInvalidationThresholdMaximum 属性值是相对大小值,可确定由于缩放比例更改而应重新生成 TileBrush 对象的时间。 例如,当 CacheInvalidationThresholdMinimum 属性设置为 0.5 时,仅当 TileBrush 的缓存大小缩小为小于当前缓存大小的一半时,才需要重新生成。
  2. RenderOptions.CachingHint 附加属性:一个指示应尽可能缓存呈现内容的值。注册的默认值为Unspecified 。

clipboard.png

  1. TileBrush 类:描述使用一个或多个图块绘制区域的方法。

    1. TileBrush 的派生类定义用于绘制区域的图块的内容。 例如,可以通过 ImageBrush 类并使用图像来绘制区域。
    2. 使用 TileBrush 可控制绘制区域的方式。若要使用图像来绘制,请使用 ImageBrush。若要通过绘图来绘制,请使用 DrawingBrush。若要使用 Visual 来绘制,请使用 VisualBrush。
    3. 您使用 TileBrush 绘制某个区域时,需要使用三个组件:内容、图块和输出区域。可以使用 Viewbox 属性指定 TileBrush 内容的位置和尺寸。

      1. 如果画笔为 ImageBrush,则此内容为图像。 ImageSource 属性指定 ImageBrush 的内容。
      2. 如果画笔为 DrawingBrush,则此内容为绘图。 Drawing 属性指定 DrawingBrush 的内容。
      3. 如果画笔为 VisualBrush,则此内容为可视元素。 Visual 属性指定 VisualBrush 的内容。
      4. 图块:TileBrush 可生成一个或多个图块。 默认情况下,画笔的内容会拉伸以填充单个图块,该图块也会拉伸以填充输出区域。 Viewport 属性用于为 TileBrush 指定基本图块的大小和位置。 ViewportUnits 属性决定 Viewport 的大小和位置是否是相对于输出区域(默认行为)而言,或者其大小和位置是否为绝对值。
      5. 输出区域:输出区域是画笔绘制的区域,例如 Ellipse 的 Fill 或 Button 的 Background。
      6. TileBrush.Viewport 属性:获取或设置 TileBrush 的基本图块的位置和尺寸。
      7. TileBrush.Viewbox 属性:获取或设置 TileBrush 图块中内容的位置和尺寸。
  2. VisualBrush 类:使用 Visual 绘制区域。

    1. 指定 VisualBrush 的 Visual 内容有两种方法。创建一个新 Visual,并使用它来设置 VisualBrush 的 Visual 属性。
    2. 使用现有 Visual,这会创建目标 Visual 的重复图像。 然后可以使用 VisualBrush 来创建一些有趣的效果,例如反射和放大。
    3. VisualBrush 在所有画笔中功能最多、最强大,它使用 Visual 来绘制一个区域。 Visual 是一种低级别的图形类型,用作很多有用的图形组件的上级。 例如, Window、 FrameworkElement 和 Control 类都是 Visual 对象的类型。
  3. DrawingBrush 类:用 Drawing 绘制区域,其中可以包括形状、文本、视频、图像或其他绘图。下面列出了不同类型的 Drawing 对象。

    1. GeometryDrawing – 绘制形状。
    2. ImageDrawing – 绘制图像。
    3. GlyphRunDrawing – 绘制文本。
    4. VideoDrawing – 播放音频或视频文件。
    5. DrawingGroup – 绘制其他绘图。 使用绘图组可以将其他绘图组合为一个复合绘图。

clipboard.png
DrawingVisual 类:是一个可视对象,可用于在屏幕上呈现向量图形。 内容由系统保存。

  1. 此类之所以被视为轻量类,是因为它不提供布局、输入、焦点或事件处理功能,从而能够改善其性能。 因此,绘图最适于背景和剪贴画。
  2. 为了使用 DrawingVisual 对象,需要为这些对象创建一个宿主容器。 该承载容器对象必须从 FrameworkElement 类中派生,该类可提供 DrawingVisual 类不支持的布局和事件处理支持。 承载容器对象不显示任何可视属性,因为该对象的主要作用是包含子对象。
  3. 当您为可视对象创建宿主容器对象时,需要在 VisualCollection 中存储可视对象引用。 使用 Add 方法可以将可视对象添加到宿主容器中。
  4. 创建 DrawingVisual 对象:以通过检索对象的 DrawingContext 并在其中进行绘制来添加文本、图形或图像内容。 通过调用 DrawingVisual 对象的 RenderOpen 方法来返回 DrawingContext。
  5. 为 FrameworkElement 成员创建重写项:主容器对象负责管理它的可视对象集合。 这需要宿主容器为派生的 FrameworkElement 类实现成员重写:GetVisualChild:从子元素集合返回指定索引处的子级。VisualChildrenCount:获取此元素内部的可视子元素的数目。
  6. 提供命中测试支持:可以为宿主容器创建事件处理例程,此例程可以捕获鼠标事件,如松开鼠标左键。 然后事件处理例程可以通过调用 HitTest 方法来执行命中测试。

clipboard.png

Transform3D 类:为所有三维转换(包括平移、旋转和缩放转换)提供父类。

  1. 使用 MatrixTransform3D 类可以创建从 RotateTransform3D、 TranslateTransform3D 和 ScaleTransform3D 类无法获取的转换。
  2. AffineTransform3D 类:从中派生所有具体的仿射三维转换(转换、旋转和缩放转换)的基类。

    1. ScaleTransform3D 类:将定义在该中心点的 x、y 和 z 方向上的缩放比例。ScaleX 值为 1.5 时,会将对象拉伸到其原始宽度的 150%。
    2. RotateTransform3D 类:

      1. 二维 中的旋转通常由两个参数组成:旋转一个或一组对象时所围绕的点和决定旋转量的值(以度或弧度为单位)。 在三维中,必须指定 Vector3D 而不是旋转时所围绕的点。
      2. 三维中的旋转在经动画处理后变得更加复杂。要使用 RotateTransform3D 对三维旋转进行动画处理,可以对 AxisAngleRotation3D 的 Angle 或 Axis 属性进行动画处理,或为转换指定 QuaternionRotation3D。
      3. AxisAngleRotation3D 类:表示绕指定轴进行指定角度的三维旋转。

ps:PresentationOptions:Freeze 特性
将包含 Freezable 元素上的 IsFrozen 状态设置为 true。默认行为是: IsFrozen

  1. Freeze 特性是在 http://schemas.microsoft.com/... XML 命名空间中定义的唯一一个特性或其他编程元素。
  2. 处理 Freeze 特性的能力专门内置于为编译的应用程序处理 XAML 的 XAML 处理器中。 该特性不受任何类的支持,而且特性语法既不可以扩展,也不可以修改。 如果您要实现自己的 XAML 处理器,可以在加载时选择处理 Freezable 元素的 Freeze 特性的同时,并行 WPF XAML 处理器的冻结行为。

clipboard.png

Path 类 :绘制一系列相互连接的直线和曲线。

  1. Path 对象可以绘制闭合或开放的形状、多个形状,甚至曲线形状。
  2. 与 Line 和 Polyline 对象不同,可以使用此对象来绘制曲线。 有关 Path 元素支持的形状的说明,请参见 Data 属性。
  3. Paht.Data属性:获取或设置指定要绘制的形状的 Geometry。
  4. 若要绘制简单形状,请使用 EllipseGeometry、 LineGeometry 和 RectangleGeometry 对象。 若要绘制曲线、弧形或复杂形状,请使用 PathGeometry 对象。 若要创建复合几何图形,请使用 GeometryGroup。 若要组合几何图形,请使用 CombinedGeometry。

RadioButton玻璃效果

按钮的ControlTemplate控件模板下Grid容器,包含、内方框、玻璃画刷方框。分别进行鼠标进出、选择、未选择、焦点状态的属性值动画变换,组合形成玻璃样式按钮。

clipboard.png

外方框处理:

<Rectangle x:Name="outerRectangle" HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch" Stroke="{TemplateBinding Background}" 
      RadiusX="20" RadiusY="20" StrokeThickness="5" Fill="Transparent" />

触发器的鼠标进入故事版动画:方框线圆角RadiusX、Y值变化。同理鼠标退出值变化相反。

<EventTrigger RoutedEvent="Mouse.MouseEnter">
                                <EventTrigger.Actions>
                                    <BeginStoryboard Name="mouseEnterBeginStoryboard">
                                        <Storyboard>
       <DoubleAnimation 
                        Storyboard.TargetName="outerRectangle"
                        Storyboard.TargetProperty="RadiusX"
                        From="20" To="0" Duration="0:0:0.5" />

                                            <DoubleAnimation 
                        Storyboard.TargetName="outerRectangle"
                        Storyboard.TargetProperty="RadiusY"
                        From="20" To="0" Duration="0:0:0.5" />                                 
                                        

clipboard.png

内方框:框线设为透明,填充为背景色,

<Rectangle x:Name="innerRectangle" HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" Stroke="Transparent" StrokeThickness="20" 
        Fill="{TemplateBinding Background}" RadiusX="20" RadiusY="20" />

当选中是触发透明度为0,当未选中时,透明度为1:

<DoubleAnimation
                        Storyboard.TargetName="innerRectangle"
                        Storyboard.TargetProperty="Opacity"
                        To="0" Duration="0:0:0.5" />

玻璃方框,其画刷为玻璃样着色

<Rectangle x:Name="glassCube" HorizontalAlignment="Stretch" 
                VerticalAlignment="Stretch"
                StrokeThickness="2" RadiusX="10" RadiusY="10" Opacity="0" 
                Fill="{StaticResource MyGlassBrushResource}"
                RenderTransformOrigin="0.5,0.5">
                                <Rectangle.Stroke>
                                    <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                                        <LinearGradientBrush.GradientStops>
                                            <GradientStop Offset="0.0" Color="LightBlue" />
                                            <GradientStop Offset="1.0" Color="Gray" />
                                        </LinearGradientBrush.GradientStops>
                                    </LinearGradientBrush>
                                </Rectangle.Stroke>
                                <Rectangle.RenderTransform>
                                    <ScaleTransform x:Name="glassCubeScaleTransform" />
                                </Rectangle.RenderTransform>
                                <Rectangle.BitmapEffect>
                                    <BevelBitmapEffect />
                                </Rectangle.BitmapEffect>
                            </Rectangle>

线变玻璃画刷

<GradientStopCollection x:Key="MyGlassGradientStopsResource"
      presentationOptions:Freeze="True" >
            <GradientStop Color="WhiteSmoke" Offset="0.2" />
            <GradientStop Color="Transparent" Offset="0.4" />
            <GradientStop Color="WhiteSmoke" Offset="0.5" />
            <GradientStop Color="Transparent" Offset="0.75" />
            <GradientStop Color="WhiteSmoke" Offset="0.9" />
            <GradientStop Color="Transparent" Offset="1" />
        </GradientStopCollection>

        <LinearGradientBrush x:Key="MyGlassBrushResource" 
      StartPoint="0,0" EndPoint="1,1" Opacity="0.75" 
      GradientStops="{StaticResource MyGlassGradientStopsResource}"
      presentationOptions:Freeze="True"  />

鼠标进入或退出时玻璃方框透明度变化0-1动画。并且进行缩放ScaleX、Y值变化动画

<DoubleAnimation
                        Storyboard.TargetName="glassCube"
                        Storyboard.TargetProperty="Opacity"
                        From="0" To="1" Duration="0:0:0.1" />

RadioButton的内容显示xaml:
RadioButton 控件没有任何命名的部件。控件模板直接去掉了原圆点显示,
ContentPresenter.Content直接绑定到模板自身的Content内容属性

<DockPanel>
                                <ContentPresenter x:Name="myContentPresenter" Margin="15" 
                  Content="{TemplateBinding  Content}" TextBlock.Foreground="Black" />
                            </DockPanel>

当为成为焦点时设置属性:

<Trigger Property="IsFocused" Value="true">
    <Setter Property="Rectangle.Opacity" Value="1" TargetName="glassCube" />
    <Setter Property="Rectangle.Opacity" Value="1" TargetName="innerRectangle" />
</Trigger>

李志玮
22 声望34 粉丝

求索~~


引用和评论

0 条评论