全视角的摄像机大致需要以下功能
1 平移——拉近,缩放
这个应该是摄像机最简单的功能了,在操作上体现在玩家直接滚动鼠标滚轮来拉近和放大摄像机的距离。该操作的本质是
平移摄像机。具体做法可捕获鼠标滚轮消息,然后在该方向上进行平移(简单的坐标加减即可)
2 跟随主角
在主角进行移动的时候触发该功能,这个也比较简单,平移摄像机位置即可
3 旋转——俯仰,偏航
能否支持俯仰,偏航是判定游戏是否是全3D的一个标准,通常所说的45度锁定视角的游戏不会支持俯仰和偏航,在
GameBryo中自带的例子有俯仰和偏航的实现
4 摄像机碰撞
我们这里摄像机碰撞采用pick实现,其基本原理是以建立一条pick射线,主角坐标为射线起点,方向朝向摄像机,然后沿
射线方向找到最近的和射线相交的物件,然后把摄像机位置移动到交点处(摄像机方向不变)。这里还需要注意一点,当找
到最近的物体后,需要判断一下该交点到射线起点的长度 和 摄像机到射线起点的距离,若交点比摄像机还远,则应该直接
抛弃该点。
接下来的一个问题是,在摄像机碰撞后,拉近了摄像机和主角之间的距离,这时候如果移动摄像机,不再发生碰撞时,
摄像机应和主角保持碰撞前的距离,并且这个摄像机位置的移动不应该是跳跃式的,而应该像wow一样平滑的移动到具体的
位置。我们对该问题的解决方案是:在发生碰撞的时候,把摄像机到主角的距离保存到一个变量中,在取消碰撞时,以每帧
x的速度拉回摄像机,并且在每帧渲染的时候都检查摄像机到主角的距离是否已经补偿完毕。
在gamebryo中,地形和场景中的物件需要分开来pick。至于为什么要分开,其实很好理解,场景中的物件pick是依赖
mesh进行的,而地形则是依赖地形高度信息。
pick的另一个问题是,当和地形pick后,有时候靠近摄像机太近的部分作为摄像机nearplan被裁剪了,解决该问题的
方法是,pick地形时,把摄像机的坐标在Z轴上上移几个单位