3ds max - 浅谈MaxScript与Max SDK的区别

标题: 浅谈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();
  }
}

你可能感兴趣的:(3ds max - 浅谈MaxScript与Max SDK的区别)