几何图形及动画、3D模型相关知识点
扩展:
-
ProjectionCamera 类:透视和正交投影摄像机的一个抽象基类。
- ProjectionCamera.LookDirection 属性:获取或设置定义摄像机在世界坐标中的拍摄方向的 Vector3D。
- ProjectionCamera.UpDirection 属性:获取或设置定义摄像机向上方向的 Vector3D。
- PerspectiveCamera.FieldOfView 属性:摄像机的水平视角(以度为单位)。 默认值为 45。
-
Visual3D 类:提供可视三维对象通用的服务和属性,其中包括命中测试、坐标转换和边界框计算。与 Model3D 类不同,Visual3D 对象不能被共享或重用。
- Visual3D 对象被优化以成为场景节点。 例如,它们缓存边界。 应尽可能对您的场景中的对象的唯一实例使用 Visual3D 对象。
- 此用法与 Model3D 对象的用法相反,这些对象为优化用于共享和重用的轻量对象。 例如,使用 Model3D 对象来构建一辆汽车的模型;并使用十个 ModelVisual3D 对象在您的场景中放置十辆汽车。
- 通过使用 VisualTreeHelper 类上的静态方法来访问 Visual3D 服务。
-
Model3D 类:为 三维 模型提供功能。
- 此类对象包括 GeometryModel3D、 Light 和 Model3DGroup。
- 将 ModelVisual3D 类用于呈现 Model3D 对象。 您可以通过使用 Model3DGroup 组合 Model3D,从而形成一个单一模型。 您可以共享 ModelVisual3D 对象间的 Model3D 对象以使多个实例位于一个场景中。
-
ModelVisual3D 类:提供一个呈现 Model3D 对象的 Visual3D。
- ModelVisual3D 类具有使您能够构建 ModelVisual3D 对象树状结构的 Children 属性。
- ModelVisual3D 对象被优化为场景节点。 例如,它们缓存边界。 如果可能,请将 ModelVisual3D 对象用于场景中的唯一对象实例。 此用法与 Model3D 对象的用法相反,这些对象为优化用于共享和重用的轻量对象。 例如,使用 Model3D 对象来构建一辆汽车的模型;并使用十个 ModelVisual3D 对象在您的场景中放置十辆汽车。
MeshGeometry3D 类:用于生成三维形状的三角形基元。
- 开发人员可使用 MeshGeometry3D 指定位置、法线和纹理坐标信息。 Positions 属性是必需的。
- 假定法线与网格基元的正面相关。环绕顺序(指定构成网格每个三角形的 Position 的顺序)确定了给定面是正面还是背面。正面三角形以逆时针顺序环绕;背面三角形以顺时针顺序环绕。
- MeshGeometry3D.Positions 属性:获取或设置 MeshGeometry3D 的顶点位置的集合。
-
MeshGeometry3D.TriangleIndices 属性:获取或设置 MeshGeometry3D 的三角形索引的集合。
- 对于给定的三维网格而言,指定三角形的顶点位置的顺序确定了此三角形面是正面还是背面。
- WPF三维实现采用逆时针环绕顺序;也就是说,当从网格的正面看时,应以逆时针顺序指定用于确定正面网格三角形的位置的点。
- 对 TriangleIndices 属性的设置为可选操作。 如果不指定索引,则以非索引的方式绘制三角形。 每个组的三个位置将成为一个三角形。
-
MeshGeometry3D.TextureCoordinates 属性:获取或设置 MeshGeometry3D 的纹理坐标的集合。
- 纹理坐标用于确定将 Material 映射到构成网格的三角形的顶点的方式。注意 如果未为 MeshGeometry3D 指定纹理坐标,则可能无法按照预期呈现其 Material。
Material 类:材料的抽象基类。
材料将纹理提供给三维几何图形。 当与光源组合使用时,材料可使三维图面在场景中可见。
- DiffuseMaterial 类:可用于将诸如 SolidColorBrush 或 TileBrush 之类的二维画笔应用到光线漫射的三维模型。
代码将 DrawingGroup 定义为 DrawingBrush 的内容。 DrawingBrush 设置为应用于三维平面的 DiffuseMaterial 的 Brush 属性。
ps:
-
RenderOptions.CacheInvalidationThresholdMinimum 附加属性:获取或设置给定 DependencyObject 的缓存失效阈值最小值。一个表示缓存失效阈值最小值的 Double 值。 注册的默认值为 0.707。
- 此连接的属性由 TileBrush 及其派生的类型支持。 它打算与带有中间图面的画笔一起使用,比如 DrawingBrush 和 VisualBrush。 仅当 CachingHint 属性设置为 Cache 时,此属性才有效。
- 默认情况下,WPF 不缓存 DrawingBrush 和 VisualBrush 对象的已呈现内容。 在内容或场景中对画刷的使用均不更改的静态情况下,不缓存该内容是有利的,因为它可以节省视频内存。
- 通过将画笔上的 CachingHint 附加属性设置为 Cache,可以使用图块画笔对象的缓存版本来提高性能。
- CacheInvalidationThresholdMinimum 和 CacheInvalidationThresholdMaximum 属性值是相对大小值,可确定由于缩放比例更改而应重新生成 TileBrush 对象的时间。 例如,当 CacheInvalidationThresholdMinimum 属性设置为 0.5 时,仅当 TileBrush 的缓存大小缩小为小于当前缓存大小的一半时,才需要重新生成。
- RenderOptions.CachingHint 附加属性:一个指示应尽可能缓存呈现内容的值。注册的默认值为Unspecified 。
-
TileBrush 类:描述使用一个或多个图块绘制区域的方法。
- TileBrush 的派生类定义用于绘制区域的图块的内容。 例如,可以通过 ImageBrush 类并使用图像来绘制区域。
- 使用 TileBrush 可控制绘制区域的方式。若要使用图像来绘制,请使用 ImageBrush。若要通过绘图来绘制,请使用 DrawingBrush。若要使用 Visual 来绘制,请使用 VisualBrush。
-
您使用 TileBrush 绘制某个区域时,需要使用三个组件:内容、图块和输出区域。可以使用 Viewbox 属性指定 TileBrush 内容的位置和尺寸。
- 如果画笔为 ImageBrush,则此内容为图像。 ImageSource 属性指定 ImageBrush 的内容。
- 如果画笔为 DrawingBrush,则此内容为绘图。 Drawing 属性指定 DrawingBrush 的内容。
- 如果画笔为 VisualBrush,则此内容为可视元素。 Visual 属性指定 VisualBrush 的内容。
- 图块:TileBrush 可生成一个或多个图块。 默认情况下,画笔的内容会拉伸以填充单个图块,该图块也会拉伸以填充输出区域。 Viewport 属性用于为 TileBrush 指定基本图块的大小和位置。 ViewportUnits 属性决定 Viewport 的大小和位置是否是相对于输出区域(默认行为)而言,或者其大小和位置是否为绝对值。
- 输出区域:输出区域是画笔绘制的区域,例如 Ellipse 的 Fill 或 Button 的 Background。
- TileBrush.Viewport 属性:获取或设置 TileBrush 的基本图块的位置和尺寸。
- TileBrush.Viewbox 属性:获取或设置 TileBrush 图块中内容的位置和尺寸。
-
VisualBrush 类:使用 Visual 绘制区域。
- 指定 VisualBrush 的 Visual 内容有两种方法。创建一个新 Visual,并使用它来设置 VisualBrush 的 Visual 属性。
- 使用现有 Visual,这会创建目标 Visual 的重复图像。 然后可以使用 VisualBrush 来创建一些有趣的效果,例如反射和放大。
- VisualBrush 在所有画笔中功能最多、最强大,它使用 Visual 来绘制一个区域。 Visual 是一种低级别的图形类型,用作很多有用的图形组件的上级。 例如, Window、 FrameworkElement 和 Control 类都是 Visual 对象的类型。
-
DrawingBrush 类:用 Drawing 绘制区域,其中可以包括形状、文本、视频、图像或其他绘图。下面列出了不同类型的 Drawing 对象。
- GeometryDrawing – 绘制形状。
- ImageDrawing – 绘制图像。
- GlyphRunDrawing – 绘制文本。
- VideoDrawing – 播放音频或视频文件。
- DrawingGroup – 绘制其他绘图。 使用绘图组可以将其他绘图组合为一个复合绘图。
DrawingVisual 类:是一个可视对象,可用于在屏幕上呈现向量图形。 内容由系统保存。
- 此类之所以被视为轻量类,是因为它不提供布局、输入、焦点或事件处理功能,从而能够改善其性能。 因此,绘图最适于背景和剪贴画。
- 为了使用 DrawingVisual 对象,需要为这些对象创建一个宿主容器。 该承载容器对象必须从 FrameworkElement 类中派生,该类可提供 DrawingVisual 类不支持的布局和事件处理支持。 承载容器对象不显示任何可视属性,因为该对象的主要作用是包含子对象。
- 当您为可视对象创建宿主容器对象时,需要在 VisualCollection 中存储可视对象引用。 使用 Add 方法可以将可视对象添加到宿主容器中。
- 创建 DrawingVisual 对象:以通过检索对象的 DrawingContext 并在其中进行绘制来添加文本、图形或图像内容。 通过调用 DrawingVisual 对象的 RenderOpen 方法来返回 DrawingContext。
- 为 FrameworkElement 成员创建重写项:主容器对象负责管理它的可视对象集合。 这需要宿主容器为派生的 FrameworkElement 类实现成员重写:GetVisualChild:从子元素集合返回指定索引处的子级。VisualChildrenCount:获取此元素内部的可视子元素的数目。
- 提供命中测试支持:可以为宿主容器创建事件处理例程,此例程可以捕获鼠标事件,如松开鼠标左键。 然后事件处理例程可以通过调用 HitTest 方法来执行命中测试。
Transform3D 类:为所有三维转换(包括平移、旋转和缩放转换)提供父类。
- 使用 MatrixTransform3D 类可以创建从 RotateTransform3D、 TranslateTransform3D 和 ScaleTransform3D 类无法获取的转换。
-
AffineTransform3D 类:从中派生所有具体的仿射三维转换(转换、旋转和缩放转换)的基类。
- ScaleTransform3D 类:将定义在该中心点的 x、y 和 z 方向上的缩放比例。ScaleX 值为 1.5 时,会将对象拉伸到其原始宽度的 150%。
-
RotateTransform3D 类:
- 二维 中的旋转通常由两个参数组成:旋转一个或一组对象时所围绕的点和决定旋转量的值(以度或弧度为单位)。 在三维中,必须指定 Vector3D 而不是旋转时所围绕的点。
- 三维中的旋转在经动画处理后变得更加复杂。要使用 RotateTransform3D 对三维旋转进行动画处理,可以对 AxisAngleRotation3D 的 Angle 或 Axis 属性进行动画处理,或为转换指定 QuaternionRotation3D。
- AxisAngleRotation3D 类:表示绕指定轴进行指定角度的三维旋转。
ps:PresentationOptions:Freeze 特性
将包含 Freezable 元素上的 IsFrozen 状态设置为 true。默认行为是: IsFrozen
- Freeze 特性是在 http://schemas.microsoft.com/... XML 命名空间中定义的唯一一个特性或其他编程元素。
- 处理 Freeze 特性的能力专门内置于为编译的应用程序处理 XAML 的 XAML 处理器中。 该特性不受任何类的支持,而且特性语法既不可以扩展,也不可以修改。 如果您要实现自己的 XAML 处理器,可以在加载时选择处理 Freezable 元素的 Freeze 特性的同时,并行 WPF XAML 处理器的冻结行为。
Path 类 :绘制一系列相互连接的直线和曲线。
- Path 对象可以绘制闭合或开放的形状、多个形状,甚至曲线形状。
- 与 Line 和 Polyline 对象不同,可以使用此对象来绘制曲线。 有关 Path 元素支持的形状的说明,请参见 Data 属性。
- Paht.Data属性:获取或设置指定要绘制的形状的 Geometry。
- 若要绘制简单形状,请使用 EllipseGeometry、 LineGeometry 和 RectangleGeometry 对象。 若要绘制曲线、弧形或复杂形状,请使用 PathGeometry 对象。 若要创建复合几何图形,请使用 GeometryGroup。 若要组合几何图形,请使用 CombinedGeometry。
RadioButton玻璃效果
按钮的ControlTemplate控件模板下Grid容器,包含、内方框、玻璃画刷方框。分别进行鼠标进出、选择、未选择、焦点状态的属性值动画变换,组合形成玻璃样式按钮。
外方框处理:
<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" />
内方框:框线设为透明,填充为背景色,
<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>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。