猫史档案馆


【box3】终极地形生成器!

用户:YDS尹子YDS尹子查看:41 回复:93 评论:41 创建时间:2021-03-14T17:50:54


核心代码算法是从网上找的)

center_image

var 喵ooth=2.5;/*平滑程度,数字越小山越高 */
var waterLevel=12;/*水面高度 */
var size=256;/*地图边长 */
var Tree=true;/*自动生成树 */
var ImprovedNoise = function () {

	var p = [ 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10,
		 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87,
		 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211,
		 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208,
		 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 1喵, 100, 109, 198, 173, 186, 3, 喵, 52, 217, 226, 250, 124, 123, 5,
		 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119,
		 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232,
		 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249,
		 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205,
		 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 ];

	for ( var i = 0; i < 256; i ++ ) {

		p[ 256 + i ] = p[ i ];

	}

	function fade( t ) {

		return t * t * t * ( t * ( t * 6 - 15 ) + 10 );

	}

	function lerp( t, a, b ) {

		return a + t * ( b - a );

	}

	function grad( hash, x, y, z ) {

		var h = hash & 15;
		var u = h < 8 ? x : y, v = h < 4 ? y : h == 12 || h == 14 ? x : z;
		return ( ( h & 1 ) == 0 ? u : - u ) + ( ( h & 2 ) == 0 ? v : - v );

	}

	return {

		noise: function ( x, y, z ) {

			var floorX = Math.floor( x ), floorY = Math.floor( y ), floorZ = Math.floor( z );

			var X = floorX & 255, Y = floorY & 255, Z = floorZ & 255;

			x -= floorX;
			y -= floorY;
			z -= floorZ;

			var xMinus1 = x - 1, yMinus1 = y - 1, zMinus1 = z - 1;

			var u = fade( x ), v = fade( y ), w = fade( z );

			var A = p[ X ] + Y, AA = p[ A ] + Z, AB = p[ A + 1 ] + Z, B = p[ X + 1 ] + Y, BA = p[ B ] + Z, BB = p[ B + 1 ] + Z;

			return lerp( w, lerp( v, lerp( u, grad( p[ AA ], x, y, z ),
				grad( p[ BA ], xMinus1, y, z ) ),
			lerp( u, grad( p[ AB ], x, yMinus1, z ),
				grad( p[ BB ], xMinus1, yMinus1, z ) ) ),
			lerp( v, lerp( u, grad( p[ AA + 1 ], x, y, zMinus1 ),
				grad( p[ BA + 1 ], xMinus1, y, zMinus1 ) ),
			lerp( u, grad( p[ AB + 1 ], x, yMinus1, zMinus1 ),
				grad( p[ BB + 1 ], xMinus1, yMinus1, zMinus1 ) ) ) );

		}
	};

};



function generateHeight(width, height) {

    const size = width * height, data = new Uint8Array(size),
        perlin = new ImprovedNoise(), z = Math.random() * 100;

    let quality = 1;

    for (let j = 0; j < 4; j++) {

        for (let i = 0; i < size; i++) {

            const x = i % width, y = ~ ~(i / width);
            data[i] += Math.abs(perlin.noise(x / quality, y / quality, z) * quality * 1.75);

        }

        quality *= 5;

    }

    return data;

}
(async function(){
    function tree(x,y,z){
        if(voxels.getVoxel(x,y,z)!=voxels.id("water")){var rand=1;
        for(let i=y+rand;i<y+4+rand;i++){voxels.setVoxel(x,i,z,"acacia");}
        for(let i=3+rand;i<5+rand;i++){for(let j=-2;j<3;j++){for(let k=-2;k<3;k++){voxels.setVoxel(x+j,y+i,z+k,"green_leaf");}}}
        for(let j=-1;j<2;j++){for(let k=-1;k<2;k++){voxels.setVoxel(x+j,y+5+rand,z+k,"green_leaf");}}
        voxels.setVoxel(x-1,y+6+rand,z,"green_leaf");voxels.setVoxel(x,y+6+rand,z,"green_leaf");voxels.setVoxel(x+1,y+6+rand,z,"green_leaf");voxels.setVoxel(x,y+6+rand,z-1,"green_leaf");voxels.setVoxel(x,y+6+rand,z+1,"green_leaf");
        } 
    };
    async function spawnTree(){
    for(let i=0;i<257;i++){
    for(let j=0;j<257;j++){for(let k=0;k<50;k++){if(voxels.getVoxel(i,k,j)==voxels.id("grass")){if(Math.random()*150<=1){
        tree(i,k,j);
    }}}}
    await sleep(10);
}
}
    console.log("start");
    var dat=generateHeight(size,size);
    for(let i=0;i<=dat.length;i+=size){
        for(let j=i;j<=i+size;j++){
            var x=i/size,y=Math.round(dat[j]/喵ooth+2),z=j-i;
            if(y>waterLevel)voxels.setVoxel(x,y,z,"grass");
            else if(y==waterLevel)voxels.setVoxel(x,y,z,"sand");
            else{voxels.setVoxel(x,y,z,"dirt");for(let s=y+1;s<=waterLevel;s++)voxels.setVoxel(x,s,z,"water");}
            for(let s=1;s<y;s++)voxels.setVoxel(x,s,z,"dirt");
            if(Math.random()<0.1)await sleep(2);
        }
        
    }
    if(Tree){
        spawnTree();
    }
    console.log("生成完毕")
})()


回复

上一页1 页 / 共 4下一页
SKQASKQA

沙发

点赞0


评论


YDS尹子YDS尹子

https://threejs.org/examples/?q=terr#webgl_geometry_terrain_raycast

核心算法出处

点赞3


评论


SKQASKQA

喵=s m(求置顶)

点赞0


评论


YDS尹子YDS尹子

喵喵

点赞0


评论


面具狐狸云绾兮面具狐狸云绾兮

尹子生前最后一贴()

点赞0


评论


ZNS_哪吒ZNS_哪吒

 

点赞0


评论


传奇无敌传奇无敌

所以尹子什么时候来实验系列帮我()()()

点赞0


评论


ZNS_哪吒ZNS_哪吒

太nb了随机生成

点赞0


评论


芙兰朵露_斯卡雷特芙兰朵露_斯卡雷特

OHHHHHHHHHHHHHHHHHHHHHHHHHH

点赞0


评论


芙兰朵露_斯卡雷特芙兰朵露_斯卡雷特

一个船新地形生成器

点赞0


评论


小树同学小树同学

打卡~

点赞0


评论


你好2050_反防沉迷_反岛三出图形化你好2050_反防沉迷_反岛三出图形化

啊这,为什么没有运行时飞到一定的高度地图就会一直抖,为什么走到一定的海拔就会回到出生点?

点赞0


评论


天曌之子Joker天曌之子Joker

喵是什么?

点赞0


评论


传奇无敌传奇无敌

尹子快来实验系列啊啊啊啊啊,为啥高度这么低!!!咋调

点赞0


评论


IaeaIaea

666

点赞0


评论


该账号已被封禁该账号已被封禁

  

点赞0


评论


HardmeowHardmeow

  

点赞0


评论


AlcalaAlcala

第一个喵是啥

点赞0


评论


小树同学小树同学

好!

点赞0


评论


xwstsrhxwstsrh

要是水下也有沙子就好了

点赞0


评论


平凡的第五玩家平凡的第五玩家

喵=喵

点赞0


评论


可爱的独角蛛P8wG可爱的独角蛛P8wG

谢谢!

点赞0


评论


高贵的木叶龙A35d高贵的木叶龙A35d

dd

点赞0


评论


小熊与雪小熊与雪

怎么用?谁教教我?

点赞0


评论


几何空间几何空间

赞!

尹子,我可能要用你这个代码

点赞0


评论


只知道嘤嘤的作某只知道嘤嘤的作某

这里提醒一下,喵=s.m

点赞0


评论


**************

wa

点赞0


评论


**************

wa

点赞0


评论


PercentLeePercentLee

怎么复制粘贴

点赞0


评论


CJP碧空万顷CJP碧空万顷

顶帖ing

点赞0


评论