青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

永遠也不完美的程序

不斷學習,不斷實踐,不斷的重構……

常用鏈接

統計

積分與排名

好友鏈接

最新評論

3DS Max 插件制作學習心得(轉)

來源:yhforchina的專欄 - CSDNBlog

  要從3ds Max中導出場景信息,大概有兩種方式:1.利用3ds Max的sdk制作插件。2.利用3ds Max的Max Script編寫場景輸出腳本。兩種方式各有優劣,這里僅敘述我用了數天研究3ds Max SDK并制作插件的學習心得。

  1.前期環境配置工作。

  首先肯定要安裝帶SDK的3ds Max,我安裝的是3ds Max7。安裝后在maxsdk\help下有個sdkapwz.zip,把這個文件解壓到VS 6.0或VS 2003的application wizard路徑下,啟動VS就會有3ds Max plug-in的應用程序向導來生成插件程序的框架。

  2.制作插件需要了解的幾個基本概念。

  2.1 我所了解的插件原理是:3ds Max會公布一些接口,插件制作者需要做的是實現這些接口。例如利用向導生成一個用于場景導出的插件。就會發現在生成的程序中有一個類繼承于class SceneExport,而 SDK 中關于這個接口的描述是:

  This is a base class for creating file export plug-ins. The plug-in implements methods of this class to describe the properties of the export plug-in and a method that handles the actual export process.

  再看下面的函數說明,可以看到函數是虛函數的方式聲明的,所以必須要將其所有的函數進行實現。

  2.2 3ds Max是怎樣識別插件的接口?還是以上面的場景到處插件為例,程序中還會生成一個繼承于 ClassDesc2的類,這個類會實現一些關于類的ID,層次信息處理的函數。估計系統就是根據這個識別處我的插件的接口,沒有具體去研究,只了解個大概。

  2.3 如何調試所編寫的插件,SDK中有說明,我這里簡單說一下,將工程屬性設置為Hybrid(默認是Debug),并且把輸出dle文件的路徑設為3ds Max的plug-in的路徑,再把調試的可執行程序設為3ds Max.exe,這樣 調試的時候就會啟動3ds Max主程序,其他諸如設置斷點,單步等調試手段和普通程序的調試方法一樣。

  3.通過一個例子學習插件編程。

  這部分還真不好寫,涉及到一些代碼,代碼中又有很多API需要講解,API中又有很多基本知識需要說明,唉,硬著頭皮來吧。

  還是以那個場景導出類為例,可以看到,SceneExport中有個非常重要的函數需要實現:

virtual int DoExport(const TCHAR *name,ExpInterface *ei,Interface *i,
BOOL suppressPrompts=FALSE, DWORD options=0) = 0;

  先看看參數:

  name 表示要導出的文件名。

  ei 用來枚舉場景,需要注意的是:由于這個函數是由系統調用的,所以這個參數是系統傳遞的,不 用去思考怎么實現ExpInterface這個接口。

  i 提供一個用來調用3ds Max方法的指針,可以把它視作一個指向3ds Max的指針。同樣,這個指針 也是由系統傳遞的。

  剩下兩個參數暫不關心。

  現在來研究ei和i兩個參數:

  class ExpInterface僅包含一個成員:IScene *theScene。這樣的類設計的簡直是“無恥”。再去研究IScene吧。IScene中有一個很重要的函數:

virtual int EnumTree( ITreeEnumProc *proc )=0;

  根據SDK的說明,該函數的功能是:用來枚舉場景中的每個INode。因此需要一個ItreeEnumProc*作為參數,由于是自己調用整個函數,因而必須自己實現ItreeEnumProc接口,還好這個接口不是很復雜,把這個回調函數實現就可以了:

virtual int callback( INode *node )=0;

  因為是回調函數,所以node也是系統傳遞進來的,為了證明這一點,我們可以編程實驗一下:

class MyEnumProc: public ITreeEnumProc
...{
public: int callback( INode *node )
...{
int a = 0; //在這里設置斷點
return a;
}
}

  在MyExport中添加這一個成員變量:

MyEnumProc MyProc;

int MyExport::DoExport(const TCHAR *name,ExpInterface *ei,Interface *i, BOOL suppressPrompts, DWORD options)
...{
/**//*在函數中添加這行代碼*/
ei->theScene->EnumTree(&this->MyProc );

if(!suppressPrompts)
DialogBoxParam(hInstance,
MAKEINTRESOURCE(IDD_PANEL),
GetActiveWindow(),
MY5OptionsDlgProc, (LPARAM)this);
return FALSE;
}

  調試這個例子,在場景中繪制三個立方體,可以看到系統會調用callback三次,這說明一個物體就是一個Node。那么怎么來導出一個Node幾何信息呢?看下面這個代碼。

public: int callback( INode *node )
...{
Object *lobj;
lobj = node->GetObjectRef();
if (lobj->SuperClassID()== GEOMOBJECT_CLASS_ID)
...{
GeomObject* gobj = (GeomObject*)lobj;
Class_ID triID = Class_ID(TRIOBJ_CLASS_ID,0);
Class_ID boxID = Class_ID(BOXOBJ_CLASS_ID,0);
if (lobj->ClassID()==boxID)
...{
if (lobj->CanConvertToType(triID))
...{

TriObject *triobj = (TriObject *)lobj->ConvertToType
(0,triID);
Mesh mesh = triobj->mesh;
int numVerts = mesh.getNumVerts();
}

IParamArray* array = lobj->GetParamBlock();
float length = 0.0f;
float height = 0.0f;
float width = 0.0f;

array->GetValue( lobj->GetParamBlockIndex(BOXOBJ_LENGTH),
0, length, FOREVER);
array->GetValue( lobj->GetParamBlockIndex(BOXOBJ_HEIGHT),
0, height, FOREVER);
array->GetValue( lobj->GetParamBlockIndex(BOXOBJ_WIDTH),
0, width, FOREVER);
}
}

  首先node->GetObjectRef()會返回這個節點的物體引用。關于ObjectRef有一套幾何流水線的說明,這里實在是沒功夫寫了。接著首先判斷這物體的SuperClassID是否為GEOMOBJECT_CLAS- S_ID,如果是,則再看它是否能轉換為TriObject,即由三角形組成的物體,至于為什么要這樣轉,我只能說只有這個類可以返回一個Mesh,而通 過Mesh能夠獲得諸如頂點,法線,面等一般3D程序所需要的幾何信息(這里只獲取了該Mesh的面的個數)。當然,對于一個Box,我們可能只想獲得它 的長寬高,所以,代碼中又提供了另一個方法來返回其幾何信息。

  雖然只實現了這么短的代碼,但卻花了數天的時間,主要對3ds Max的結構不熟悉,加上SDK寫得真叫一個亂,還好總算有些進展,正所謂萬事開頭難。下一步將研究如何導出場景的光照,物體的紋理貼圖等信息。

posted on 2009-01-05 16:15 狂爛球 閱讀(1183) 評論(0)  編輯 收藏 引用 所屬分類: 圖形編程

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲电影第1页| 国内精品99| 在线视频亚洲欧美| 一区电影在线观看| 国产日韩精品一区观看| 久久婷婷影院| 欧美劲爆第一页| 亚洲一区二区三区在线看| 一本久久综合亚洲鲁鲁| 国产精品视区| 欧美成在线观看| 欧美日韩免费区域视频在线观看| 在线视频欧美日韩| 性色一区二区三区| 在线观看日韩专区| 在线视频欧美一区| 国产亚洲欧美一区在线观看| 欧美成人一区二区三区在线观看| 欧美护士18xxxxhd| 欧美一级一区| 欧美多人爱爱视频网站| 亚洲欧美日韩精品久久久| 欧美一区二区三区免费看| 亚洲激情小视频| 亚洲在线观看免费视频| 亚洲人成小说网站色在线| 亚洲一区久久| 欧美成年人网站| 亚洲精品少妇30p| 国产亚洲欧美一区二区| 一本色道久久99精品综合| 亚洲视频在线观看视频| 一区国产精品| 亚洲淫片在线视频| 日韩图片一区| 久久久一本精品99久久精品66| 在线中文字幕不卡| 久热精品视频在线| 欧美影视一区| 欧美性开放视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲在线中文字幕| 久久蜜桃精品| 久久精品夜色噜噜亚洲a∨| 欧美区一区二| 亚洲茄子视频| 91久久一区二区| 久久亚洲私人国产精品va媚药| 亚洲欧美一区二区三区极速播放| 欧美精品免费视频| 亚洲电影免费| 亚洲国产精品免费| 久久米奇亚洲| 免费美女久久99| 国内精品久久久| 欧美一区二区在线看| 欧美自拍偷拍| 国产视频在线观看一区二区三区 | 欧美一区免费| 久久九九电影| 国产一区二区激情| 欧美亚洲视频在线观看| 欧美在线观看一区| 国产日韩精品在线| 欧美伊人久久| 久久综合国产精品台湾中文娱乐网| 国产女精品视频网站免费| 中文精品视频| 欧美一区二区日韩| 国产视频亚洲精品| 欧美在线免费看| 久久综合伊人77777蜜臀| 狠狠爱www人成狠狠爱综合网| 久久九九精品99国产精品| 免费久久99精品国产自| 亚洲高清影视| 欧美久久综合| 亚洲一区二区三区高清| 久久精视频免费在线久久完整在线看| 国产综合欧美| 国产视频不卡| 欧美日产一区二区三区在线观看 | 欧美日韩卡一卡二| 欧美承认网站| 99国产精品视频免费观看| 欧美成人午夜激情视频| 亚洲精品少妇30p| 午夜激情一区| 在线欧美日韩国产| 欧美另类99xxxxx| 午夜精品久久久久影视| 欧美成人免费全部观看天天性色| 99国产精品| 国产欧美一区视频| 欧美大片网址| 午夜伦理片一区| 亚洲第一视频| 欧美在线一二三四区| 亚洲黄色毛片| 久久精品视频网| 亚洲破处大片| 亚洲精品国产精品国自产在线| 欧美午夜电影在线观看| 久久久成人网| 亚洲专区一区| 亚洲精品视频啊美女在线直播| 欧美在线播放一区二区| 亚洲久久视频| 国产一区二区中文| 欧美三级日本三级少妇99| 久久伊人亚洲| 亚洲欧美日韩在线| 亚洲理论在线| 欧美sm视频| 久久国产福利| 这里只有精品在线播放| 亚洲第一综合天堂另类专| 国产日韩亚洲欧美| 国产精品成人v| 欧美成人精品一区二区三区| 新67194成人永久网站| 亚洲免费精品| 最新亚洲一区| 欧美成人免费一级人片100| 欧美专区一区二区三区| 亚洲视频一区二区免费在线观看| 在线免费观看日本一区| 国产午夜一区二区三区| 国产欧美精品日韩区二区麻豆天美| 欧美日本乱大交xxxxx| 六十路精品视频| 久久影视三级福利片| 久久er精品视频| 欧美一区日本一区韩国一区| 亚洲欧美视频在线观看| 亚洲免费在线看| 一区二区激情小说| 日韩写真在线| 一本色道久久综合狠狠躁篇怎么玩| 91久久综合| 亚洲区一区二区三区| 亚洲黄色三级| 亚洲精品视频在线观看免费| 亚洲精品美女91| 一区二区三区欧美日韩| 一个色综合av| 亚洲免费在线视频一区 二区| 亚洲欧美日本国产有色| 午夜在线精品偷拍| 欧美在线播放一区| 久久av资源网站| 麻豆久久婷婷| 欧美日本韩国一区| 国产精品老女人精品视频| 国产精品日韩欧美一区二区三区 | 久久国产综合精品| 久久久久久噜噜噜久久久精品| 欧美一区二区三区另类| 美日韩精品视频免费看| 欧美暴力喷水在线| 欧美精品一区二区蜜臀亚洲| 欧美日韩中文字幕日韩欧美| 国产精品久久久久永久免费观看 | 久久精品91| 免费欧美在线视频| 欧美性猛片xxxx免费看久爱| 国产欧美日韩视频| 在线精品国产欧美| 99精品免费| 久久久久网站| 亚洲人成网站色ww在线| 一区二区三区高清不卡| 欧美影院一区| 欧美激情一区二区三区在线视频观看 | 久久国产一区二区| 欧美激情综合五月色丁香| 国产精品久久久一区二区| 国内视频一区| 在线视频精品一区| 老色鬼久久亚洲一区二区| 亚洲理论电影网| 久久久不卡网国产精品一区| 欧美午夜精品电影| 在线日韩欧美视频| 亚洲免费在线观看| 欧美国产大片| 先锋影音久久久| 欧美日韩成人在线播放| 国产一区二区三区免费不卡| 一本久久a久久精品亚洲| 开元免费观看欧美电视剧网站| 亚洲伦伦在线| 久久这里只精品最新地址| 国产精品久久久久久久久婷婷 | 久久久免费av| 亚洲综合首页| 国产精品a级| 一区二区三区四区国产精品| 欧美xxxx在线观看| 亚洲欧美激情精品一区二区|