我正试图修复一个负比例的动画模型(我知道,这可能是个坏主意)。在查看max脚本中的转换时,我注意到了一些有趣的东西,它可能与3ds max中左手坐标系的内部使用有关。我比较了节点的转换和节点的PRS值:我的期望是,通过乘以PRS-值,我也应该得到这个转换。但是,如果对象被旋转或镜像,则情况不是这样,请参见:
$.transform =
row1 [0.866,-0.500,0.000]
row2 [-0.500,-0.866,0.000]
row3 [0.000,0.000,1.000]
row4 [13.000,-3.000,1.000]
...scale * ...rotation * ...pos =
row1 [-0.866,0.500,0.000]
row2 [-0.500,-0.866,0.000]
row3 [0.000,0.000,-1.000]
row4 [13.000,-3.000,1.000]
...transform.scalepart * ...transform.rotationpart * ...transform.translationpart =
row1 [-0.866,0.500,0.000]
row2 [0.500,0.866,0.000]
row3 [0.000,0.000,-1.000]
row4 [13.000,-3.000,1.000]
任何想法,为什么这些转换是不一样的?我正在努力了解3ds max如何在引擎盖下工作。非常感谢您的洞察力!
发布于 2018-04-14 22:12:24
这里发生了一些事情。
首先,MaxScript $.transform.scalepart
和$.transform.rotationpart
似乎被窃听了,不支持逆比例。这些可能与这个职位上的第一个答案类似,后者总是给出正的标度坐标,而对于负标度矩阵则给出错误的答案。
其次,当请求$.scale.controller.value
和$.rotation.controller.value
时,旋转部分也会被窃听,并返回与镜像前相同的值,而缩放则返回镜像值。如果你想一想(比例*旋转*位置)矩阵组合是如何工作的,你可以看到,例如,X中的一个镜子需要反转刻度的第一个分量,但也需要反转X轴周围的所有旋转。
显然(我在这里推测)镜像模式在应用时会做两件事。(1)它激活PRS控制器内部的特例处理,使得当将比例/旋转/变换子控制器值组合成一个矩阵时,它不进行真正的矩阵合成而翻转一些坐标。例如,X中的镜像反转变换矩阵前三行中每一行的第一个坐标,但否则PRS控制器需要预镜像的旋转值作为输入。(2)翻转标度子控制器值的分量。例如,X中的镜像反转第一个坐标。但旋转子控制器在不受影响。
所有这一切的结果是,当向MaxScript请求转换部分时,您将得到一个不正确的maxtrix组合。当直接组合位置/旋转/比例子控制器值时,也会得到不正确的组合。
您需要的是一种更好的方法来分解位置/旋转/缩放组件中的最终(正确)转换。下面是一个基于MaxScript的这里算法。它返回一个具有ScaleMatrix、RotationMatrix、PositionMatrix的数组,因此可以使用(result[1] * result[2]) * result[3]
再次获得原始转换。传递$.transform
作为输入。
fn matrixDecompose t =
(
trans = t.pos
trn = ( matrix3 [1,0,0] [0,1,0] [0,0,1] trans )
scaleX = length [ t[1][1], t[2][1], t[3][1] ]
scaleY = length [ t[1][2], t[2][2], t[3][2] ]
scalez = length [ t[1][3], t[2][3], t[3][3] ]
tempZ = cross t[1] t[2]
if( (dot tempZ t[3]) < 0 ) then
(
scaleX = -scaleX
t[1] = -t[1]
)
scl = ( matrix3 [scaleX,0,0] [0,scaleY,0] [0,0,scaleZ] [0,0,0] )
t[1] = normalize t[1]
t[2] = normalize t[2]
t[3] = normalize t[3]
rot = t.rotationPart as matrix3
#( scl, rot, trn )
)
https://stackoverflow.com/questions/49661750
复制相似问题