概述
在三维场景里,Camera是不可或缺的元素。和人的眼睛一样,场景中现实的内容,实际上是Camera“看到”的。
下图是在Google Sketchup里,Left视角的Camera所“看到”的内容:
和常见三维建模软件类似,在WPF的3D里,也涉及到Camera对象,在WPF里,有三种Camera:
MatrixCamera
PerspectiveCamera
OrthographicCamera
投影摄像机
上述三种Camera中,PerspectiveCamera和OrthographicCamera属于投影摄像机,它将三维空间里的物体,投影到一个平面上,而这的不同之处在于,OrthographicCamera采用正投影,而PerspectiveCamera采用透视投影,如下图所示:
因此,这两种摄像机除了具有投影摄像机的公共属性外,还分别具备各自的熟悉,对于OrthographicCamera,属性Width表明了摄像机取景框的宽度;对于PerspectiveCamera,FieldOfView表示该摄像机的水平视角。这两个属性,下文将介绍。
Position、LookDirection和UpDirection
和场景中的其他物品一样,摄像机也具备Position属性,表示摄像机在场景的具体位置;LookDirection则表示摄像机“看的”方向;而UpDirection同样是一个向量,表示摄像机顶部的方向。
例如,假设我们的眼睛是一个摄像机,那么,眼睛所在的位置(对应原点)就是Position,眼睛所看的方向,例如西北水平方向(用向量表示为-1,0,-1)为Camera的LookDirection,眼睛的顶部(也就是我们的头,用向量表示为0,1,0)为Camera的UpDirection。
当我们移动时,Position方向发生改变;当我们转身时,LookDirection发生改变;当我们抬头时,除了LookDirection,UpDirection也相应地改变成头顶所指的方向了。
NearPlaneDistance和FarPlaneDistance
NearPlaneDistance表示Camera的近端裁减,相当于Camera的盲区,当Camera和三维物品的距离小于这个值时,就不显示了;FarPlaneDistance和NearPlaneDistance相反,当Camera和三维物品的距离大于FarPlaneDistance时,就不显示。
NearPlaneDistance的默认值为0.125,FarPlaneDistance默认值为无穷远,一般的,不需要修改这两个值。
Width
Width属性是OrthographicCamera所特有的,相当于相机的取景框,Width的值越大,相机能看到的东西就越多,而显示在三维场景里的内容就越小。下图展示了同样位置的OrthographicCamera,由于Width不同,相同大小的场景中显示的内容及大小的不同。
FieldOfView
FieldOfView是PerspectiveCamera的特有属性,用来表示相机的视角。如上图所示,红色、蓝色的线代表不同的视角可视范围。其中红线代表的视角大小为α,投影屏幕离镜头的长度为F、场景空间在投影屏幕上投影的大小为d(上图中,物体的大小恰好等于红色视角的可是范围),则有d=2Ftg(α/2)。可见,场景的投影大小和相机的视角有成正比,进而可以推出,场景中的物品在同样大小的投影屏幕上投影的大小和相机的视角成反比,即相机的视角越大,能看到的场景也越大,相应的,场景中的物品越小。
人眼的视角一般为53度。