在Maxscript中转换法线

时间:2018-05-17 16:22:16

标签: transformation maxscript scaletransform

我想缩放法线(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

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

3 个答案:

答案 0 :(得分:0)

我在maxscript中使用了BigMatrix类型。然而,它需要矩阵* 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

答案 1 :(得分:0)

如果要应用的矩阵是正交的,则不需要使用逆+转置步骤。否则,您只需要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]

答案 2 :(得分: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对象,它被建模为一个立方体,然后应用了Edit Normals,然后将对象缩放为一个矩形。右侧是一个Box对象,最初在应用Edit Normals之前建模为矩形。视口中的法线看起来不同,并且视口和渲染中的着色都不同。

enter image description here