一个非飞行类游戏的Camera类

来源:互联网 发布:物业管理源码 编辑:程序博客网 时间:2024/06/05 00:33

一般游戏都有一个对摄像机进行移动控制的方法,大型的3D游戏更是如此,但我看了NEHE和一些其他的场景漫游方法,都是通过旋转或移动整个场景,这样的话必然使物体在世界坐标系中的坐标发生变化,虽然在效果上来讲没什么影响,但总体给我感觉是控制不太灵活——摄像机总在某一点而只有场景的物体转动。

基于这些,我自己去写了个算摄像机位置的camera类,虽然有点属于舍近求远的做法,但控制摄像机的位置和朝向比较符合我心意……

嗯,然后说下算法思路。

 

虽然没打算做飞行游戏的camera类,但还是要引入飞机的3个方向角度来说明算法,因为没做适合飞行的,所以并没有引入滚转角(roll angle),而是只使用了偏航角(yaw angle)和俯仰角(pitch angle )。

当然,既然引入了个各种角度,那就肯定离不开各种有关三角函数的计算……我们先抛开X,Y,Z各个轴的限定,看下图:

 

 

设原点坐标为(0,0,0),要求线段L的另一个端点的坐标,假设其中一个坐标分量为C轴坐标C1,如果我们知道了L的长度和alpha还有beta角的值,C1就可以算出来:俯仰角为beta,L确定后beta值在同高度上都相等,黑色虚线为L的投影,则黑色虚线的长度L1=L×cos(beta)。

黑色虚线端点的C坐标肯定和L相等,红色虚线垂直下来的C坐标即为C1,则C1=L1×cos(alpha),整理上面的公式,得:C1 = L×cos(alpha)×cos(beta)。

由以上的思路,当我们知道具体的移动距离和X,Y,Z朝向时,就可以把X和Z的坐标求出来。

Y轴的坐标因为beta值在同高度上始终不变,所以Y=L×sin(beta)。

 

算法大概思路就是以上了,当然代码会复杂一点,因为控制镜头转向和摄像机移动都不是单纯的按照上面的公式,但因为都是基于此思路的,所以能了解此方法的话理解代码应该不成问题。

 

源码下载:

http://download.csdn.net/source/2616772

原创粉丝点击