引言
现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象。
那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当然还有体感游戏等等。
3D 用来增加视觉效果,给人以更加直观,真实的感觉。
3D如此美妙,那我们在WPF中又该从何处入手开启我们的3D编程旅程?
WPF中3D开发技术的基础知识应该有以下几点:
- 3D开发基础知识
- WPF中3D开发的基础元素(Elements)
- WPF中3D变换和动画
- 常用辅助类
3D开发基础知识
坐标系 Coodinate System
WPF中二维图形的坐标系将原点定位在呈现区域(通常是屏幕)的左上角。 在二维系统中,x 轴上的正值朝右,y 轴上的正值朝下。而在三维坐标系中,原点位于呈现区域的中心,x 轴上的正值朝右,但是 y 轴上的正值朝上,z 轴上的正值从原点向外朝向观察者。传统的二维和三维坐标系表示形式如下图
由这些轴定义的空间是三维对象在 WPF 中的固定参考框架。
当您在该空间中生成模型并创建光源和照相机以查看这些模型时,一定要在向每个模型应用变换时,将固定参考框架或“全局空间”与您为该模型创建的局部参考框架区分开。
另请记住,根据光源和照相机设置,全局空间中的对象可能会看上去完全不同或者根本不可见,但是照相机的位置不会改变对象在全局空间中的位置。
3D的世界都是三角形的王国
如下图:
在3D的世界里所有的东西都是用一些列的“三角形”来描述的。那你一定会问为什么是“三角形”?
原因是三角形是用来描述一个平面的最细微的几何体,渲染引擎能够依据每个三角形的材质以及场景中的灯光角度来计算它的颜色。
其实就是三点确定一个平面,在一个平面上做计算最简单,考虑的因素最少。如果用三维空间中大于三个点来做渲染基本单位,那么如果这些点不在同一个平面上的话,渲染计算是相当复杂的。
3D 对象的表面叫做网格(Mesh),一个网格是由许多3D 点来定义的,这些点叫做顶点(vertices)。这些顶点通过缠绕模式(winding pattern)连接在一起组成一个一个的三角形(facet)(如下图箭头所示)。
三角形(facet)又分为“前”和“后”两面,能看到的部分为前面,看不到的部分为后面。
那怎么判定是前面还是后面?
如果三角形的三个点顺时针方向组成的面那么这个面就是前面。如下图
按照0,1,2的顺序三个点组成了的这个面是上面我们可以看到
目前主流(Direct3D and/or OpenGL)都会把三角形分为两个面(前面和后面)。
为帮助大家记忆(facet)“前面”的三维坐标,大拇指是Z+的方向正对着我们(及前面图示中Up方向),食指是y+方向,而中指是Y+方向。(+表示正数的方向)
WPF 3D的关键元素(Elements)
3D 画布
要画画总的有个画布,WPF中呈现3D也需要一个类似功能的东西。Viewport3D(投影3D场景的平面)是WPF中的3D画布,类于2D中的Canvas。其实WPF中也有一个名字开起来类似的东东Viewbox ,不过和3D没啥关系,它处理的都是2D的。
1 2 3 |
|
该图形系统将 Viewport3D 视为一个像 WPF 中的许多其他元素一样的二维可视化元素。 Viewport3D充当三维场景中的窗口(即视区)。 更准确地说,它是三维场景所投影到的图面。
相机
处理二维对象的开发人员习惯于将绘图基元置于二维屏幕上。 当您创建三维场景时,一定要记住您实际上是要创建三维对象的二维表示形式。 由于三维场景的外观会因观察者的观察位置不同而异,因此您必须指定观察位置。而观察位置就是由相机(Camera 类)来为三维场景指定的。
另一种理解三维场景在二维图上的描述方法就是,将3D场景投影到一个2D平面的表面。如下图:
从坐标系的角度来看下我们的