当使用ThreeCSG从其他网格减缩网格时,我遇到了一个问题。我的主要网目是一个戒指,而要做底衬的网格是一个钻石。在处理到场景之前,看起来是这样的:网格很细。,但是减去网格后,环变成了角:网眼断裂。我确实使用了和以前一样的材料/阴影。下面是我使用的代码:
var ring_bsp = new ThreeBSP(ring);
var stone_bsp = new ThreeBSP(stone);
var substract_bsp = ring_bsp.subtract( stone_bsp );
var result = substract_bsp.toMesh( ringMaterial );
result.geometry.computeVertexNormals();
result.material.needsUpdate = true;
result.geometry.buffersNeedUpdate = true;
result.geometry.uvsNeedUpdate = true;
result.scale.x = result.scale.y = result.scale.z = 19;
scene.remove(ring);
scene.add(result);更新一:如果删除“result.geometry.computeVertexNormals()”,则为;结果看起来甚至更糟:链接。
更新二:我创建了一个最小情况的小提琴
更新三:在查看了更多问题和Wilts上一次更新之后,我看到在使用ThreeBSP之后,顶点被搞乱了。您可以在这个小提琴中很好地看到这一点。
更新四:问题似乎在"fromGeometry / toGeometry“函数中,因为如果我完全不执行任何子操作,就会得到相同的破网格。
发布于 2014-09-21 13:29:40
它看起来像是(一些)你的顶点法线在翻译过程中迷路了(把你的几何图形翻译成CSG,然后再翻译回Three.js)。您应该查看源代码,看看哪里出了问题。
更新1:
我查看了ThreeCSG.js的源代码,似乎有第48行的一个错误。
它应该是:
vertex = new ThreeBSP.Vertex( vertex.x, vertex.y, vertex.z, face.vertexNormals[1], uvs );vertexNormals的索引应该是1而不是2。也许这个错误会导致错误的导出结果。
更新2:
在转换到CSG之前,尝试更新几何图形的vertexNormals:
var geometry = ring.geometry;
geometry.computeFaceNormals();
geometry.computeVertexNormals();备注.,您需要首先调用computeNormals()以获得正确的结果。
更新3:
在人脸从Three.js几何到CSG几何的转换中,ThreeBSP.Polygon.prototype.classifySide方法检查相邻面的顶点是否在正面、背面或共面到当前面。如果点是共面的,CSG面将被定义为一个有四个顶点点的面。由于这个过程,您的一些THREE.Face3被转换成一个四点CSG面。当稍后将其转换回THREE.Face3时,Face vertexNormals将与它们的初始值不同。
顶点被分类为FRONT,BACK或COPLANAR,使用一个EPSILON值来比较顶点法线和面法线。如果差值太小,则认为顶点是共面的。通过增加ThreeBSP库中的EPSILON值,您可以控制精度。如果您将EPSILON设置为10,则您的三角形将永远不会被视为共面,并且转换结果将是正确的。
因此,在ThreeBSP库集的第5行:
EPSILON = 10,https://stackoverflow.com/questions/25957050
复制相似问题