Three.js结合Perlin.js生成地形出现山体朝向单一、中线畸变问题
问题产生原因
- 地形整体朝向单一:仅使用单层基础Perlin噪声生成高度值,未叠加多倍频噪声层,单阶Perlin噪声的梯度分布本身就会出现全局走势趋同的特征,表现为所有山体隆起方向一致。
- 对角线位置畸变:顶点索引计算逻辑错误。你的循环中每行(固定x值)的z方向顶点总数为
worldDiameter + 2(循环条件为z <= worldDiameter+1),但你计算索引时使用z*worldDiameter+x,步长错误且x/z维度映射颠倒,导致顶点高度被写入错误的内存位置,刚好在对角线区域出现明显畸变。
修复方案
- 修正顶点索引计算逻辑,按照
x * 每行顶点总数 + z的规则计算索引,解决对角线畸变问题。 - 叠加多层不同频率、振幅的Perlin噪声(即分形布朗运动FBM),优化地形自然度,解决山体朝向统一的问题。
修复后的参考代码如下:
//Generate terrain var inc = 0.005; var baseAmplitude = 100; // 分形噪声层数,数值越高地形细节越丰富 var octaves = 4; for (var x = 0; x <= worldDiameter+1; x++) { for (var z = 0; z <= worldDiameter+1; z++) { var amplitude = baseAmplitude; var frequency = 1; var heightValue = 0; // 叠加多倍频噪声层 for(var i = 0; i < octaves; i++) { var xoff = x * inc * frequency; var zoff = z * inc * frequency; heightValue += noise.perlin2(xoff, zoff) * amplitude; amplitude *= 0.5; frequency *= 2; } // 修正顶点索引 const vertexIndex = x * (worldDiameter + 2) + z; mapGeometry.attributes.position.setZ(vertexIndex, heightValue); } }
内容的提问来源于stack exchange,提问作者Leif
相关产品推荐
相关产品推荐

