在three.js中更新bufferGeometry中的法线

在three.js中更新bufferGeometry中的法线,three.js,buffer-geometry,Three.js,Buffer Geometry,我有两个圆柱体在一端相交。我可以单独更改交叉点的半径,但它们仍在一端相交,如下所示。但是,我希望这两者之间的相交是平滑的,或者换句话说,它们在相交处的法线是共享的,如下所述:。 我已将法线更新设置为TRUE,并将相交处法线的所有y分量都更改为零。它仍然没有显示出平滑的交叉点。这两个圆柱体由缓冲几何体制成 因此,我的代码中更重要的部分是:1-由于几何体是缓冲几何体,因此我使用以下两个命令首先对两个几何体创建法线: comp.mesh.geometry.computeFaceNormals(); c

我有两个圆柱体在一端相交。我可以单独更改交叉点的半径,但它们仍在一端相交,如下所示。但是,我希望这两者之间的相交是平滑的,或者换句话说,它们在相交处的法线是共享的,如下所述:。 我已将法线更新设置为TRUE,并将相交处法线的所有y分量都更改为零。它仍然没有显示出平滑的交叉点。这两个圆柱体由缓冲几何体制成

因此,我的代码中更重要的部分是:1-由于几何体是缓冲几何体,因此我使用以下两个命令首先对两个几何体创建法线:

comp.mesh.geometry.computeFaceNormals();
comp.mesh.geometry.computeVertexNormals();
2-由于两个几何体的顶点数相同,我将所有顶点的y分量设置为0:

for (i=0;i<comp.mesh.geometry.attributes.position.array.length;i++){
comp.mesh.geometry.attributes.normal.array[i*3 + 1]  = 0;
comp1.mesh.geometry.attributes.normal.array[i*3 + 1]  = 0;
}

for(i=0;i我认为唯一可行的方法是焊接这些点。您需要检查重复的点,并为它们指定相同的索引。使用这些索引进行三角测量和顶点法线计算。

显示您的代码。谢谢WestLangley。请在添加的链接中查看代码。请在您的帖子中共享您的代码(最好作为片段)。如果删除了JSFIDLE,则问题的上下文也随之消失。只要法线调整正确,技术上不需要组合几何体。下面是一个示例,其中两个单独的网格几乎不接触,但由于我调整了它们的法线,所以看起来很平滑。如果您知道它们是什么,则可以显式设置它们在他们需要的时候。为了更一般的解决方案,你需要告诉那里的顶点他们需要平均的面。我更新了我的例子来计算它们。当然,我的是一个非常简单的例子。对于像Hesamoy试图做的事情,你需要收集一个位置上所有顶点的法线,平均它们,然后将平均值应用于缓冲区内所有引用的法线位置。甚至可以使用现有索引提供帮助。是的,可以通过删除重复项来提高缓冲区的效率,但仍然需要执行一系列叉积来获取法线刚刚失效的顶点的所有面法线。最好是只剩下屋檐了。