learn, think, share, communication
Posts tagged terrain
3D地形学习笔记1–地形生成
Aug 15th
地形生成是一个很有意思的话题,通过简单的函数以及一些参数配置,就可以轻松的生成接近于自然地貌的地形。
两种众所周知的地形生成算法分别是
1、 Fault Formation
2、 Midponit displacement (又名diamond square)
Fault Formation 算法
这个算法的本质其实很简单。想象一个方块,在这个方块中随机取一个点为起始点,再随机选择一个方向,形成一条射线,然后将高度图中这个射线左侧(或者右侧)的部分全部添加一个Delta。重复上述步骤若干次,每次将添加的Delta减小一些,一个简单的高度图就可以生成出来了。
Delta应当与当前迭代次数与总迭代次数的比值成线性关系。
Delta = MaxHeight – (MaxHeight – MinHeight) * CurrentItr / TotalItr;
这样第一次迭代所产生的影响最大,而后的迭代中对整个高度图的影响依次递减,在之前的高度基础上继续增加高度图中的细节。通常来说,迭代次数越多,效果会越好。
实现FaultFormation的伪码如下:
Do_Formation(float* pfBuffer, int iLen, Point ptStart, Point ptEnd, float fDelta)
{
Point ptDir = ptEnd – ptStart;
For (int z = 0; z < iLen; ++z)
For (int x = 0; x < iLen; ++x)
{
Point ptDirCur [...]