我在从SphereGeomerty
删除重复顶点时遇到问题。我想摆脱几何体侧面的接缝,因为如果我更新顶点位置它就不能很好地对齐。
问题是我无法创建带有过滤顶点位置列表的新几何体,我得到了
[.Offscreen-For-WebGL-000001B883B499D0]GL ERROR :GL_INVALID_OPERATION : glDrawElements: attempt to access out of range vertices in attribute 0
错误。
更奇怪的是,如果我将原始顶点列表放回bufferGeometry,则不会呈现任何内容,但错误消失了:
let positions = sphere.attributes.position.array;
filteredGeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );
我像这样过滤顶点:
function removeDuplicateVertices(vertices) {
var positionLookup = [];
var final = [];
for( let i = 0; i < vertices.length-3; i += 3 ) {
var index = vertices[i] + vertices[i + 1] + vertices[i + 2];
if( positionLookup.indexOf( index ) == -1 ) {
positionLookup.push( index );
final.push(vertices[i])
final.push(vertices[i+1])
final.push(vertices[i+2])
}
}
return final;
}
答案 0 :(得分:1)
SphereBufferGeometry使用index-attribute。因此顶点数组不直接存储三角形而只存储点。三角形由附加的索引属性构成,该属性包含每个三角形的位置属性的三个索引。如果修改position-attribute,则必须相应地更新index-attribute。
或者您可以使用geometry.toNonIndexed()
转换&#34;位置+索引&#34;格式化为&#34;只是位置&#34;格式。
另请参阅Geometry.mergeVertices()
函数,该函数与您正在执行的操作完全相同,仅适用于常规(而非缓冲区)几何。
这个is also called在构建常规SphereGeometry时,可能已经有所帮助吗?