浅谈MaxScript与Max SDK的区别

本文详细对比了MaxScript和MaxSDK在3dsMax二次开发中的应用,通过实现禁用当前所选对象的修改器功能,展示了两者在效率、开发时间和性能上的差异。MaxScript提供了简洁的脚本解决方案,而MaxSDK则要求开发者深入理解控件消息响应、索引消息架构等,适合对性能有极高要求的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题: 浅谈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();
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值