在 Three.js(使用 JavaScript/WebGL)中,给定一个更大的球体——半径为 200——我如何在这个球体的随机外部位置上放置一些较小的对象(在我的例子中是球体)?例如,想象球体是一个世界,在这个世界的地面上有一些小球体位于随机位置。
谢谢!
在 Three.js(使用 JavaScript/WebGL)中,给定一个更大的球体——半径为 200——我如何在这个球体的随机外部位置上放置一些较小的对象(在我的例子中是球体)?例如,想象球体是一个世界,在这个世界的地面上有一些小球体位于随机位置。
谢谢!
我制作了一个 GeometryUtils 方法来获取网格上的随机点,你可以使用它:
https://github.com/mrdoob/three.js/blob/master/src/extras/GeometryUtils.js#L304
var points = THREE.GeometryUtils.randomPointsInGeometry( geometry, nPoints );
它比特定于球体的解决方案更复杂,但它会为您提供始终位于真实网格上的点(与完美几何球体上的点相反,例如,如果您处理行星大小的网格,可能会关闭)。
直接在网格上获得更精确点的另一种选择是在更大的球体上生成随机点,然后将它们投射到球体中心。
虽然如果您不太关心精度,简单的几何方法就足够了。
BTW mrdoob 的方法很好,但它应该有一个额外的步骤来拒绝长度 > 1 的向量(请参阅超立方体拒绝方法)。
http://local.wasp.uwa.edu.au/~pbourke/geometry/spherepoints/
另请参阅此处了解如何在球体上生成随机点的其他方法:
如果它只是一个领域,我会这样做:
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 );
只是想到了一种解决方案,尽管可能不是最好的:从较大的正方形中获取随机顶点,并将较小的对象放置在这些点上。喜欢:
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;
可能不是一个很好的解决方案。