gpt4 book ai didi

javascript - 使用 Three.js 重新划分椭圆体 PointCloud 中的点

转载 作者:行者123 更新时间:2023-11-30 16:40:25 26 4
gpt4 key购买 nike

我最近开始尝试使用 Three.js。我尝试使用 PointCloud 对象创建椭圆体粒子云。

我使用椭圆体的参数方程生成随机点,如下所示:

    var vertex = new THREE.Vector3();
u = Math.random() * 2 * Math.PI;
v = Math.random() * Math.PI;
vertex.x = Math.random() * a * Math.cos(u) * Math.sin(v);
vertex.y = Math.random() * b * Math.sin(u) * Math.sin(v);
vertex.z = Math.random() * c * Math.cos(v);

但是当我渲染云时,我注意到异常数量的粒子聚集在椭圆体的轴周围。

我想知道这是否与 Math.random() 函数的分布有关,还是我遗漏了什么?请帮助我理解这一点。

你可以看看here我做了一个screenshot以防它在您的浏览器上看起来不一样。

编辑代码已按照@severin-pappadeux 的善意建议进行了修改,以避免错误分布的点,但问题仍然存在。

编辑:我修改了使用 Math.random() 设置顶点长度的部分,即:

vertex.x = Math.random() * a * wx;
vertex.y = Math.random() * b * wy;
vertex.z = Math.random() * c * wz;

到:

vertex.x = (Math.random() + 0.1) * a * wx;
vertex.y = (Math.random() + 0.1) * b * wy;
vertex.z = (Math.random() + 0.1) * c * wz;

而且颗粒分布更均匀。更有趣的是,它不会在轴所在的位置形成“十字孔”,这是我所期望的,因为 Math.random() + 0.1 不会产生任何低于 0.1 的值。所以这个小技巧解决了我的问题,尽管我仍然对好的答案感兴趣。

最佳答案

Angular 分布明显不均匀。你看到的相当于http://mathworld.wolfram.com/SpherePointPicking.html的效果.可以尝试建立单位统一的球体向量,并将其与椭圆相交以产生顶点。沿线的东西

phi   = 2.0 * Math.PI * Math.random();
csth = 2.0 * Math.random() - 1.0;
snth = Math.sqrt((1.0 - csth)*(1.0 + csth));
wx = snth * Math.sin(phi);
wy = snth * Math.cos(phi);
wz = csth;

(wx,wy,wz) 是单位向量。构建距离 s*(wx,wy,wz) 的射线。将来自 (0,0,0) 的这条光线与椭圆相交,找到你的顶点

更新

没有意识到问题是关于给定卷中的制服。无论如何要在单位球体中获得均匀,必须添加半径采样:

r = Math.pow( Math.random(), 1.0/3.0 ); // is there cubic root sqrt3() function?

然后球内的点将是 (r*wx, r*wy, r*wz) 并且可以相应地缩放 (a, b, c)

关于javascript - 使用 Three.js 重新划分椭圆体 PointCloud 中的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32097628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com