用户:查看:1 回复:5 评论:1 创建时间:2023-07-03T19:16:08
在随机地形这一方面,神岛有许多大佬已经发布了不少优秀的生成代码,这里仅仅只展示一下近期的创作成果,欢迎大家对算法优化提出建议,不喜勿喷
随机地形0.1.0:https://shequ.codemao.cn/community/546613
主要更新:水域更新,卡顿优化
console.clear()
basic=70//地基高度,自选
sealevel=65//海平面高度,自选
Math.seed=Math.random()
Math.seededRandom = function(max,min){//随机数代码,不用管它
max=max||1;
min=min||0
Math.seed=(Math.seed*9301+49297)%233280;
var rnd=Math.seed/233280.0;
return(Math.ceil(min+rnd*(max-min)))
}
async function cylinder(vox, cx, cy, cz, radius, height,changeVox){//圆柱建造
let xend = cx+radius
let yend = cy+height
let zend = cz+radius
for(let x=cx-radius; x<=xend; x++){
for(let z=cz-radius; z<=zend; z++){
let dx = x-cx;
let dz = z-cz;
if(Math.round(Math.sqrt(dx*dx+dz*dz)) <= radius){
for(let y=cy; y<yend; y++){
if(!changeVox.includes(voxels.getVoxel(x,y,z))){
voxels.setVoxel(x,y,z,vox)
}
}
}
}}
}
noiseP1Final = new Array(128).fill([]);//模拟地图盘
noiseP1FinalTure = new Array(128).fill([]);//最终地图盘
const PI=3.1415926535
for(k=0;k<=128;k++){//初始化地图
noiseP1FinalTure[k]=[]
}
for(k=0;k<=128;k++){
for(b=0;b<=128;b++){
noiseP1FinalTure[k][b]=0
}
}
//——————————算法主体——————————
function landswanp(x,y,maxh,minh){//xy=128
for(k=0;k<=x;k++){
noiseP1Final[k*y]=[]//初始化地图
for(i=0;i<=x;i++){
a=Math.seededRandom(maxh,minh)//种子取高
noiseP1Final[k*y][i*y]=a
}
for(i=0;i<x;i++){//平滑算法核心
ava=(noiseP1Final[k*y][i*y]-noiseP1Final[k*y][(i+1)*y])/2
if(ava>=0){
for(j=0;j<y;j++){
noiseP1Final[k*y][i*y+j]=noiseP1Final[k*y][i*y]+Math.floor(Math.cos(j/y*PI)*ava)-Math.floor(Math.cos(0)*ava)
}
}else if(ava<0){
for(j=0;j<y;j++){
noiseP1Final[k*y][i*y+j]=noiseP1Final[k*y][(i+1)*y]+Math.floor(Math.cos((y-j)/y*PI)*(-ava))-Math.floor(Math.cos(0)*(-ava))
}
}
}
}
for(k=0;k<=128;k++){
for(i=0;i<x;i++){
ava=(noiseP1Final[i*y][k]-noiseP1Final[(i+1)*y][k])/2
if(ava>=0){
for(j=0;j<y;j++){
noiseP1FinalTure[i*y+j][k]+=noiseP1Final[i*y][k]+Math.round(Math.cos(j/y*PI)*ava)-Math.round(Math.cos(0)*ava)
}
}else if(ava<0){
for(j=0;j<y;j++){
noiseP1FinalTure[i*y+j][k]+=noiseP1Final[(i+1)*y][k]+Math.round(Math.cos((y-j)/y*PI)*(-ava))-Math.round(Math.cos(0)*(-ava))
}
}
}
}
}
//地形生成
landswanp(4,32,30,-30)
landswanp(8,16,18,-18)
landswanp(16,8,5,-5)
//打印主体地形
async function mainswanp(){
for(i=0;i<=128;i++){
for(j=0;j<=128;j++){
sand=Math.floor(Math.seededRandom(4,-1))
for(h=0;h<=noiseP1FinalTure[i][j]+basic-4;h++){
voxels.setVoxel(i,h,j,129)
}
for(h=noiseP1FinalTure[i][j]+basic-4;h<=noiseP1FinalTure[i][j]+basic-1;h++){
voxels.setVoxel(i,h,j,125)
}
if(noiseP1FinalTure[i][j]+basic>=sealevel){
voxels.setVoxel(i,noiseP1FinalTure[i][j]+basic,j,127)
if(noiseP1FinalTure[i][j]+basic<=sealevel+sand){
voxels.setVoxel(i,noiseP1FinalTure[i][j]+basic,j,135)
}
}
for(h=0;h<=sealevel;h++){
if(voxels.getVoxelId(i,h,j)==0){
voxels.setVoxel(i,h,j,3喵)
}
}
await sleep(1)
}
}
}
//代码主体
async function finalswanp(){
CanChangeVoxClay=[0,3喵,129]
CanChangeVoxSand=[0,3喵,129]
await mainswanp();
for(i=0;i<=128;i++){
for(j=0;j<=128;j++){
sandR=Math.floor(Math.seededRandom(7,-40))
sandH=Math.floor(Math.seededRandom(5,2))
clayR=Math.floor(Math.seededRandom(5,-120))
clayH=Math.floor(Math.seededRandom(4,2))
if(clayR>=1&&noiseP1FinalTure[i][j]+basic<=sealevel){//铺沙
cylinder(135, i, noiseP1FinalTure[i][j]+basic-sandH, j, sandR, sandH,CanChangeVoxSand)
}
if(clayR>=1&&noiseP1FinalTure[i][j]+basic<=sealevel){//粘土
cylinder(247, i, noiseP1FinalTure[i][j]+basic-clayH, j, clayR, clayH,CanChangeVoxClay)
}
await sleep(1/10)
}
}
}
finalswanp();
效果如下:


有需欢迎大家取用