2012-06-14 32 views

回答

0

只是想到了一個解決方案,雖然可能不是最好的:從較大的正方形中獲得隨機頂點,並將較小的對象放置在這些點上。像:可能

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); 
    } 
} 

把物體在一組,然後縮放組,將它們移到高一點地上。

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); 
5

我做了一個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

參見這裏對一些其他方法如何在球體上產生隨機點:

http://www.math.niu.edu/~rusin/known-math/96/sph.rand

相關問題