【发布时间】:2017-08-10 02:26:18
【问题描述】:
我正在尝试创建一种算法来计算模型/网格的法线。人们一直告诉我使用两个向量之间的叉积,起初这似乎是个好主意,直到我发现它可能并不总是有效。例如,想象一个盒子,它的正面位于原点,背面朝下 Z 轴。这是一张图片:
我为糟糕的笔迹道歉,但这不应该有任何意义。如您所见,我穿过 v 和 u 以获得指向正 z 轴的法线。但是,如果我使用相同的计算来计算背面的法线,那么显然法线将是指向形状内部的向量。结果是我有不准确的法线来计算灯光的亮度。我希望法线始终背对模型。
我知道必须有更好的方法来计算法线,但我不知道它是什么。谁能向我建议另一种算法来计算可以摆脱这个问题的法线?如果没有,那么必须有一种方法来检查法线是否面向对象/模型内部。如果是这样,那么您能否在答案中提出它以及我会在哪里找到关于它的解释,因为我很想对这些方法的工作原理有一个直觉。
【问题讨论】:
-
叉积总是有方向的。记住你的右手法则。如果
u x v给你一个指向意外方向的向量,那么v x u会给你一个大小相同但方向相反的向量。 -
叉积是有方向的,看起来你只是在错误的方向上得到了正确的向量。也许这只是代表人脸的点的存储顺序问题?
-
是的,问题确实发生在以错误的顺序存储我的脸,但我不知道如何检测它是否在飞机后面,然后以不同的方式存储顺序。我认为这是整个问题的开始。有什么建议我将如何检测到,因为这个点在另一个平面后面,那么也许我们只是反转叉积?
-
我的印象是,也许还有其他计算法线的方法可以知道,如果法线面向模型,则反转法线。
-
这是一个奇怪的问题,我首先想到的是用一个圆圈来封装对象,然后检查哪个法线(脸部的正面和背面)首先与它相交。但是,这不适用于复杂的形状。对于他们,我会尝试将它们导入 3DMax 或 Blender。