本主题概述 Windows Presentation Foundation (WPF) 图形系统中的三维功能。通过 WPF 三维实现,开发人员可使用与该平台所提供给二维图形的相同的功能,对标记和过程代码中的三维图形进行绘制、转换和动画处理。 开发人员可以合并二维和三维图形来创建丰富的控件,提供复杂的数据图解,或者增强用户对应用程序界面的体验。WPF 支持三维的设计宗旨不是提供功能齐全的游戏开发平台。
二维容器中的三维
WPF 中的三维图形内容封装在 Viewport3D 元素中,该元素可以参与二维元素结构。与 WPF 中的许多其他内容一样,图形系统将 Viewport3D 视为二维可视化元素。Viewport3D 充当三维场景中的一个窗口(视区)。更准确地说,它是三维场景所投影到的图面。
在传统的二维应用程序中,当您需要使用 Grid 或 Canvas 之类的另一个容器元素时,可以使用 Viewport3D。 尽管您可以将 Viewport3D 与同一个场景图中的其他二维绘图对象结合使用,但是您不能在 Viewport3D 内部渗透二维和三维对象。 本主题重点讲述如何在 Viewport3D 内部绘制三维图形。
三维坐标空间
二维图形的 WPF 坐标系将原点定位在呈现区域(通常是屏幕)的左上角。在二维系统中,x 轴上的正值朝右,y 轴上的正值朝下。 但是,在三维坐标系中,原点位于呈现区域的中心,x 轴上的正值朝右,但是 y 轴上的正值朝上,z 轴上的正值从原点向外朝向观察者。
传统的二维和三维坐标系表示形式
由这些轴定义的空间是三维对象在 WPF 中的固定参考框架。当您在该空间中生成模型并创建光源和照相机以查看这些模型时,一定要在向每个模型应用变换时,将固定参考框架或“全局空间”与您为该模型创建的局部参考框架区分开。另请记住,根据光源和照相机设置,全局空间中的对象可能会看上去完全不同或者根本不可见,但是照相机的位置不会改变对象在全局空间中的位置。
照相机和投影
处理二维对象的开发人员习惯于将绘图基元置于二维屏幕上。当您创建三维场景时,一定要记住您实际上是要创建三维对象的二维表示形式。由于三维场景的外观会因观察者的观察位置不同而异,因此您必须指定观察位置。可以使用 Camera 类来为三维场景指定观察位置。
了解三维场景如何在二维图面上表示的另一种方法就是将场景描述为到观察表面上的投影。使用 ProjectionCamera,可以指定不同的投影及其属性以更改观察者查看三维模型的方式。PerspectiveCamera 指定用来对场景进行透视收缩的投影。 换言之,PerspectiveCamera 提供消失点透视。 您可以指定照相机在场景坐标系中的位置、照相机的方向和视野以及用来定义场景中“向上”方向的向量。下图阐释 PerspectiveCamera 的投影。
ProjectionCamera 的 NearPlaneDistance 和 FarPlaneDistance 属性限制照相机的投影范围。由于照相机可以位于场景中的任何位置,因此照相机实际上可能会位于模型内部或者紧靠模型,这使得很难正确区分对象。使用 NearPlaneDistance,可以指定一个距离照相机的最小距离,即,在超过该距离后将不绘制对象。 相反,使用 FarPlaneDistance,可以指定一个距离照相机的距离(即,在超过该距离后将不绘制对象),从而确保因距离太远而无法识别的对象将不包括在场景中。
照相机位置
OrthographicCamera 指定三维模型到二维可视化图面上的正投影。与其他照相机一样,它指定位置、观察方向和“向上”方向。但是,与 PerspectiveCamera 不同的是,OrthographicCamera 描述了不包括透视收缩的投影。换言之,OrthographicCamera 描述了一个侧面平行的取景框,而不是侧面汇集在场景中一点的取景框。