Геометрия, материалы и сетка в вопросе Three.js - PullRequest
0 голосов
/ 14 февраля 2019

В настоящее время работаю с Three.js.

Что у меня есть:

Как показано на рисунке и коде ниже, у меня есть цикл for, который создает конкретный объект в произвольном положении в сцене.

Рисунок: Demo Image Код:

//Create Objects
var geometry = new THREE.CylinderBufferGeometry( 0, 10, 30, 4, 1 );
var material = new THREE.MeshPhongMaterial( { color: 0xffffff, flatShading: true } );

for(var i=0; i<100; i++) {

    var mesh = new THREE.Mesh( geometry, material );
    mesh.position.x = getRandomInt(-500,500);
    mesh.position.y = getRandomInt(10, 100);
    mesh.position.z = getRandomInt(-500,500);
    mesh.updateMatrix();
    mesh.matrixAutoUpdate = false;
    scene_Main.add( mesh );
}

Мой вопрос:

Как создавать случайные объекты из разных материалов и геометриив цикле for?

Могу ли я использовать идею создания массива, содержащего конкретную геометрию / материал, и если да, то как его сохранить в массиве и как его использовать?

массивидея:

var geometryList = [cube, pyramid, sphere, donut, ...];
var materialList = [ .. what posibilities I have here? .. ];

for(var i=0; i<100; i++) {
    var mesh = new THREE.Mesh( geometryList[random[n]], materialList[random[n]] );
    ....    
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019
var materialList = [];


    for(var i=0; i<150; i++) {

        //Prepare different material for each object
        var color = new THREE.Color( 0xffffff );
        color.setHex( Math.random() * 0xffffff );
        materialList.push(new THREE.MeshBasicMaterial({ color: color }));

        //Prepare diferent sizes for the objects
        var geometrySize_2 = getRandomInt(5,30);

        //Create  50 Pyramids
        if(i <= 50){

            var geometry1 = new THREE.CylinderBufferGeometry( 0, 10, 30, 4, 1 );

            var mesh = new THREE.Mesh( geometry1, materialList[i] );
            mesh.position.x = getRandomInt(-500,500);
            mesh.position.y = getRandomInt(10, 150);
            mesh.position.z = getRandomInt(-500,500);
            mesh.updateMatrix();
            mesh.matrixAutoUpdate = false;
            scene_Main.add( mesh );
        }
        //Create 50 Cubes
        else if(i <= 100 && i>= 50){

            var geometry2 = new THREE.BoxGeometry(geometrySize_2,geometrySize_2,geometrySize_2);

            var mesh = new THREE.Mesh( geometry2, materialList[i] );
            mesh.position.x = getRandomInt(-500,500);
            mesh.position.y = getRandomInt(10, 150);
            mesh.position.z = getRandomInt(-500,500);
            mesh.updateMatrix();
            mesh.matrixAutoUpdate = false;
            scene_Main.add( mesh );
        }
        //Create 100 Spheres
        else if(i <= 150 && i>= 50){

            var geometry3 = new THREE.SphereGeometry( 5, 32, 32 );

            var mesh = new THREE.Mesh( geometry3, materialList[i] );
            mesh.position.x = getRandomInt(-500,500);
            mesh.position.y = getRandomInt(10, 150);
            mesh.position.z = getRandomInt(-500,500);
            mesh.updateMatrix();
            mesh.matrixAutoUpdate = false;
            scene_Main.add( mesh );
        }
    }

enter image description here

0 голосов
/ 14 февраля 2019

Вы можете делать все, что хотите на самом деле.Вам просто нужно заполнить ваш materialList[] односторонний

for(var i=0; i<100; i++) {
    color = new THREE.Color( 0xffffff );
    color.setHex( Math.random() * 0xffffff );
    materialList.push(new THREE.MeshBasicMaterial({ color: color }));
}

курс, ваша функция random[n] должна возвращать что-то между [0-99]

...