用户:查看:6 回复:8 评论:6 创建时间:2023-06-25T23:04:38
在随机地形这一方面,神岛有许多大佬已经发布了不少优秀的生成代码,这里仅仅只展示一下近期的创作成果,欢迎大家对算法优化提出建议,不喜勿喷
console.clear()
basic=70//地基高度,自选
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)))
}
noiseP1Final = new Array(128).fill([]);
const PI=3.1415926535
for(k=0;k<=4;k++){
noiseP1Final[k*32]=[]
for(i=0;i<=4;i++){
a=Math.seededRandom(30,-30)
noiseP1Final[k*32][i*32]=a
}
for(i=0;i<4;i++){
ava=(noiseP1Final[k*32][i*32]-noiseP1Final[k*32][(i+1)*32])/2
if(ava>=0){
for(j=0;j<32;j++){
noiseP1Final[k*32][i*32+j]=noiseP1Final[k*32][i*32]+Math.floor(Math.cos(j/32*PI)*ava)-Math.floor(Math.cos(0)*ava)+1
}
}else if(ava<0){
for(j=0;j<32;j++){
noiseP1Final[k*32][i*32+j]=noiseP1Final[k*32][(i+1)*32]+Math.floor(Math.cos((32-j)/32*PI)*(-ava))-Math.floor(Math.cos(0)*(-ava))+1
}
}
}
}
for(k=0;k<=128;k++){
for(i=0;i<4;i++){
ava=(noiseP1Final[i*32][k]-noiseP1Final[(i+1)*32][k])/2
if(ava>=0){
for(j=0;j<32;j++){
noiseP1Final[i*32+j][k]=noiseP1Final[i*32][k]+Math.round(Math.cos(j/32*PI)*ava)-Math.round(Math.cos(0)*ava)
voxels.setVoxel(i*32+j,noiseP1Final[i*32+j][k]+basic,k,127)
for(o=0;o<=noiseP1Final[i*32+j][k]+basic-4;o++){
voxels.setVoxel(i*32+j,o,k,129)
}
for(o=noiseP1Final[i*32+j][k]+basic-4;o<=noiseP1Final[i*32+j][k]+basic-1;o++){
voxels.setVoxel(i*32+j,o,k,125)
}
}
}else if(ava<0){
for(j=0;j<32;j++){
noiseP1Final[i*32+j][k]=noiseP1Final[(i+1)*32][k]+Math.round(Math.cos((32-j)/32*PI)*(-ava))-Math.round(Math.cos(0)*(-ava))
voxels.setVoxel(i*32+j,noiseP1Final[i*32+j][k]+basic,k,127)
for(o=0;o<=noiseP1Final[i*32+j][k]+basic-4;o++){
voxels.setVoxel(i*32+j,o,k,129)
}
for(o=noiseP1Final[i*32+j][k]+basic-4;o<=noiseP1Final[i*32+j][k]+basic-1;o++){
voxels.setVoxel(i*32+j,o,k,125)
}
}
}
}
}
效果展示:

有需欢迎大家取用
随机地形版本0.1.1
console.clear()
basic=70//地基高度,自选
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)))
}
noiseP1Final = new Array(128).fill([]);//模拟地图盘
noiseP1FinalTure = new Array(128).fill([]);//最终地图盘
const PI=3.1415926535
for(k=0;k<=128;k++){
noiseP1FinalTure[k]=[]//初始化地图
}
//——————————算法主体——————————
//第一次生成(复杂程度I)
for(k=0;k<=4;k++){
noiseP1Final[k*32]=[]//初始化地图
for(i=0;i<=4;i++){
a=Math.seededRandom(30,-30)//种子取高
noiseP1Final[k*32][i*32]=a
}
for(i=0;i<4;i++){//平滑算法核心
ava=(noiseP1Final[k*32][i*32]-noiseP1Final[k*32][(i+1)*32])/2
if(ava>=0){
for(j=0;j<32;j++){
noiseP1Final[k*32][i*32+j]=noiseP1Final[k*32][i*32]+Math.floor(Math.cos(j/32*PI)*ava)-Math.floor(Math.cos(0)*ava)+1
}
}else if(ava<0){
for(j=0;j<32;j++){
noiseP1Final[k*32][i*32+j]=noiseP1Final[k*32][(i+1)*32]+Math.floor(Math.cos((32-j)/32*PI)*(-ava))-Math.floor(Math.cos(0)*(-ava))+1
}
}
}
}
for(k=0;k<=128;k++){
for(i=0;i<4;i++){
ava=(noiseP1Final[i*32][k]-noiseP1Final[(i+1)*32][k])/2
if(ava>=0){
for(j=0;j<32;j++){
noiseP1FinalTure[i*32+j][k]=noiseP1Final[i*32][k]+Math.round(Math.cos(j/32*PI)*ava)-Math.round(Math.cos(0)*ava)
}
}else if(ava<0){
for(j=0;j<32;j++){
noiseP1FinalTure[i*32+j][k]=noiseP1Final[(i+1)*32][k]+Math.round(Math.cos((32-j)/32*PI)*(-ava))-Math.round(Math.cos(0)*(-ava))
}
}
}
}
//第二次生成(复杂程度II)
for(k=0;k<=8;k++){
noiseP1Final[k*16]=[]
for(i=0;i<=8;i++){
b=Math.seededRandom(18,-18)
noiseP1Final[k*16][i*16]=b
}
for(i=0;i<8;i++){
ava=(noiseP1Final[k*16][i*16]-noiseP1Final[k*16][(i+1)*16])/2
if(ava>=0){
for(j=0;j<16;j++){
noiseP1Final[k*16][i*16+j]=noiseP1Final[k*16][i*16]+Math.floor(Math.cos(j/16*PI)*ava)-Math.floor(Math.cos(0)*ava)
}
}else if(ava<0){
for(j=0;j<16;j++){
noiseP1Final[k*16][i*16+j]=noiseP1Final[k*16][(i+1)*16]+Math.floor(Math.cos((16-j)/16*PI)*(-ava))-Math.floor(Math.cos(0)*(-ava))
}
}
}
}
for(k=0;k<=128;k++){
for(i=0;i<8;i++){
ava=(noiseP1Final[i*16][k]-noiseP1Final[(i+1)*16][k])/2
if(ava>=0){
for(j=0;j<16;j++){
noiseP1FinalTure[i*16+j][k]+=noiseP1Final[i*16][k]+Math.round(Math.cos(j/16*PI)*ava)-Math.round(Math.cos(0)*ava)
}
}else if(ava<0){
for(j=0;j<16;j++){
noiseP1FinalTure[i*16+j][k]+=noiseP1Final[(i+1)*16][k]+Math.round(Math.cos((16-j)/16*PI)*(-ava))-Math.round(Math.cos(0)*(-ava))
}
}
}
}
//第三次生成(复杂程度III)
for(k=0;k<=16;k++){
noiseP1Final[k*8]=[]
for(i=0;i<=16;i++){
c=Math.seededRandom(5,-5)
noiseP1Final[k*8][i*8]=c
}
for(i=0;i<16;i++){
ava=(noiseP1Final[k*8][i*8]-noiseP1Final[k*8][(i+1)*8])/2
if(ava>=0){
for(j=0;j<8;j++){
noiseP1Final[k*8][i*8+j]=noiseP1Final[k*8][i*8]+Math.floor(Math.cos(j/8*PI)*ava)-Math.floor(Math.cos(0)*ava)
}
}else if(ava<0){
for(j=0;j<8;j++){
noiseP1Final[k*8][i*8+j]=noiseP1Final[k*8][(i+1)*8]+Math.floor(Math.cos((8-j)/8*PI)*(-ava))-Math.floor(Math.cos(0)*(-ava))
}
}
}
}
for(k=0;k<=128;k++){
for(i=0;i<16;i++){
ava=(noiseP1Final[i*8][k]-noiseP1Final[(i+1)*8][k])/2
if(ava>=0){
for(j=0;j<8;j++){
noiseP1FinalTure[i*8+j][k]+=noiseP1Final[i*8][k]+Math.round(Math.cos(j/8*PI)*ava)-Math.round(Math.cos(0)*ava)
}
}else if(ava<0){
for(j=0;j<8;j++){
noiseP1FinalTure[i*8+j][k]+=noiseP1Final[(i+1)*8][k]+Math.round(Math.cos((8-j)/8*PI)*(-ava))-Math.round(Math.cos(0)*(-ava))
}
}
}
}
//打印地形
for(i=0;i<=128;i++){
for(j=0;j<=128;j++){
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)
}
voxels.setVoxel(i,noiseP1FinalTure[i][j]+basic,j,127)
}
}
主要更新:结构优化,增加地形复杂程度
效果如下:

点赞0
评论
0.1.1版本压缩了一下代码,新代码如下:
console.clear()
basic=70//地基高度,自选
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)))
}
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)
//打印地形
for(i=0;i<=128;i++){
for(j=0;j<=128;j++){
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)
}
voxels.setVoxel(i,noiseP1FinalTure[i][j]+basic,j,127)
}
}
效果大致是一样的
点赞0
评论