You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Three.js结合Perlin.js生成地形出现山体朝向单一、中线畸变问题

问题产生原因
  • 地形整体朝向单一:仅使用单层基础Perlin噪声生成高度值,未叠加多倍频噪声层,单阶Perlin噪声的梯度分布本身就会出现全局走势趋同的特征,表现为所有山体隆起方向一致。
  • 对角线位置畸变:顶点索引计算逻辑错误。你的循环中每行(固定x值)的z方向顶点总数为worldDiameter + 2(循环条件为z <= worldDiameter+1),但你计算索引时使用z*worldDiameter+x,步长错误且x/z维度映射颠倒,导致顶点高度被写入错误的内存位置,刚好在对角线区域出现明显畸变。
修复方案
  1. 修正顶点索引计算逻辑,按照x * 每行顶点总数 + z的规则计算索引,解决对角线畸变问题。
  2. 叠加多层不同频率、振幅的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:18:03