将随机立方体转换为三个js中的随机球体

时间:2016-11-08 11:02:00

标签: javascript three.js

所以我的问题是我试图在three.js中创建一个随机星图,当缩小时变成一个由星星创建的行星(球体)。

目前使用的代码随机生成我的星星,但当我缩小它时,它是一个立方体,而不是一个球体。

    for (var i = 0;i<2000;i++){
                var mesh = new THREE.Mesh( geometry, material);
                mesh.position.x = ( Math.random() - 0.5) * 4000 * Math.random();
                mesh.position.y = ( Math.random() - 0.5) * 4000* Math.random() ;
                mesh.position.z = ( Math.random() - 0.5) * 4000* Math.random() ;

                mesh.rotation.x = Math.random();
                mesh.rotation.y = Math.random();
                mesh.rotation.z = Math.random();

                scene.add(mesh);
                objects.push(mesh);
            }

这是for循环,其中我产生我的星星和3-6行是决定星星产生的方式然而我所能做的是再次乘以数学随机的定位来创建一个稍微不那么明确的立方体而不是我想要的球体。

2 个答案:

答案 0 :(得分:1)

修剪球体外的星星:

var R=2000;
for (var i = 0;i<2000;){
    var mesh = new THREE.Mesh( geometry, material);
    mesh.position.x = ( Math.random() - 0.5) * R*2 * Math.random();
    mesh.position.y = ( Math.random() - 0.5) * R*2 * Math.random() ;
    mesh.position.z = ( Math.random() - 0.5) * R*2 * Math.random() ;

    mesh.rotation.x = Math.random();
    mesh.rotation.y = Math.random();
    mesh.rotation.z = Math.random();

    var distance_squared = mesh.position.x*mesh.position.x + mesh.position.y*mesh.position.y + mesh.position.z*mesh.position.z;

    if(distance_squared <= R*R) {
        scene.add(mesh);
        objects.push(mesh);
        ++i;
    }
}

答案 1 :(得分:0)

不要像你那样设置网格x,y,z位置,而是这样试试

var newPos = new THREE.Vector3(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5 ).normalize().multiplyScalar( 4000 * Math.random() );
mesh.position.copy(newPos);

因此,您设置了一个随机向量,然后对其进行标准化,使其长度等于1,然后将其乘以随机值。简单来说:你设定方向和距离。

有两个解决方案的jsfiddle示例(我的和Adder&#39;)