标题: 浅谈MaxScript与Max SDK的区别
作者:李英江
日期: 2007-04-21 16:12:12
作者网站: http://www.cgsir.com
转载请保留作者内容!
3ds Max 脚本编程与3ds Max SDK编程有很大的区别,时常有些功能用maxscript 可以一两句命令完成,相比之下使用max sdk就复杂多了,所有的一切都要你自己去做,我的意思是说你必须处理控件消息响应,你还必须理解3ds max管道线,索引消息架构,Windows API使用,熟悉C++,只有在效率上要求非常高时才建议采用max sdk进行二次开发。
下面我举一个简单例子,功能就是禁用当前所选对象的修改器,我分别用maxScript和max SDK来实现,我希望大家能明白我所说的MaxScript与Max SDK二次开发的区别,至于你要做max 二次开发时选用哪一种,完全依赖于项目的性能,开发时间限制等等,打个比方用MaxScript脚本能一周内完成的任务,改用Max SDK实现也许需要一个多月时间,下面是我写的一段maxScript和max SDK实现相同功能的代码,有兴趣的话可以读一读。
/*
* 功能:禁用当前所选对象的修改器
* 作者:李英江
* 日期:2007年4月21日
*/
-------------------------------------------------------
MaxScript实现:
-------------------------------------------------------
--checkbox控件的响应
on chkDisableMod changed var do
(
if checkboxEnableMod.state ==true then
(
$.modifiers[1].enabled = false
)
else
(
$.modifiers[1].enabled = true
)
)
-------------------------------------------------------
Max SDK实现:
-------------------------------------------------------
// 窗口过程消息处理
BOOL polyReduceDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch (msg) {
case WM_INITDIALOG:
thePolyReduce.OnInitDlg(hWnd);
break;
case WM_DESTROY:
thePolyReduce.OnDestroyDlg(hWnd);
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
break;
// 关闭修改器
case IDC_DISABLE_MOD: {
if (IsDlgButtonChecked(hWnd, IDC_DISABLE_MOD))
{
thePolyReduce.IsDisableMod(IS_DISABLE);
}
else
{
thePolyReduce.IsDisableMod(IS_ENABLE);
}
}
}
break;
default:
return FALSE;
}
return TRUE;
}
// 禁用修改器
void PolyReduceMod::IsDisableMod(bool bDisable = IS_DISABLE)
{
// 根据选择的节点,获得修改器的指针
INode *pNode = ip->GetSelNode(0);
Object *pObj = pNode->GetObjectRef();
IDerivedObject *pDerObj = NULL;
Modifier *pMod = NULL;
if(pObj == NULL)
{
MessageBox(GetCOREInterface()->GetMAXHWnd(), "没有获得对象的索引", "提示信息", MB_OK | MB_ICONINFORMATION);
}
if(pObj->SuperClassID()== GEN_DERIVOB_CLASS_ID)
{
pDerObj = (IDerivedObject *) pObj;
for(int i=0; i< pDerObj->NumModifiers(); i++)
{
pMod = pDerObj ->GetModifier(i);
}
}
if(pMod !=NULL)
{
if(bDisable == IS_DISABLE && pMod->IsEnabled() )
pMod->DisableMod();
else
pMod->EnableMod();
pDerObj->NotifyDependents(FOREVER,PART_ALL,REFMSG_CHANGE);
pMod->NotifyDependents(FOREVER,PART_ALL,REFMSG_CHANGE);
pNode->NotifyDependents(FOREVER,PART_ALL,REFMSG_CHANGE);
pNode->NotifyDependents(FOREVER,0,REFMSG_SUBANIM_STRUCTURE_CHANGED);
ip->ExecuteMAXCommand(MAXCOM_MODIFY_MODE);
ip->ForceCompleteRedraw();
}
}