在three.js中更新缓冲区几何的正常

问题描述:

我有两个圆柱在一端相交。我可以单独更改交叉点的半径,但仍然会在一端满足,如下所示。但是,我希望这两者之间的交集很平滑,或者换句话说,它们的交点中的法线将如此处所述进行共享:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/。 我已将普通更新设置为TRUE,并且还将法线的所有y分量更改为零。它仍然没有表现出平滑的交叉点。这两个圆柱体由BufferGeometry制成。 enter image description here在three.js中更新缓冲区几何的正常

我的代码,从而部分是更重要的:1-由于几何形状是BufferGeometry,我使用下面前两个命令为两个几何创建法线:

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; 
} 

当我让程序显示法线,法线的Y分量为0,但是几何形状不顺畅呢。

+0

显示您的代码。 – WestLangley

+0

谢谢WestLangley。请参阅添加链接中的代码。 – Hesamoy

+0

请在你的帖子中分享你的代码(最好是一段代码)。如果jsfiddle被删除,那么你的问题的背景就会消失。 – TheJim01

我认为唯一可行的方法就是焊接这些点。您需要检查重复项,并为它们分配相同的索引。使用这些indecis进行三角测量和顶点法线计算。

+0

只要法线调整正确,您在技术上不需要组合几何图形。这里有一个例子,两个单独的网格几乎没有碰触,但因为我调整了它们的法线而显得平滑。 https://jsfiddle.net/TheJim01/gnoxeoem/ – TheJim01

+0

如果你知道他们需要什么,你可以明确地设置它们。对于更一般的解决方案,您需要以某种方式告诉那些他们需要平均的脸部。 – pailhead

+0

我更新了我的例子来计算它们。当然,我的例子很简单。对于像Hesamoy试图做的事情,需要为某个位置的所有顶点收集法线,对其进行平均,然后将平均值应用于缓冲区内所有引用的正常位置。甚至可以使用现有的指标来提供帮助。是的,人们可以通过删除重复项来提高缓冲区的效率,但仍然需要做一堆交叉产品才能获得法线刚刚失效的顶点的所有面法线。最好单独留下索引。 – TheJim01