每个3D世界基本上可以看作是sector(区段)的集合。一个sector(区段)可以是一个房间、一个立方体、或者任意一个闭合的区间。在程序内部直接存储数据会让程序显得太过死板和无趣。从磁盘上载入世界资料,会给我们带来更多的弹性,可以让我们体验不同的世界,而不用被迫重新编译程序。另一个好处就是用户可以切换世界资料并修改它们而无需知道程序如何读入输出这些资料的。
数据文件中每个三角形都以如下形式声明:
X1 Y1 Z1 U1 V1
X2 Y2 Z2 U2 V2
X3 Y3 Z3 U3 V3
坐标数据文件
到目前为止,我们所作过的都是些简单的旋转和平移。但我们的镜头始终位于原点(0,0,0)处。任何一个不错的3D引擎都会允许用户在这个世界中游走和遍 历,我们的这个也一样。实现这个功能的一种途径是直接移动镜头并绘制以镜头为中心的3D环境。这样做会很慢并且不易用代码实现。我们的解决方法如下:
1)根据用户的指令旋转并变换镜头位置。
2)围绕原点,以与镜头相反的旋转方向来旋转世界。(让人产生镜头旋转的错觉)
3)以与镜头平移方式相反的方式来平移世界(让人产生镜头移动的错觉)。
实现很简单。当左右方向键按下后,旋转变量yrot相应增加或减少。当前后方向键按下后,我们使用sine和cosine函数重新生成镜头位置。Piover180是一个很简单的折算因子用来折算度和弧度。
walkbias基本上就是当人行走时头部产生上下摆动的幅度。我们使用简单的sine正弦波来调节镜头的Y轴位置。如果不添加这个而只是前后移动的话,程序看起来就没这么棒了。
demo10
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/05/04/735746.html,如需转载请自行联系原作者