用户:
YDS尹子查看:37 回复:22 评论:37 创建时间:2021-01-26T08:37:21
和MC越来越近了!不过技术不成熟效果并非完美
废话不多说直接上图和代码


(如果觉得效果不好可以多运行几遍或者修改参数)
代码:(其实就是一个简单的递归)
function cor3D(x,y,z){this.x=x;this.y=y;this.z=z;}
var grid=256;/*地图大小,最好是2的倍数 */
var watl=20;/*水面高度 */
var h=0.9,d=Math.round(Math.log2(grid))+1;/*h:粗糙系数,建议0~1,1最平滑 d不用去管它,调大了会崩坏你的电脑 */
var ran=120;/*随机取值范围大小,此处为±70 */
var seed=[];
function classification(pul,pur,pdl,pdr,depth,range){
range*=Math.pow(2,-h);
if(depth==0){
seed.push(pul);
}else{
var pm=new cor3D((pur.x+pdl.x)/2,(pur.y+pdl.y)/2,(pur.z+pdl.z)/2);
var pmu=new cor3D((pur.x+pul.x)/2,(pur.y+pul.y)/2,(pur.z+pul.z)/2);
var pmd=new cor3D((pdr.x+pdl.x)/2,(pdr.y+pdl.y)/2,(pdr.z+pdl.z)/2);
var pml=new cor3D((pul.x+pdl.x)/2,(pul.y+pdl.y)/2,(pul.z+pdl.z)/2);
var pmr=new cor3D((pdr.x+pur.x)/2,(pdr.y+pur.y)/2,(pdr.z+pur.z)/2);
pm.y+=Math.random()*2*range-range*0.9;
if(depth==d)pm.y=pur.y;
classification(pml,pm,pdl,pmd,depth-1,range);
classification(pm,pmr,pmd,pdr,depth-1,range);
classification(pul,pmu,pml,pm,depth-1,range);
classification(pmu,pur,pm,pmr,depth-1,range);
}
return;
};
(async function(){
classification(new cor3D(0,22,grid*2),new cor3D(grid*2,22,grid*2),new cor3D(0,22,0),new cor3D(grid*2,22,0),d,ran);
for(let i=0;i<seed.length/4;i++){
var y=Math.round(seed[i].y);
if(y>watl){
voxels.setVoxel(seed[i].x,y,seed[i].z,"grass");
}else if(y==watl){
voxels.setVoxel(seed[i].x,y,seed[i].z,"sand");
}else if(y<watl){
voxels.setVoxel(seed[i].x,y,seed[i].z,"dirt");
}else{
console.log("azzz")
}
for(let j=0;j<y;j++){
voxels.setVoxel(seed[i].x,j,seed[i].z,"dirt");
}
if(Math.random()<0.02)await sleep(10);
}
for(let i=0;i<grid;i++){
for(let j=0;j<grid;j++){
for(let k=0;k<=watl;k++){
if(voxels.getVoxel(i,k,j)==0)voxels.setVoxel(i,k,j,"water");
}
}
}
console.log("地形生成完毕");
})();
蒟蒻OIer1048576目前我制作的一维模型:
world.say("地形开始生成");
function rand(){
return Math.random()*10;
}
let minl = 20;
let size = 128;
let noise = [1.5];
for (let i = 1;i < size;++i){
noise.push((Math.random()*2+noise[i-1])/2);
}
for (let i = 0;i < size;++i){
world.say(minl+Math.pow(7,noise.pop())+rand());
}
world.say("地形生成完毕");点赞0
评论