如何使用 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);
}
}
目前我正在使用自动键创建关键帧,如下所示:
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);
}
}