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 );
球固有のソリューションよりも複雑ですが、常に実際のメッシュ上にあるポイントが得られます (たとえば、惑星サイズのメッシュを扱う場合にオフになる可能性がある完全な幾何学的球上にあるポイントとは対照的です)。
メッシュ上でより正確なポイントを直接取得する別のオプションは、より大きな球でランダムなポイントを生成し、それらを球の中心に向かってレイキャストすることです。
ただし、精度をあまり気にしない場合は、単純なジオメトリ メソッドで十分です。
ところで、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 );
おそらく最善ではありませんが、1つの解決策を考えてみてください。大きな正方形からランダムな頂点を取得し、それらのポイントに小さなオブジェクトを配置します。好き:
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;
おそらくあまり良い解決策ではありません。