diff --git a/src/Converter/Feature2Mesh.js b/src/Converter/Feature2Mesh.js index 263ee2f99c..b720e43046 100644 --- a/src/Converter/Feature2Mesh.js +++ b/src/Converter/Feature2Mesh.js @@ -274,8 +274,29 @@ function featureToPolygon(feature, options) { const geomVertices = vertices.slice(start * 3, end * 3); const holesOffsets = geometry.indices.map(i => i.offset - start).slice(1); + const normal = new THREE.Vector3(0, 0, 0); + for (let i = 1; i < count; i++) { + normal.x += (geomVertices[3 * (i - 1) + 1] - geomVertices[3 * i + 1]) * + (geomVertices[3 * (i - 1) + 2] + geomVertices[3 * i + 2]); + normal.y += (geomVertices[3 * (i - 1) + 2] - geomVertices[3 * i + 2]) * + (geomVertices[3 * (i - 1) + 0] + geomVertices[3 * i + 0]); + normal.z += (geomVertices[3 * (i - 1) + 0] - geomVertices[3 * i + 0]) * + (geomVertices[3 * (i - 1) + 1] + geomVertices[3 * i + 1]); + } + normal.normalize(); + const pt0 = new THREE.Vector3(geomVertices[0], geomVertices[1], geomVertices[2]); + for (let i = 1; i < count; i++) { + const ptIn = new THREE.Vector3(geomVertices[3 * i], + geomVertices[3 * i + 1], + geomVertices[3 * i + 2]); + let v = ptIn - pt0; + v -= normal.dot(v) * normal; + const ptOut = ptIn + v; + geomVertices[3 * i] = ptOut.x; + geomVertices[3 * i + 1] = ptOut.y; + geomVertices[3 * i + 2] = ptOut.z; + } const triangles = Earcut(geomVertices, holesOffsets, 3); - const startIndice = indices.length; indices.length += triangles.length;