所以我有一个几何图形(这段代码的作用域是THREE.Geometry.prototype),并且我正在动态编辑。newData是{ faces:人脸索引数组,顶点:顶点索引数组}的对象。(这些数组保持原始面的长度和顶点数组的长度,并保持null,"4","5",null,null...)
使用这些数组,我剥离所有的面和顶点,并将它们应用于2个新数组中的1个,有效地将所有数据分成2组。我还更新了faces上的指针!
最后,我知道我已经更新了几何体,它是正确的,但我所做的更改没有显示出来。我已经尝试过.elementsNeedUpdate,它会导致错误。(在InitWebGlObjects中没有未定义的属性'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);
发布于 2015-02-15 20:53:17
最近我自己也遇到了这个问题。我发现,如果要向几何体添加顶点和面,则需要设置this.groupsNeedUpdate = true
,以便告诉渲染器更新其内部缓冲区。
发布于 2013-04-26 10:54:36
也许可以从this教程中连接到这一点:
“我只是想快速地指出Three.js的一个缺陷,那就是如果你修改了一个网格的顶点,你会注意到渲染循环中没有任何变化。为什么?因为Three.js (据我所知)缓存网格的数据是一种优化。你实际上需要做的是向Three.js标记某些东西已经改变了,这样它就可以重新计算它需要的任何东西。你可以用以下方法来完成:
//将几何体设置为动态,以便允许更新
sphere.geometry.dynamic =真;
//顶点的变化
sphere.geometry.__dirtyVertices =真;
//法线的变化
sphere.geometry.__dirtyNormals = true;"
https://stackoverflow.com/questions/16221366
复制