在Three.js(使用JavaScript / WebGL)中,给定一个更大的球体 - 半径为200 - 我如何在随机的外部位置放置一些较小的物体(球体,在我的情况下)这个球体?例如,想象球体是一个世界,并且在这个世界的地面上有随机位置的小球体。
谢谢!
答案 0 :(得分:5)
我制作了一个GeometryUtils方法来获取网格上的随机点,你可以使用它:
https://github.com/mrdoob/three.js/blob/master/src/extras/GeometryUtils.js#L304
var points = THREE.GeometryUtils.randomPointsInGeometry( geometry, nPoints );
它比特定于球体的解决方案更复杂,但它会为您提供始终在真实网格上的点(而不是在完美几何球体上的点,例如,如果您处理行星大小的网格,可能会关闭)
直接在网格上获得更精确点的另一个选择是在更大的球体上生成随机点,然后将它们射向球体中心。
虽然如果你不太关心精度,简单的几何方法就足够了。
BTW mrdoob的方法很好但它应该有一个额外的步骤来拒绝长度> 1的向量。 1(参见超立方体拒绝方法)。http://local.wasp.uwa.edu.au/~pbourke/geometry/spherepoints/
Random Point on a given Sphere
另请参阅此处了解如何在球体上生成随机点的其他方法:
答案 1 :(得分:4)
如果只是一个球体,我会这样做:
sphere.position.x = Math.random() * 2 - 1;
sphere.position.y = Math.random() * 2 - 1;
sphere.position.z = Math.random() * 2 - 1;
sphere.position.normalize();
sphere.position.multiplyScalar( 200 );
答案 2 :(得分:0)
只想到一个解决方案,尽管可能不是最好的:从较大的方块获取随机顶点,并将较小的对象放在这些点上。像:
var max = this.sphere.geometry.vertices.length;
for (var i = 0; i < max; i++) {
if ( Misc.getChance(5) ) {
var vertex = this.sphere.geometry.vertices[i];
var sphere = new THREE.Mesh(geometry, material);
sphere.position.set(vertex.x, vertex.y, vertex.z);
scene.add(sphere);
}
}
将对象放在一个组中,然后缩放组,将它们移到地面以上一点:
spheresGroup.scale.x = spheresGroup.scale.y = spheresGroup.scale.z = 1.05;
可能不是一个很好的解决方案。