|
|
发表于 2006-8-19 09:25:00
|
显示全部楼层
Re:请问一下在地面凹凸不平的时候行走,照相机y族怎么确
学OpenGL编3D游戏书摘要
5-1-3 取地面高度
这里产生的地面高度是随机起伏,我们在此中漫游,势必要求视点高度随地形变化而变。否则在遇到地面高度大于视点高度时,我们就要钻入地下了。下面GetHeight(…)取地面高度的函数可以获得XZ面上的任一点的高度y,可用于我们在漫游时动态改变视点高度,形成爬坡过堑的视觉效果;也可以在后面章节中往场景加入其它物体时,在高度上的定位之用。
float baiscobj::GetHeight(float x, float z) // 取地面高度
1{ float CameraX = x/MAP_SCALE; //计算在那一块
2 float CameraZ =-z/MAP_SCALE; //计算在那一块
3 int Col0 = int(CameraX); //块的列号
4 int Row0 = int(CameraZ); //块的行号
5 int Col1 = Col0 + 1; //相邻列
6 int Row1 = Row0 + 1; //相邻行
7 if (Col1 > MAP_W)Col1 = 0; //相邻列大于地块数,取首列
8 if (Row1 > MAP_W)Row1 = 0; //相邻行大于地块数,取首行
9 float h00=g_terrain[Col0 + Row0*MAP_W][1]; //获取块四角的高度
10 float h01=g_terrain[Col1 + Row0*MAP_W][1];
11 float h11=g_terrain[Col1 + Row1*MAP_W][1];
12 float h10=g_terrain[Col0 + Row1*MAP_W][1];
13 float tx =CameraX - int(CameraX); //求块内X偏移位置
14 float ty =CameraZ - int(CameraZ); //求块内Z偏移位置
15 float txty = tx * ty; //以下为双线性插值(内插)计算
16 return h00*(1.0f-ty-tx+txty)
+ h01*(tx-txty)
+ h11*txty
+ h10*(ty-txty); //返回插值计算值,为所求点的高度。
17}
程序注释,行号是为注释加的。
1~2行 计算所求点在那一地面块。
3~4行 得到块的行列号。
5~6行 块的对角行列号。
7~8行 对角行列号超界,取首块。
9~12行 分别获取点(x,z) 所在块四角的高度。
图5-1-2 四角高度示意
13~14行 求点(x,z) 在块内的位置(tx,ty) 。
15~16行 现在块的四角高度已知,所求点(x,z)在块内的位置(tx,ty)也算出。要准确求出点(x,z) 的y值(高度) ,我们可以用双线性插值(内插)计算。有关双线性插值计算的原理、方法,请参考有关资料。16行就是进行双线性插值计算返回所求点(x,z)的高度y。
|
|