在stage3D中行走在高低起伏的地形之上

继续地形渲染的教程~

现在我们有了凹凸不平的地形了,要如何在上面行走呢~
我们只需要一个函数就可以完成,下面我将逐行讲解这些代码,最后放出完整的函数

[cc lang=”actionscript3″ nowrap=”false”]
public function getHeight(x : Number, z : Number) : Number
[/cc]

创建一个函数来获取高度,传进来的值为要行走的物体的世界坐标x,y. 记住这个函数是以地形的中心点在世界中心为前提计算了,如果你的地形有偏移,请加载偏移值.

[cc lang=”actionscript3″ nowrap=”false”]
x = (m_width >> 1) + x;
z = (m_depth >> 1) – z;
//地形上的x,y. 就是以地形的中心点为前提再偏移. m_width >> 1 和 m_depth >> 1 就是将xz平面的地方 / 2 后,取到中心点.

x /= m_cellSpacing;
z /= m_cellSpacing;

var col : int = Math.floor(x);
var row : int = Math.floor(z);
//我们的地形的每个顶点的间距是 m_cellSpacing ,本demo中的值是10. /= 的方法就是求 col 和 row 的索引值,相信做过2D游戏A*寻路,或者地图区块平铺的同学知道.
[/cc]

现在我们取到当前的物体所在地形上的哪个顶点上, 要计算当前顶点所在平面的法线,也可以说是计算当前地形的高度和倾斜角度.
为了计算这些东西,我们需要这个平面的4个顶点,然后计算他们的差值.

[cc lang=”actionscript3″ nowrap=”false”]
var A : Number = getHeightMapEntry(row, col);
var B : Number = getHeightMapEntry(row, col + 1);
var C : Number = getHeightMapEntry(row + 1, col);
var D : Number = getHeightMapEntry(row + 1, col + 1);
[/cc]

这个 getHeightMapEntry 是上一教程中的函数,其内容就是取出灰度图中的数值. 内部是这样的
return m_heightMap[row * m_numVertsPerRow + col];

[cc lang=”actionscript3″]
var dx : Number = x – col;
var dz : Number = z – row;
//我们将当前位置偏移到这个平面的左上角

var height : Number = 0;
if(dz < 1 - dx) //当 dz < 1-dx 时,表示我们在左上半部分的三角形上 { var uy : Number = B - A; var vy : Number = C - A; height = A + Utils.lerp(0,uy,1 - dx) + Utils.lerp(0,vy,1 - dz); //计算这个三角形邻边和对边的线性插值. Utils.lerp就是计算线性插值的函数. }else{ //当 dz > 1-dx 时,表示我们在右下半部分的三角形上
var uy : Number = C – D;
var vy : Number = B – D;

height = D + Utils.lerp(0,uy,1 – dx) + Utils.lerp(0,vy,1 – dz);
}

return height;
[/cc]

最后线性差值的函数为
[cc lang=”actionscript3″]
public static function lerp(a : Number, b : Number, t : Number) : Number
{
return a – (a * t) + (b * t);
}
[/cc]

发表评论

电子邮件地址不会被公开。 必填项已用*标注