2014-06-25 56 views
0

我试着去动态地重建THREE.Line对象内部的一些几何形状简单three.js所应用程序,但由于某些原因,更新不会被触发。我给自己定的线作为动态对象,我设置了verticesNeedUpdate属性设置为true我每次更新几何,目前仍是行不更新。任何人都可以看到我在做什么错了吗?更新顶点()

// --------------------------------------------------------------------------------------- 
// line 
// --------------------------------------------------------------------------------------- 


function build_line(length) 
{ 
    var vertices = []; 
    for (i = 0; i < length; i++) 
    { 
     vertices.push(new THREE.Vector3(i * 2, 0, 0)); 
    } 

    return vertices; 
} 


var line_geo = new THREE.Geometry(); 


line_geo.vertices = build_line(3); 
line_geo.dynamic = true; 

console.log(line_geo); 


// simple 
material = new THREE.LineBasicMaterial({ 
    color: 0xffffff, 
    linewidth: 1, 
    linejoin: "mitre" 
}); 


var scene_object = new THREE.Line(line_geo, material); 

scene.add(scene_object); 



// --------------------------------------------------------------------------------------- 
// render loop 
// --------------------------------------------------------------------------------------- 

var current_length = 3 

var render = function() 
{ 
    current_length += 1; 
    line_geo.vertices = build_line(current_length); 
    line_geo.verticesNeedUpdate = true; 

    // draw! 
    requestAnimationFrame(render); 
    renderer.render(scene, camera); 
} 

render(); 

编辑

根据这个帖子

Adding geometry to a three.js mesh after render

你不能调整缓冲区的内容只有重新填充它。这页提到,您可以通过初始化缓冲超大守信colapsed或隐藏未使用的绿党

https://github.com/mrdoob/three.js/wiki/Updates

我不知道你究竟是如何做到这一点效仿调整缓冲区,我不能看到一个可视性标志或我用于verts的THREE.Vector3折叠标志。我尝试用空值替换矢量,但会引发错误。任何想法如何实现这一目标?

+0

看看http://stackoverflow.com/questions/17842521/adding-geometry-to-a-three-js-mesh -after-render回答你的问题。 – WestLangley

+0

的链接@WestLangley谢谢,我尝试了一些事情没有用,你可以在帖子编辑 –

+0

@WestLangley,这似乎是链接到这个网页,如果我没有记错 –

回答

0

在结束时,折叠可被理解为“在同一个地方”。 (可能还有其他的方式来理解它,虽然)

这将意味着你需要分配的最大长度

var vertices = []; 

function allocate_line(maxLength) 
{ 
    var vertices = []; 
    for (i = 0; i < maxLength; i++) 
    { 
     vertices.push(new THREE.Vector3(0, 0, 0)); 
    } 
} 

然后

function build_line(length) 
{ 
    for (i = 0; i < length; i++) 
    { 
     vertices[i].x = i * 2; 
    } 
    for (i = length; i <= maxLength; i++) 
    { 
     vertices[i].x = (length - 1) * 2; 
    } 
} 

也就是说,所有未使用的顶点设置为最后使用的一个的坐标。

这当然是一个快速和肮脏的实施,给你的想法..