如何使用 Python API 为 3D Studio Max 创建关键帧

How to create a keyframe with Python API for 3D Studio Max

目前我正在使用自动键创建关键帧,如下所示:

MaxPlus.Animation.SetAnimateButtonState(True)  # autokey on
MaxPlus.Animation.SetTime(time)                # Set time slider to chosen time of keframe
obj.Position = MaxPlus.Point3(x, y, z)         # Set position
MaxPlus.Animation.SetAnimateButtonState(False) # autokey off

但这并不是很方便。还有别的办法吗?是否有类似的功能: 创建关键帧(时间,值)?如何访问可见性控制器?

我应该使用:

c = MaxPlus.Factory.CreateDefaultFloatController()
obj.ParameterBlock.Parameter.SetController(c) 

但我仍然不知道如何插入关键帧,我只知道如何使用 AutoKey 设置它们,所以这没有任何改变

对于 max 2016,几乎没有比您正在做的更好的方法了。当然,您可以分配一个新的可见性控制器:

node.SetVisibilityController(MaxPlus.Factory.CreateDefaultFloatController())

或者您可以修改任何现有的:

node.GetSubAnim(0).AddNewKey(time, param)

其中参数是

中任何一项的总和
MaxPlus.Constants.AddkeyFlagged
MaxPlus.Constants.AddkeyInterp
MaxPlus.Constants.AddkeySelect

但要使用键的值,您必须获得 IKeyControl/ISetKeyControl 接口。这行不通:

ctrl.GetInterface(MaxPlus.AnimatableInterfaceIds.IKeycontrol)

因为它期望 MaxPlus.Interface_ID 类型,而 IKeycontrol(在这里代表原始 I_KEYCONTROL)是一个值 0x00001100 的常量。然而,最初的实现是这样的:

void* Control::GetInterface(ULONG id)
{
    if (id==I_CONTROL) {
        return this;
    }
    else if (id==I_KEYCONTROL) {
        ...;
    }
    // and so on, only as a last resort checking the Interface_ID
    else {
        return Animatable::GetInterface(id);
    }
}