平铺地形法线

时间:2013-02-13 22:36:55

标签: three.js

我正在尝试在ThreeJS中创建地形解决方案,并且我遇到了法线生成的一些麻烦。我正在使用THREE.PlaneGeometry类创建一些网格对象来解决这个问题。一旦创建了所有的图块,我会遍历每个图块并设置UV,以便每个图块代表整体的一部分。我还生成顶点Y位置的高度值以创建一些山丘。然后我调用几何函数

geometry.computeFaceNormals(); 
geometry.computeVertexNormals();

这样我每个图块都有一些默认的面和顶点法线。

然后我浏览每个图块并尝试平均每个角落的法线。

问题是(我认为)与法线有关,但我真的不知道该怎么称呼这个问题。平面角上的每个法线指向与创建时的面相同的方向。这使得地形看起来像一个平面阴影对象。为了防止这种情况,我想也许我需要做的是确保每个椎骨正常(每个角落)具有与其近邻法线相同的平均法线。 I.E每个瓦片的每个角落与相邻平面周围的所有直线法线具有相同的法线。

图A. enter image description here

在这里,我可视化网格上的4个法线中的每一个。你可以看到,在每个角落,法线是相同的(在彼此的顶部)

图B. enter image description here

EDIT 图C. enter image description here

EDIT 图D. enter image description here

除非顶点都共享相同的法线,否则它仍会出现所有块状<:/

我不知道怎么做......我认为我对需要做的事情的理解是不正确的??

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

对于应该发生的事情,你基本上是正确的。你得到的阴影与连续法线不一致。如果给定位置的每个顶点面都具有相同的法线,则不应在第二个图像中看到清晰的阴影不连续点。然而,图像看起来也不像简单的面部法线,至少在我看来不是这样。

要了解的几件事情:

1)我注意到你的四边形本身并不是平面的。您的算法是否可能假设它们是?非平面四边形网格没有真正的“正常”用作基础。

2)你的标准化后你的标准化是否正常化?也就是说,它们的矢量长度是1吗?

3)您是否确信正常的平均代码实际上使用了正确的法线平均值?这里的阴影看起来不像是完全平坦的阴影图像,其中四边形中的每个顶点面法线都是相同的 - 如果是这样的话,你会在每个四边形上获得一致的阴影,尽管四边形不是连续的。这可能你的原始顶点面法线实际上不是与面法线对齐吗?

4)尝试关闭凹凸贴图以进行调试。根据着色器中凹凸的执行方式,您可能会使用不正确的binormals / bitangents而不是错误的vert法线。

答案 1 :(得分:1)

不是在每个顶点/角处平均邻域法线,而是应该平均每个顶点具有的四个法线(每个顶点处有4个瓦片相交)。