手动编辑几何后的三个JS没有可视化更新

时间:2013-04-25 17:47:12

标签: javascript three.js webgl

所以我有一个Geometry(这段代码的范围是THREE.Geometry.prototype),我正在动态编辑。 newData是{faces:[数组面索引],顶点:[顶点索引数组]}的对象。 (这些数组保持原始面的长度和顶点数组的长度,并保持形式[null,null,null,“4”,“5”,null,null ...])

使用这些数组,我将所有面和顶点剥离并将它们应用于2个新数组中的1个,有效地将所有数据拆分为2个组。我还更新了脸上的指针!

最后我知道我已经更新了几何图形并且它是正确的,但是我所做的更改没有显示出来。我尝试过.elementsNeedUpdate导致错误。 (在InitWebGlObjects中没有未定义的属性'a'我看了那里,看不到对a的引用)

我试过顶点需要更新,它什么都不做。

我还尝试将updateCentroids与之前的工具结合使用。它什么都不做。

我听说无法调整缓冲区的大小。什么是缓冲区和缓冲区的长度?我给模型的顶点数量?

我已经看过“你可以通过预先分配更大的缓冲区然后保持不需要的顶点折叠/隐藏来模拟调整大小。”听起来这可能就是我在做什么?如何折叠/隐藏顶点?我没有看到任何提及。

感谢您的时间!

        var oldVertices = this.vertices
        var oldFaces = this.faces;

        var newVertices = []
        var newFaces = [];

        var verticeChanges = [];

        this.vertices = [];
        this.faces = [];        


        for(var i in oldVertices){
            var curAr = ((newData.vertices[i]) ? (newVertices):(this.vertices));
            curAr.push(oldVertices[i]);
            verticeChanges[i] = curAr.length-1;
        }

        for(var i in oldFaces){
            var curAr = ((newData.faces[i]) ? (newFaces):(this.faces));
            oldFaces[i].a = verticeChanges[oldFaces[i].a];
            oldFaces[i].b = verticeChanges[oldFaces[i].b];
            oldFaces[i].c = verticeChanges[oldFaces[i].c];
        }
        console.log('Vertices Cut from', oldVertices.length, "to:", newVertices.length, 'and', this.vertices.length);
        console.log('Faces Cut from', oldFaces.length, "to:", newFaces.length,  'and', this.faces.length);

2 个答案:

答案 0 :(得分:1)

我最近遇到了这个问题。我发现如果我在几何体中添加顶点和面,我需要设置this.groupsNeedUpdate = true以告诉渲染器更新它的内部缓冲区。

答案 1 :(得分:0)

也许从this教程:

连接到这一点
  

“我只是想快速指出Three.js的快速问题,其中   如果你修改,例如,网格的顶点,你会   在渲染循环中注意没有任何变化。为什么?好吧因为   Three.js(据我所知)将网格数据缓存为   一些优化。你真正需要做的是标记   对于Three.js来说,某些东西已经改变,所以它可以重新计算任何东西   它需要。您可以使用以下命令执行此操作:

     

//将几何图形设置为动态,以便允许更新

     

sphere.geometry.dynamic = true;

     

//更改顶点

     

sphere.geometry .__ dirtyVertices = true;

     

//更改法线

     

sphere.geometry .__ dirtyNormals = true;“