我正在尝试将转换应用于 STL 文件中的 3D 对象(不创建结构化网格对象)。以下是我的操作步骤:我在 STL 文件中一一读取法线和面信息,将我的变换应用于每个顶点和面法线,然后将新的计算值写回另一个 STL 文件中。生成的文件中的顶点正常,但我的法线错误。似乎我不能像对顶点一样将变换应用于法线。这怎么可能??
jumar
问问题
441 次
5 回答
2
你应该看看转换法线。
实际上,杰夫,你只说对了一部分。对于矢量,你是对的。但是对于一个法线,它的含义有点不同,你必须通过上面的 3x3 进行变换,然后反转,然后转置。
于 2008-11-10T18:34:37.833 回答
2
您可以对两者应用几乎相同的转换,但请记住以下两点:
- 法线是方向,因此不应应用 4x4 矩阵的位置部分。为了避免应用它,您可以在与矩阵相乘之前将向量格式化为 Vector(x,y,z,0),或者使用专用的 TransformVector() 函数来避免指令最终与零相乘。
- 如果您应用的矩阵包含比例,您的法线也会被缩放,这意味着,如果您执行典型的 NL 照明点积,您的结果将比应有的更亮或更暗。通常,您希望在应用变换后重新归一化,或确保变换不会对法线进行反归一化(这就是矩阵的反转置的用途。)
于 2008-11-10T19:27:54.607 回答
1
变换向量与变换点不同——不能应用变换,只能应用旋转。
于 2008-11-10T17:22:26.717 回答
1
引用 Rodrigo Lopez:法线是方向,因此不应该真正应用 4x4 矩阵的位置部分,尽管重整化无论如何都会修复它。
重整化不会解决它:假设法线是 (1,0,0) 然后用 (-2,0,0) 翻译它 => 法线将是 (-1,0,0) 这是规范化的并且是错误的,因为法线应该保持不变。
于 2008-11-10T19:40:57.763 回答
-1
您需要将矩阵的反转置应用于法线,而不是使用原始矩阵。
此外,在转换法线时,您需要将法线的 w 坐标视为 0(而不是点的 1)。
于 2008-11-10T19:12:27.243 回答