首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Maxscript:编写转换

Maxscript:编写转换
EN

Stack Overflow用户
提问于 2018-04-04 23:06:02
回答 1查看 1.1K关注 0票数 1

我正试图修复一个负比例的动画模型(我知道,这可能是个坏主意)。在查看max脚本中的转换时,我注意到了一些有趣的东西,它可能与3ds max中左手坐标系的内部使用有关。我比较了节点的转换和节点的PRS值:我的期望是,通过乘以PRS-值,我也应该得到这个转换。但是,如果对象被旋转或镜像,则情况不是这样,请参见:

代码语言:javascript
运行
复制
  $.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如何在引擎盖下工作。非常感谢您的洞察力!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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作为输入。

代码语言:javascript
运行
复制
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 )
)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49661750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档