猫史档案馆


【神岛】一个一直被忽视的东西——粒子

用户:DDguanDDguan查看:9 回复:10 评论:9 创建时间:2023-03-17T21:25:38


大家因该看过很多麦块粒子秀吧~但在论坛搜了一下,好像神岛还没有类似的东西呢……于是我先尝试用模型复刻,可是发现模型的话效果不好……于是就想到用代码复刻了……

目前局限性:

神岛不仅有模型个数限制,还有粒子个数限制……也就是说神岛目前还做不出很华丽的粒子效果,差不多整3个大圆就撑不住了……

先给大家看看效果:

先是一条线:

然后一个大圈(代码自己琢磨了半天……累喵了):

做了个类似奇异博士的法阵简易版……:

代码展示:

async function setP(x,y,z){
    const w = world.createEntity({
    meshScale:[0,0,0],//大小
    bounds: new Box3Vector3(0.01, 0.01, 0.01),//边界
    position:[x,y,z],//位置
    collides: false,//碰撞:False
    gravity: false, //引力:False
    particleColor:[
        new Box3RGBColor(255,215,-50),
    ],//所有粒子颜色
    particleSize:[4,4,4,4,4],//粒子大小
    particleRate:1,//每秒生成15个粒子
    particleLimit:1000,//粒子数量上限为30
    particleLifetime:1.5//粒子存活5秒
})
}
async function setPRound(x,y,z,r,p){

    for(let times=0; times<p; times++) {

        const hudu = (2*Math.PI / 360) * 6 * times;

        const xa = x + Math.sin(hudu) * r;

        const ya = y - Math.cos(hudu) * r;    //  注意此处是“-”号,因为我们要得到的Y是相对于(0,0)而言的。

        const za=z;
        setP(xa,ya,za)
    }
    
}
//魔法
setPRound(20,20,20,5,125)
setPRound(20,20,19,3,90)
setPRound(20,20,18,1,60)
//大圈
setPRound(20,50,20,20,450)
//画线
for (let i = 0; i <= 50; i++) {
  setP(i*0.6,20,20)
}

总结:

理论上来说,用粒子显示文字是不难的……但由于神岛对粒子个数的限制太小了………所以华丽的效果是实现不了了,就希望吉吉提高一下粒子显示个数啊!!!


回复

上一页1 页 / 共 1下一页
DDguanDDguan

注释有些写错了……主要是一直在修改参数

点赞0


评论


22why22why

哇新鲜的帖子()作者nb()

点赞0


评论


伴只狗头伴只狗头

神岛的粒子要大量的实体支撑

相比于粒子上限 实体上限只有2000多(?

一般情况下根本做不了大规模的

点赞0


评论


busterbuster

没有实际用处))

点赞0


评论


KanonWangKanonWang

我的世界:什么MC东西

MC的粒子没有上限(doge)

点赞0


评论


SCS_user_LoeheodVOQSCS_user_LoeheodVOQ

https://shequ.codemao.cn/community/513465

https://shequ.codemao.cn/community/513744

之前我弄的

点赞0


评论


我叫昵称我叫昵称

神岛:我也想弄粒子,奈何服务器不够。

点赞1


评论


我叫昵称我叫昵称

MC弄粒子顶多卡崩自己的电脑,岛三弄粒子是攻击网站。

点赞1


评论


Ezra__Ezra__

做圆不一定要用参数方程,可以用圆的定义“在平面直角坐标系上所有与圆心距离是5的点集”来实现,

这样子似乎会简单一点(?

async function setP(...v) {
    world.createEntity({
        meshScale: [0, 0, 0],
        bounds: new Box3Vector3(0.01, 0.01, 0.01),
        position: v,
        collides: false,
        gravity: false,
        particleSize: [4, 4, 4, 4, 4],
        particleRate: 1,
        particleLimit: 1,
    })
}
async function setPRound(r, ...pr) {//r表示半径,p表示圆心坐标
    let p = new Box3Vector3(...pr);
    for (let x = p.x - r; x <= p.x + r; x++)
        for (let y = p.y - r; y <= p.y + r; y++) {
            if ((x - p.x) ** 2 + (y - p.y) ** 2 == r ** 2)
                setP(x, y, p.z)
        }
}

点赞0


评论


DDguanDDguan

新突破!不过只能停留在猜想……因为神岛对粒子的限制太bt了

猜想:可以用粒子展示文字

首先是用k画板画一个很小的字

然后写一小点py获取黑色的坐标

from PIL import Image

# 打开图片
img = Image.open(r'C:\Users\Administrator\Downloads\hello.png')#替换成你自己图片的路径

# 获取像素数据
pixels = img.load()
list=[]
# 打印像素坐标和值
for i in range(img.size[0]):    # 图片宽度
    for j in range(img.size[1]):    # 图片高度
        if pixels[i,j]!=(0,0,0,0):
            list.append([i,j])
        print(f"Pixel value at ({i},{j}): {pixels[i,j]}")
print(list)

然后就能获取一个坐标的列表,在写一点小代码就行了……

但是神岛对粒子个数的限制顶多显示成这样

……

点赞0


评论