将变换应用于3D模型 - 法线pb

时间:2008-11-10 17:16:15

标签: 3d geometry transform

我正在尝试将变换应用于STL文件中的3D对象(不创建结构化网格对象)。以下是我的工作方式:我在STL文件中逐个读取法线和面信息,将我的变换应用于每个顶点和面法线,并在另一个STL文件中写回新的计算值。 生成的文件中的顶点是正常的,但我的法线错了。似乎我不能像往常一样将变换应用于法线。怎么可能?

5 个答案:

答案 0 :(得分:2)

你应该看看transforming normals

实际上,杰夫,你只是部分正确。对于矢量,你是对的。但是对于一个正常的,意思是有点不同,你必须通过上面的3x3变换,但是反转,然后换位。

答案 1 :(得分:2)

您可以为两者应用几乎相同的转换但请记住以下两点:

  • 法线是方向,所以 不应该应用4x4矩阵的位置部分。为了避免应用它,你可以在与矩阵相乘之前将矢量格式化为Vector(x,y,z,0),或者使用专用的TransformVector()函数来避免最终乘以零的指令。
  • 如果你申请的矩阵包含一个比例,你的 正常也会缩放, 意思是,如果你做了典型的 N.L照明点产品您的结果 将比它更亮或更暗 应该。通常你想要 应用后重新规范化 变换,或确保 变换不会使规范化 正常(这是什么的 矩阵的逆转置是 为。)

答案 2 :(得分:1)

变换矢量与变换点不同 - 您不能应用变换,只能应用旋转。

答案 3 :(得分:1)

  

引用Rodrigo Lopez:法线是方向,所以4x4矩阵的位置部分不应该真正应用,但重新规范化无论如何都会修复它

重整化不会修复它:假设法线是(1,0,0)然后将其翻译为(-2,0,0)=>正常将是(-1,0,0),它被归一化并且是错误的,因为法线应该保持不变。

答案 4 :(得分:-1)

您需要将矩阵的反转置应用于法线,而不是使用原始矩阵。

此外,在转换时,您需要将法线的w坐标视为0(而不是像点一样)。