用户:
trigonometric查看:20 回复:20 评论:20 创建时间:2022-01-22T22:31:17

function per_1dim(dots,interval){
var dot1,dot2,dif;
var y=[];
var i,j;
for(i=1;i<dots.length;i++){
dot1=dots[i];
dot2=dots[i-1];
dif=Math.abs(dot1-dot2);
if(dot1<dot2){
for(j=0;j<=3.14;j+=3.14/interval){
y.push(dot2+(Math.cos(j)-1)/2*dif);
}
}else{
for(j=3.14;j>=0;j-=3.14/interval){
y.push(dot2+(Math.cos(j)+1)/2*dif);
}
}
}
return y;
}
function per_2dim(interval,min,max){
var dots=[],y1=[],y2=[],y3=[];
var x,y,z;
for(x=0;x<=256;x+=interval){
dots.push([]);
for(z=0;z<=256;z+=interval){
y=min+Math.random()*(max-min);
dots[x/interval].push(y);
}
}
for(x=0;x<=256;x+=interval){
y1.push(per_1dim(dots[x/interval],interval));
}
for(x=0;x<=256;x++){
y2.push([]);
for(z=0;z<=256;z+=interval){
y2[x].push(y1[z/interval][x]);
}
}
for(x=0;x<=256;x++){
y3.push(per_1dim(y2[x],interval));
}
return y3;
}
function per_3dim(interval,min,max){
var y1=[],y2=[],y3=[];
var x,y,z;
for(y=0;y<=喵;y+=interval){
y1.push(per_2dim(interval,min,max));
}
for(x=0;x<=256;x++){
y2.push([]);
for(z=0;z<=256;z++){
y2[x].push([]);
for(y=0;y<=喵;y+=interval){
y2[x][z].push(y1[y/interval][x][z]);
}
}
}
for(x=0;x<=256;x++){
y3.push([]);
for(z=0;z<=256;z++){
y3[x].push(per_1dim(y2[x][z],interval));
}
}
return y3;
}
async function asteroid(density){
var x,y,z;
var per32=per_3dim(32,0,100);
var per16=per_3dim(16,0,100);
var per8=per_3dim(8,0,100);
var l=[];
for(x=0;x<=256;x++){
l.push([]);
for(z=0;z<=256;z++){
l[x].push([]);
for(y=0;y<=喵;y++){
l[x][z].push(Math.ceil((per32[x][z][y]+per16[x][z][y]+per8[x][z][y])/3));
}
}
}
for(x=0;x<=256;x++){
for(z=0;z<=256;z++){
for(y=0;y<=喵;y++){
if(l[x][z][y]>density){
voxels.setVoxelId(x,y,z,129);
}
}
}
await sleep(100);
}
}
asteroid(70);原理:
一维噪声:生成多个在同一条直线且间隔相等的点,在点与点之间“平滑”形成新的点;
二维噪声:生成多个z间隔相等的一维噪声,遍历x轴,在该x轴上的点与点之间“平滑”形成新的点;
三维噪声:生成多个y间隔相等的二维噪声,分别遍历x轴和z轴,在该x、z轴上点与点之间“平滑”形成新的点。
提示:以上所有点均表示数值,在利用二维噪声生成地形时所有点的数值表示为y,在利用三维噪声生成小行星时所有点表示一个数值,如果该数值超过了界限之后,则执行相应程序。
点赞3
评论