3d 将变换应用于三维模型-法线pb

3d 将变换应用于三维模型-法线pb,3d,geometry,transform,3d,Geometry,Transform,我正在尝试对STL文件中的3D对象应用变换(不创建结构化网格对象)。下面是我如何进行的:我在STL文件中逐个读取法线和面信息,将变换应用于每个顶点和面法线,并在另一个STL文件中写回新的计算值。 生成的文件中的顶点正常,但法线错误。似乎我不能像对vertice那样对法线应用变换。这怎么可能呢?变换向量不同于变换点——你不能应用变换,只能应用旋转。变换向量不同于变换点——你不能应用变换,只能应用旋转。你应该看看 事实上,杰夫,你只是部分正确。对于向量,你是对的。但是对于一个意义上有点不同的法线,你

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

变换向量不同于变换点——你不能应用变换,只能应用旋转。

变换向量不同于变换点——你不能应用变换,只能应用旋转。

你应该看看

事实上,杰夫,你只是部分正确。对于向量,你是对的。但是对于一个意义上有点不同的法线,你必须通过上面的3x3进行变换,但要反转,然后转置。

你应该看看


事实上,杰夫,你只是部分正确。对于向量,你是对的。但是对于法线,这在意义上有点不同,您必须按上3x3进行变换,但要反转,然后进行转置。

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


此外,在变换法线时,您需要将其w坐标视为0(而不是点的1)。

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


此外,在变换法线时,您需要将其w坐标视为0(而不是将点视为1)。

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

  • 法线是方向,因此 不应应用4x4矩阵的位置部分。为了避免应用它,可以在与矩阵相乘之前将向量格式化为向量(x、y、z、0),或者使用专用的TransformVector()函数来避免最终与零相乘的指令
  • 如果应用的矩阵包含比例,则 正常值也将被缩放, 也就是说,如果你做了典型的 N.L.照明点产品-您的结果 将比它亮或暗 应该是。通常你会想 在应用 转换,或确保 “变换”不会对对象进行反规格化 正常(这是 矩阵的逆转置是 为了)

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

  • 法线是方向,因此 不应应用4x4矩阵的位置部分。为了避免应用它,可以在与矩阵相乘之前将向量格式化为向量(x、y、z、0),或者使用专用的TransformVector()函数来避免最终与零相乘的指令
  • 如果应用的矩阵包含比例,则 正常值也将被缩放, 也就是说,如果你做了典型的 N.L.照明点产品-您的结果 将比它亮或暗 应该是。通常你会想 在应用 转换,或确保 “变换”不会对对象进行反规格化 正常(这是 矩阵的逆转置是 为了)
引用罗德里戈·洛佩兹(Rodrigo Lopez):法线是方向,所以4x4矩阵的位置部分不应该真正应用,尽管重整化无论如何都会解决它

重正化不会修复它:假设法线是(1,0,0),然后用(-2,0,0)=>平移它,法线将是(-1,0,0),这是规范化的,是错误的,因为法线应该保持不变

引用罗德里戈·洛佩兹(Rodrigo Lopez):法线是方向,所以4x4矩阵的位置部分不应该真正应用,尽管重整化无论如何都会解决它


重正化不会修正它:假设法线是(1,0,0),然后用(-2,0,0)=>平移它,法线将是(-1,0,0),这是标准化的,是错误的,因为法线应该保持不变。

值得赞扬的是,你应该注意,他所说的对于刚性变换(如旋转)是有效的(这似乎就是他所说的)。朱玛没有说出他所说的“变换”的确切含义……是的——用于旋转(和反射),转置是逆的,所以逆转置就是原始矩阵。是的,是各向异性的缩放杀死了你的法线,这就是为什么逆转置。值得赞扬的是,你应该注意,他所说的对刚性变换是有效的,比如旋转(这似乎是他所说的)jumar没有说出“变换”的确切含义…是的,对于旋转(和反射),转置是逆的,所以逆转置就是原始矩阵。是的,是各向异性缩放杀死了法线,这就是为什么逆转置。