在Three.js(使用JavaScript/WebGL)中,給定一個更大的球體 - 半徑爲200--我將如何定位一個更小的物體(在我的情況下是球體)在這個球體的隨機外部位置上?例如,想象這個球體是一個世界,並且在這個世界的地面上有隨機位置上的小球體。Three.js:將較小的對象放在更大的球體的隨機位置
謝謝!
在Three.js(使用JavaScript/WebGL)中,給定一個更大的球體 - 半徑爲200--我將如何定位一個更小的物體(在我的情況下是球體)在這個球體的隨機外部位置上?例如,想象這個球體是一個世界,並且在這個世界的地面上有隨機位置上的小球體。Three.js:將較小的對象放在更大的球體的隨機位置
謝謝!
只是想到了一個解決方案,雖然可能不是最好的:從較大的正方形中獲得隨機頂點,並將較小的對象放置在這些點上。像:可能
spheresGroup.scale.x = spheresGroup.scale.y = spheresGroup.scale.z = 1.05;
並不是一個很好的解決方案:
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);
}
}
把物體在一組,然後縮放組,將它們移到高一點地上。
如果它只是一個球,我會做這樣的:
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);
我做了一個GeometryUtils方法對網格使用隨機的點,你可以只使用這樣的:
https://github.com/mrdoob/three.js/blob/master/src/extras/GeometryUtils.js#L304
var points = THREE.GeometryUtils.randomPointsInGeometry(geometry, nPoints);
它比球特定的解決方案更復雜,但它會給你總是在真實網格上的點(而不是點在完美的幾何球面上,例如,如果您處理行星尺寸的網格,可能會關閉)。
直接在網格上獲得更精確點的另一種方法是在較大的球體上生成隨機點,然後將它們射向球體中心。
雖然如果你不太在意精度,簡單的幾何方法應該足夠了。
順便說一句,mrdoob的方法很好,但它應該有一個額外的步驟來拒絕長度大於1的向量(參見超立方體拒絕方法)。
http://local.wasp.uwa.edu.au/~pbourke/geometry/spherepoints/
Random Point on a given Sphere
參見這裏對一些其他方法如何在球體上產生隨機點: