【问题标题】:Maxscript Spinner Value Driving Object RotationMaxscript Spinner 值驱动对象旋转
【发布时间】:2018-10-04 11:09:12
【问题描述】:

我正在尝试通过更改微调器的值来旋转我的 3ds max 场景中的助手。当前更改微调器的值确实会驱动助手旋转,并且旋转助手会更新微调器上的值。我的脚本仍有一些行为问题需要帮助解决。

1) 我希望助手的旋转仅发生在助手的局部欧拉 Z 轴上,但是目前它的旋转是不稳定的并且发生在多个轴上。

2) 我想将助手的旋转限制在 -90 到 90 度的范围内,目前它的旋转范围远不止于此。

我目前的代码如下。

Spin_R_Custom_attribute = attributes custom_Attributes
(
 rollout SpinRollout "Helper Controls"
 (

    Spinner TheSpinner "The Spinner" range:[-10,10,0] controller: $Helper_R_Spin.rotation.z_rotation.controller \

    on TheSpinner changed spin do 
    (
        try (in coordsys local $Helper_R_Spin.rotation.z_rotation = spin) catch ()
    )
 )
)

任何帮助将不胜感激。

【问题讨论】:

  • 如果您完全删除 on TheSpinner changed 子句,您的代码实际上似乎运行良好。正如您设置的那样,微调器已经通过其控制器链接到旋转。而且,我相信通过直接设置旋转控制器值,旋转应该始终在本地空间中,因为原始控制器值本质上是本地的。如果即使在视口中进行操作时也要防止移动超过 +-90 度,则可能必须应用动画约束或脚本控制器。
  • @MichaelsonB​​ritt:如果它是像列表控制器这样的嵌套控制器,则控制器值保证是本地的。

标签: 3dsmax maxscript


【解决方案1】:

要让控制器在本地空间中工作,您需要使用列表控制器的子控制器(就像冻结旋转/变换时创建的那样)。这样,您也根本不需要更改的处理程序(以及 try-catch,以及可以更改的 $Helper_R_Spin 路径名等),因为控制器将被实例化到微调器控制器。有关限制范围,请参阅 float_limit。

【讨论】:

  • 太棒了,这正是我需要做的,非常感谢。
  • 您对将 float_limit 附加到子控制器有什么建议吗?尝试将浮动限制附加到:$Helper_R_Heel.rotation.controller[2][#z_rotation] 每当我运行脚本时,都会收到“SubAnim:Zero_Euler_XYZ”错误的“No”“put”函数。
  • 那是因为你试图对子动画而不是控制器进行 assing。你最后缺少一个“.controller”。
  • 不幸的是,在完成后我意识到我有一些如何让这件事完全错误。 paramWire.connect2Way $Control_R_Foot.modifiers[1].custom_Attributes[#cust_z] $Helper_R_Heel.rotation.controller[2][#z_rotation] "z_rotation" "cust_z" $Helper_R_Heel.rotation.controller[2][#z_rotation].controller = float_limit enable:on lower_limit_enabled:on upper_limit_enabled:on lower_limit:-60.0 static_value: 0.0 upper_limit: 60.0 而不是限制控制器可以旋转的角度,这只是限制驱动旋转的微调器值。
  • 我需要改变什么,以便当微调器的值为 10 时,助手的 Z 旋转为 60,而当微调器的值为 -10 时,助手的 Z 旋转为- 60,当微调器值为 0 时,助手的 Z 旋转为 0,中间值是该范围的比例量,例如微调器 5 = 30 度?
【解决方案2】:

以这种方式连接参数的推荐技术是参数连线。

  • 自定义属性需要定义一个参数来保存值,而不仅仅是一个微调器。
  • 最后一段代码,"z_rotation" "cust_z" 实际上是一对从旋转值转换为微调器的方程,反之亦然。因此,如果您想以不同的单位显示微调器,您可以在此处输入其他数学。

例子:

targ = $Helper_R_Spin

-- In case of running this multiple times, start by deleting the cust attrib
if cust_attrib!=undefined then
    custAttributes.delete targ cust_attrib

cust_attrib = attributes cust_attribs
(
    parameters AttribParams rollout:AttribRollout
    (
        cust_z type:#float range:[-10,10] ui:cust_spin
    )

    rollout AttribRollout "Helper Controls"
    (

        Spinner cust_spin "The Spinner" range:[-10,10,0]
    )
)

custAttributes.add targ cust_attrib
paramWire.connect2Way targ.cust_attribs[#cust_z] targ.rotation.controller[#z_rotation] "z_rotation" "cust_z"

【讨论】:

    猜你喜欢
    • 2014-02-17
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2012-07-12
    相关资源
    最近更新 更多