7

所以我有一个几何(这段代码的范围是 THREE.Geometry.prototype),我正在动态编辑。newData 是 { faces: [array of face Indexes], vertices: [array of vertice index]} 的对象。(这些数组保持原点面的长度和顶点数组的长度并保持形式 [null, null, null, "4", "5", null, null... ])

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

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

我试过顶点需要更新,它什么也没做。

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

我听说无法调整缓冲区的大小。缓冲区和缓冲区的长度是多少?我给模型的verticies数量?

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

谢谢你的时间!

        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);
4

2 回答 2

1

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

于 2015-02-15T20:53:16.983 回答
0

也许从教程连接到这一点:

“我只是想快速指出 Three.js 的一个小问题,例如,如果您修改网格的顶点,您会在渲染循环中注意到没有任何变化。为什么?因为 Three.js (据我所知)将网格的数据缓存为某种优化。您实际需要做的是向 Three.js 标记某些已更改的内容,以便它可以重新计算所需的任何内容。您可以使用以下:

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

sphere.geometry.dynamic = true;

//改变顶点

sphere.geometry.__dirtyVertices = true;

// 更改为法线

sphere.geometry.__dirtyNormals = true;"

于 2013-04-26T10:54:35.913 回答