2015-02-21 3 views
0

Я использую Three.js для отображения линии частицы после случайного блуждания. Поскольку геометрия не может быть увеличена динамически, я удаляю строку из сцены, изменяя геометрию и добавляя новую строку к сцене. Вот соответствующий код:Повторное использование модифицированной геометрии Three.js

var step = .5; 

var material = new THREE.LineBasicMaterial({ color: 0x0077ff }); 
var geometry = new THREE.Geometry(); 
geometry.vertices.push(new THREE.Vector3(0,0,0)); 
scene.add(new THREE.Line(geometry, material)); 

var render = function() { 
    requestAnimationFrame(render); 
    renderer.render(scene, camera); 
    controls.update(); 
} 

function addStep() { 
    scene.remove(scene.children[1]); 
    last = geometry.vertices[ geometry.vertices.length - 1 ]; 
    geometry.vertices.push(new THREE.Vector3(last.x + (2*Math.random()-1)*step, 
     last.y + (2*Math.random()-1)*step, last.z + (2*Math.random()-1)*step)); 
    scene.add(new THREE.Line(geometry.clone(), material)); 
} 

setInterval(addStep, 500); 
render(); 

Эти коды работают, но только при клонировании геометрии на каждом шаге. Если последняя строка addStep() изменяется на

scene.add(new THREE.Line(geometry, material)); 

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

Предположительно, мне не хватает чего-то простого в отношении графических буферов или назначений переменных, но я был бы признателен, если бы кто-нибудь мог объяснить, почему измененная геометрия не может быть повторно использована без клонирования.

+0

См. Https://github.com/mrdoob/three.js/wiki/Updates для получения некоторых советов. Не должно быть причин удалить вашу геометрию со сцены. – WestLangley

+0

@WestLangley Я понимаю, что я могу построить линию с заданным количеством точек и отображать их по одному, но это означает фиксированное количество шагов. Для открытого номера мне нужно воссоздать линию, и вопрос в том, почему геометрия просто не может быть повторно использована без клонирования. –

ответ

0

@PaulMasson Вот jsFiddle с адаптацией кода:

http://jsfiddle.net/theo/u6y4n67q/

function addStep() { 

    vertices = geometry.vertices; 
    last = vertices[ vertices.length - 1 ]; 
    vertices.push( 

     new THREE.Vector3( 
     last.x + (2 * Math.random() - 1) * step, 
     last.y + (2 * Math.random() - 1) * step, 
     last.z + (2 * Math.random() - 1) * step) 

    ); 

    geometry = new THREE.Geometry(); 
    geometry.vertices = vertices; 

    scene.remove(line); 
    line = new THREE.Line(geometry, material) 
    scene.add(line); 

} 

Единственное отличие в том, что этот фрагмент использует new THREE.Geometry() вместо клона.

Я предполагаю, что геометрия Three.js тесно связана с ее представлением в геометрии буфера. Таким образом, единственный способ редактировать геометрию - это клонировать ее или ее новую.

Смежные вопросы