我的方法是分别计算平行于轴X和Y的两个切向量.然后计算叉积以找到法向量.
切线向量由两条最近段上的中点交叉的线给出,如下图所示.

我想知道是否有更直接的计算,或者在CPU周期方面更便宜.
我已经合法地完成了所有可能的研究,而这只是简单地计算每个相邻面的表面法线.计算表面法线很容易,但是如何找到每个顶点的相邻面?你用什么样的存储空间?我错过了什么吗?为什么每个人都这么容易.
任何指导将不胜感激.
我在网上看了很长时间,找不到这个问题的答案。为简单起见,让我们假设我需要完全平滑一组连接面的法线。我想找到一组向量之间的实际几何平分线,忽略重复的法线并保持三角形汤的准确性。基本上,它需要:
我似乎找到的最常见的法线平滑公式是,通过将法线向量相加并除以三来简单地平均它们;例子:
normalize((A + B + C) / 3);
Run Code Online (Sandbox Code Playgroud)
当然除以三是没有用的,这已经代表了人们提出的天真、自以为是的蛮力平均法的氛围;与此有关的问题还在于,即使是三角形汤和平行法线,它也会把时间弄得一团糟。
我似乎发现的另一个评论是保留初始“面”法线,因为它们来自生成它们的常见交叉乘法运算,因为这样它们(有点)相对于三角形的面积加权。在某些情况下,这可能是您想要做的事情,但是我需要纯平分线,因此面积不能影响公式,即使考虑到它,它仍然会被三角汤弄乱。
我看到了一个提到的方法,它说对相邻面之间的角度进行加权,但我似乎无法正确实施该公式 - 要么是那样,要么不是我想要的。然而,这对我来说很难说,因为我找不到一个简洁的解释,而且我的头脑因所有这些浪费的头脑风暴而变得麻木。
有人知道通用公式吗?如果有任何帮助,我正在使用 C++ 和 DirectX11。
编辑:这里有一些类似的问题,描述了一些方法;
还有这篇文章:http : //www.bytehazard.com/articles/vertnorm.html
不幸的是,我尝试的实现不起作用,我找不到关于哪个公式实际上是我需要的一个清晰、简洁的声明。经过反复试验,我终于发现按角度加权是正确的方法,只是我无法正确实现它;因为它现在似乎正在工作,所以我将在下面添加我的实现作为答案。
我的高度图计算法线有一个小问题.它有一种奇怪的行为.在较高点和较低点,法线很好,但在中间它们似乎是错误的.它们被点光照亮.
已删除未修复的源
编辑:尝试了两种新方法:
这是正常的.它看起来很好,但你看到单面.
Position normal = crossP(vectorize(pOL, pUR), vectorize(pOR, pUL));
Run Code Online (Sandbox Code Playgroud)
我也尝试用这种方式按顶点做,但也有一个奇怪的输出.
这是Nico提出的建议:
它看起来也很奇怪.也许我如何计算帮助点是错误的.
已删除未修复的源
编辑2:我的点的定义:OL,OR,UL,UR是要绘制的平面的角顶点.
postVertPosZ1 postVertPosZ2
preVertPosX1 pOL pOR postVertPosX1
preVertPosX2 pUL pUR postVertPosX2
preVertPosZ1 preVertPosZ2
Run Code Online (Sandbox Code Playgroud)
EDIT3:
我现在解决了.这是一个愚蠢的错误:我忘了将帮助顶点的y值乘以高度乘数,并且必须更改一些值.
我写了几个Android应用程序,但这是我第一次使用3D编程.
我创造了一个房间(4个墙壁,天花板和地板),里面有几个物体,能够像走路一样移动相机.我用各种图像纹理所有表面,一切都按预期工作.
根据具体情况,房间宽14个单位,深16个单位(以原点为中心),高3个单位(原点1个,下面2个).房间中间有两个物体,一个立方体和一个倒金字塔.
然后我去添加一个光源来遮蔽立方体和金字塔.我读过并关注了几个NeHe的端口,所以我把我在课程中工作的内容用于照明并将其应用到我的新代码中.
gl.glEnable(GL10.GL_LIGHTING);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, new float[] { 0.1f, 0.1f, 0.1f, 1f }, 0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, new float[] { 1f, 1f, 1f, 1f }, 0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, new float[] { -4f, 0.9f, 6f, 1f }, 0);
gl.glEnable(GL10.GL_LIGHT0);
Run Code Online (Sandbox Code Playgroud)
结果是立方体和金字塔没有阴影.它们在与光相对的两侧看起来和在面对它时一样.当摄像机直接指向远离光源时,房间看起来就像我添加照明代码之前一样.当我将相机旋转到面向光源时,整个房间(包括物体)会变暗,直到相机直接面向光源时全黑.
这里发生了什么?我阅读了很多关于灯光及其工作原理的文章,但我没有看到任何迹象表明为什么这不会照亮房间的所有侧面,立方体和金字塔根据灯光位置着色.是否有一些预期的光线行为,因为它在房间"内部"?我只是因为我是新手而错过了一些简单的东西吗?