gpt4 book ai didi

matrix - 对象空间中不是法线(从 NORMAL semantic 读取)吗?

转载 作者:行者123 更新时间:2023-12-01 15:34:05 25 4
gpt4 key购买 nike

当将法线从对象空间转换到世界空间时,预定义矩阵 _Object2World 就像一个魅力:(mul(_Object2World, normal))。旋转和缩放(均匀地)都通过行和列中的颜色检查元素给出了预期的矩阵,但是为什么有些代码使用法线左乘逆矩阵 _World2Object 进行对象空间转换,这是一个统一版本的东西(我使用的是 4.5 .2) 或者法线存在于物体空间以外的其他空间,为什么这两个矩阵不响应非均匀缩放。

最佳答案

aren't normals (read from NORMAL semantic ) in object space

是的,他们是。

the normals do live in some other space other than object space, and why do the two matrices not respond to non-uniform scaling.

没有空间是相同的,但在一般情况下(不是统一的)非 orthogonal matrix不能正确变换法线。

如果您想在一般情况下执行正确的正态变换,您需要使用逆转置 矩阵。 (在统一着色器中,这相当于 mul(normal,_World2Object)

_Object2World works like a charm :(mul(_Object2World, normal)). both rotation and scaling (uniformly) gave the expected matrix through color checking elements in rows and columns

这个解释起来有点棘手(希望没记错)。您可以假设比例总是统一的,因为Unity(至少在 4.x 版本之前是这样。我认为它会在 5.x 中发生变化)不适用非统一比例在顶点着色器中,但预先变换网格 CPU 端。

为着色器提供了以下制服:

  • _Object2World:包含包含比例的世界矩阵
  • unity_Scale:w 分量包含均匀比例因子的倒数 (w = 1/scale)
  • _World2Object:包含无比例的逆世界矩阵

为了正确地将法线从物体空间转换到世界空间,您有 3 种可能性:

  • 转换缩放法线:float3 worldN = mul((float3x3)_Object2World, SCALED_NORMAL);
  • 如果你在变换后规范化法线,你可以避免使用缩放法线(可能这就是你的情况,否则据我所知,变换不应该是 100% 正确的)
  • 使用逆转置:mul(normal,_World2Object)

SCALED_NORMAL 是这样定义的:

#define SCALED_NORMAL (v.normal * unity_Scale.w)

关于matrix - 对象空间中不是法线(从 NORMAL semantic 读取)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25609762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com