从Three.js几何体

时间:2017-09-17 19:06:19

标签: javascript three.js

我在从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;
}

1 个答案:

答案 0 :(得分:1)

SphereBufferGeometry使用index-attribute。因此顶点数组不直接存储三角形而只存储点。三角形由附加的索引属性构成,该属性包含每个三角形的位置属性的三个索引。如果修改position-attribute,则必须相应地更新index-attribute。

或者您可以使用geometry.toNonIndexed()转换&#34;位置+索引&#34;格式化为&#34;只是位置&#34;格式。

另请参阅Geometry.mergeVertices()函数,该函数与您正在执行的操作完全相同,仅适用于常规(而非缓冲区)几何。 这个is also called在构建常规SphereGeometry时,可能已经有所帮助吗?