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

永遠也不完美的程序

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

常用鏈接

統計

積分與排名

好友鏈接

最新評論

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>
            一本久久青青| 久久久99国产精品免费| 久久精品免费| 欧美一区=区| 欧美一区二区三区精品电影| 亚洲无玛一区| 亚洲欧美日韩直播| 欧美一乱一性一交一视频| 久久福利电影| 麻豆九一精品爱看视频在线观看免费| 免费日韩av片| 日韩午夜在线播放| 亚洲欧美日韩一区二区| 久久三级福利| 欧美视频免费在线观看| 国产一区二区福利| 亚洲精品在线二区| 欧美一区网站| 亚洲国产精品999| 日韩亚洲欧美在线观看| 亚洲男人的天堂在线aⅴ视频| 午夜免费在线观看精品视频| 久久九九热re6这里有精品| 欧美黑人在线播放| 国产欧美精品在线| 日韩一区二区精品在线观看| 午夜一区不卡| 亚洲风情亚aⅴ在线发布| 一级成人国产| 老司机aⅴ在线精品导航| 能在线观看的日韩av| 亚洲精品乱码久久久久久日本蜜臀| 亚洲激情视频网| 午夜视频一区| 欧美日韩一区二区三区在线| 国产综合一区二区| 亚洲欧美卡通另类91av| 欧美高清在线视频| 欧美亚洲综合网| 国产精品久久久久aaaa樱花| 亚洲成在线观看| 久久精品道一区二区三区| 亚洲国产综合在线| 久久久久久久久一区二区| 国产精品入口| 中文精品一区二区三区 | 9l视频自拍蝌蚪9l视频成人| 久久精品女人| 夜夜躁日日躁狠狠久久88av| 欧美韩国在线| 亚洲级视频在线观看免费1级| 欧美一区二区三区免费在线看| 亚洲国产高清自拍| 免费久久99精品国产| 精品动漫一区二区| 久久国产精品免费一区| 一区二区三区四区蜜桃| 欧美日韩一卡二卡| 亚洲激情电影在线| 免费观看在线综合色| 欧美一区二区三区四区在线观看地址 | 欧美在线国产精品| 国产精品自在线| 亚洲宅男天堂在线观看无病毒| 亚洲人在线视频| 欧美成人在线免费视频| 亚洲国产成人精品久久| 美国三级日本三级久久99| 久久久.com| 亚洲日本成人| 日韩亚洲精品电影| 国产精品一区二区久久精品| 午夜精品一区二区在线观看 | 亚洲乱码精品一二三四区日韩在线| 久久久国产精品一区| 一区二区三区在线视频播放| 免费久久99精品国产自| 久久午夜视频| 亚洲美女毛片| 亚洲一区二区视频在线观看| 国产精品大全| 久久精品日韩| 欧美高清自拍一区| 亚洲一区二区三区精品视频| 亚洲一级二级在线| 久久伊人一区二区| 欧美不卡一区| 亚洲欧美另类在线观看| 欧美一区二区三区在线视频| 在线不卡欧美| 亚洲欧洲在线播放| 国产精品人人爽人人做我的可爱| 久久av红桃一区二区小说| 久久男人资源视频| 亚洲视频自拍偷拍| 久久精品一区二区三区不卡牛牛 | 免费一级欧美在线大片| 欧美精品亚洲精品| 久久国产66| 欧美国产精品一区| 香蕉久久国产| 欧美大片在线看免费观看| 性久久久久久久| 欧美激情一区二区三区蜜桃视频| 亚洲综合二区| 欧美jizzhd精品欧美巨大免费| 亚洲欧美国产毛片在线| 男男成人高潮片免费网站| 亚洲欧美在线看| 欧美精品二区三区四区免费看视频| 午夜国产精品视频免费体验区| 免费中文日韩| 久久综合一区二区三区| 国产精品久久久久一区二区三区共| 免费在线看一区| 国产精品一区免费在线观看| 欧美激情一区二区久久久| 国产麻豆日韩欧美久久| 日韩视频在线观看免费| 亚洲国产日韩精品| 小黄鸭精品aⅴ导航网站入口| 亚洲精品一区二区三区樱花 | 亚洲精品国产系列| 久久电影一区| 久久精品国产99| 国产精品美女久久久久aⅴ国产馆| 91久久在线视频| 91久久精品国产91性色tv| 久久精品国产在热久久| 久久久蜜桃一区二区人| 国产欧美一区二区三区在线老狼| 一本色道久久88精品综合| 日韩午夜在线电影| 欧美精品1区2区| 亚洲精品影视| 在线亚洲精品| 欧美特黄a级高清免费大片a级| 亚洲精品欧美日韩专区| 夜夜嗨av一区二区三区| 欧美日韩三级| 一区二区三区久久久| 亚洲视屏一区| 国产精品视频一区二区三区| 亚洲一区二区三区在线观看视频| 亚洲免费影视第一页| 亚洲欧美大片| 欧美一区二区在线免费观看| 国产美女精品人人做人人爽| 亚洲综合成人婷婷小说| 久久国产主播精品| 好看的日韩视频| 久久免费偷拍视频| 亚洲国产欧美日韩精品| 亚洲午夜激情| 国产乱码精品一区二区三| 久久精品视频播放| 免费在线国产精品| 亚洲精品影视| 欧美亚韩一区| 久久精品国产999大香线蕉| 欧美激情精品| 亚洲视频在线观看三级| 国产精品久久久久久久久久久久久| 亚洲欧美国产另类| 欧美成人嫩草网站| 亚洲婷婷在线| 狠狠色2019综合网| 欧美日韩大片| 欧美在线免费观看| 亚洲国产精品99久久久久久久久| 亚洲视频图片小说| 韩国女主播一区二区三区| 欧美大片一区| 亚洲欧美三级伦理| 亚洲日本电影| 久久亚洲美女| 亚洲在线中文字幕| 好吊视频一区二区三区四区| 欧美激情a∨在线视频播放| 亚洲欧美综合精品久久成人| 欧美风情在线观看| 久久国产精品99国产| 一本色道久久综合亚洲精品不| 国产日本亚洲高清| 欧美日韩调教| 欧美jizzhd精品欧美喷水| 午夜精品福利视频| 在线视频一区观看| 欧美黄色一区| 久久久久久伊人| 性做久久久久久久免费看| 在线综合亚洲欧美在线视频| 亚洲高清久久| 国内精品亚洲| 国产日韩欧美高清| 国产精品久久久久久久久久妞妞| 免费欧美在线| 久久网站免费| 久久视频在线看| 欧美在线看片|