我想缩放法线(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
我也想知道法线是否会改变方向,即使它们所属的表面非均匀地缩放。我的声明说不:)
答案 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之前建模为矩形。视口中的法线看起来不同,并且视口和渲染中的着色都不同。