在 Maxscript 中转换法线

Transforming Normals in Maxscript

我想缩放法线(Point3 值)所以我相信我必须创建一个缩放矩阵然后使用它的逆转置来缩放法线。这就是我通常对 4x4 齐次矩阵所做的。但是 maxscipt 使用 3x3 矩阵和第 4 行进行翻译。我该怎么做转型? Max 脚本允许我创建比例矩阵并将其反转。但是它说没有 matrix3 值的转置方法。

这是失败的代码:

smat = scaleMatrix [1, 2, 3]
smat = inverse smat
smat = transpose smat -- No transpose function for matrix3
p = p * smat

我还想知道法线是否会改变方向,即使它们所属的表面缩放不均匀。我的直觉说不:)

我在 maxscript 中使用了 BigMatrix 类型。但是它需要一个 matrix * Point3 乘法方法。我也写了

-- constructing the scale matrix
smatrix = bigMatrix 3 3
smatrix[1][1] = sx
smatrix[2][2] = sy
smatrix[3][3] = sz

invert smatrix
transpose smatrix

function bigMulti m v =
(
  local p = [0, 0, 0]
  p.x = m[1][1] * v.x + m[2][1] * v.y + m[3][1] * v.z
  p.y = m[1][2] * v.x + m[2][2] * v.y + m[3][2] * v.z
  p.z = m[1][3] * v.x + m[2][3] * v.y + m[3][3] * v.z

  p = normalize p
  return p
)

-- lets say we want to transform this normal [0, 1, 0]
normal = [0, 1, 0]
normal = bigMulti smatrix normal

如果您要应用的矩阵是正交矩阵,则不需要逆+转置步骤。否则,您只需要转置 3x3 部分:

fn transpose3x3 TM =
        matrix3 [TM.row1[1], TM.row2[1], TM.row3[1]] \
                [TM.row1[2], TM.row2[2], TM.row3[2]] \
                [TM.row1[3], TM.row2[3], TM.row3[3]] [0, 0, 0]

对于您的第一个问题,如果您只想缩放法线,为什么不能通过单个浮点数或三组浮点数而不是矩阵来缩放?

x = [1,2,3]
x*2          -- yields [2,4,6]
x*[2,3,4]    -- yields [2,6,12]

对于你的第二个问题,非均匀比例确实是法线的问题。尽管“编辑法线”修改器在缩放对象前后会报告相同的值,$Box001.modifiers[1].getNormal 1 node:$Box001,但在视口和渲染中您可以看到法线被拉伸了。这就是为什么艺术家被告知永远不要使用非均匀缩放的原因之一。

左边是一个建模为立方体的 Box 对象,然后应用编辑法线,然后将对象缩放为矩形。右侧是在应用“编辑法线”之前最初建模为矩形的 Box 对象。法线在视口中看起来不同,阴影在视口和渲染中也不同。