close

3DMax SDK的基本概念 介紹
這一部分對SDK的概念進行簡單的介紹,提供很多基本的介紹以便開發者創建插件應用程序.更多的信息請參看下面的鏈接. 
二、插件體系概述
三、3DS MAX中的插件 
五、場景中結點與物體的關係 
七、時刻和時間間隔 
九、參數塊 
十一、DLL函數
十二、創建插件和運行的類型ID標識 3DS MAX插件主要用來建模,動畫和渲染.這些插件主要繼承於下面幾個抽象基類之一.
Anomatable->ReferenceMaker->ReferenceTarget 1.Animatable
類層次中最基本的層次是關於動畫的抽象類,為Animatable類.這個類主要的方法是軌跡視圖中顯示的功能和內存管理.從Animatable類繼承的兩個類用以在3DS MAX中的各不同部分進行交互.


2.ReferenceMaker
當3DS MAX中的一個引用被創建,創建引用的物體就會對創建引用的目標物體存在依賴性.引用創建者是一個依賴的物體,引用目標是獨立的物體.當一個引用目標的狀態發生改變時,引用目標需要通知引用創建者它的改變.屬於引用創建者的任何類都必須從抽象類ReferenceMaker類繼承.


3.ReferenceTarget
任何屬於引用目標的類必須從抽象類ReferenceTarget類繼承.見上面ReferenceMaker的解釋.
>>不從這些類繼承的插件
這些插件不從三個抽象基類繼承,一般來說,這些類不直接與動畫相關.比如,導入導出插件僅僅從3DS MAX中導入和導出數據,因此,它們不會出現在軌跡視圖中,且它們的函數獨立於其它插件.
SDK中的大部分類都是從抽象基類繼承過來的.
三個抽象基類的根類是Animatable類,它定義了動畫和軌跡視圖相關的大部分方法.
從Animatable類繼承的類是ReferenceMaker,這個類允許對其它物體創建引用.
從ReferenceTarget類繼承的類是ReferenceTarget,一個引用是場景中兩個物體的雙向連接,它創建"ReferenceMaker"和"ReferenceTarget"之間正式的依賴性記錄.它的主要功能是使一個引用目標在自身狀態發生改變時,通知依賴於它的引用者.
不從Animatable繼承的類主要是那些與動畫不相關的類.比如,Interface類提供了一系列方法來調用3DS MAX自身的函數,而Interface類並不繼承於Animatable類.


下圖顯示了SDK中主要公共類的繼承圖,最基本的類(即沒有父類的類)顯示在最上面,繼承層次向下和向右.
圖略(參看SDK)


三.3DS MAX中的插件
這一部分討論3ds max調用插件方法的途徑和插件調用3DS MAX提供的方法的途徑.
>>用戶實現的方法
每個插件都從3DS MAX的一個基類繼承下來的,比如,創建一個幾何物體的插件可以從SimpleObject2類繼承.
class MyGeomObject:public SimpleObject2     //... 3DS MAX中定義SimpleObject2類的頭文件是simpobj.h.插件開發者必須實現SimpleObject2類中的某些方法,換句話說,插件覆蓋父類的一些方法.3DS MAX能夠調用插件中的這些方法.
比如,SimpleObject2的BuildMesh()方法,3DS MAX調用該方法得到幾何物體的三角網格,插件要實現SimpleObject2::BuildMesh()以產生3ds max所需要的網格.
>>基類方法 比如,一個基本幾何物體可能從GeomObject繼承,這個基本集合體可以調用NotifyDependents(),這是ReferenceTarget的一個方法,這個方法繼承於基類(GeomObject->Object->BaseObject->ReferenceTarget).
>>接口方法
插件也可以調用3DS MAX的方法,通過Interface類提供的接口指針.接口類僅僅是一個沒有成員變量並只包含純虛函數的類.類似於這樣的類本質上都不過是一個函數指針表.


接口類在3ds max中經常使用,最經常使用的接口類是Interface,指向該類的指針可以調用很多方法,插件用這個指針實現3DS MAX提供的一些普通操作.比如,當一個修改器插件想在命令面板上顯示用戶接口時可以調用Interface的AddRollupPage()方法,或者插件想得到3DS MAX幀滑塊指定的當前時間可以調用Interface的GetTime()方法.


在面向對象的示例中,相互獨立的插件物體協同工作以實現系統的全部功能,因此內部物體需要進行通信.3DS MAX中利用引用結構作為控制通信的體系結構.
>>個案研究 3DS MAX動畫控制器有一個Look At插件(注視約束插件),這是一個空間變換控制器,它可以控制其在場景中的位置,旋轉,縮放.Look At控制器旋轉它所屬的項目以使其朝向(或注視)另一個物體.比如,創建一個自由相機並且指定一個Look At控制器作為相機的空間變換控制器,然後在場景中選擇一個Box作為Look At控制器的目標,這會使自由相機旋轉以至其方向正對於Box.無論何時,只要Box移動,控制器就會重新設置以使相機仍然指向Box.當然,如果從場景中刪除Box,攝像機將能識別並保持不動.
現在考慮這些項目(攝像機,Look At控制器,Box)都是插件,每個插件與其它插件都沒有關係,那麼它們之間是怎麼通信的呢?比如,攝像機怎麼知道在Box移動的時候需要改變自己的方向?Look At控制器怎麼知道場景中的Box被刪除?這些物體進行通信的答案就是References(引用).
>>Reference引用
一個引用是聯合兩個項目的方法,此時一個項目被認為依賴於另一個項目.在上面的例子中,Look At控制器依賴於Box,攝像機依賴於Look At控制器.也就是說,如果Box發生改變它需要讓依賴於它的其它物體知道這些改變.控制器通過引用,得到Box發生改變的通知.控制器通過同樣的方式通知依賴於它的項目.當控制器發生改變時,它讓依賴於它的項目知道,於是,攝像機得到通知.
一個物體通過創建引用建立依賴關係,當一個物體創建一個引用,就被稱為引用創建者,那些被依賴的物體被稱之為引用目標.在上面的例子裡,攝像機是引用創建者,它引用Look At控制器,那麼Look At控制器就是攝像機的引用目標;同時Look At也是引用創建者,它引用Box,Box是控制器的引用目標.實際上,Box有它自己的引用,比如,它的空間變換控制器.
3DS MAX存在很多內部創建的引用,在一個簡單的場景中,可能存在數十個引用(很多為3DS MAX內部使用),而在一個複雜的場景中,可能存在數百個引用.
場景中每一個物體都關聯一個結點,場景中結點和物體存在著一一對應的關係.球,網格,攝像機,燈光和輔助物體都是場景中的物體,所有這些物體能可以被變換,旋轉等等. (1)結點的空間變換控制器控制物體在場景中的位置,旋轉,縮放.
(2)渲染器使用結點的材質來設置物體的表面特徵,比如顏色,紋理,凹凸.
(3)層次信息用來控制物體的連接/未連接狀態和反向動力學(IK). 程序物體是視口中用戶能夠創建和控制的物體.比如包括攝像機,燈光,幾何物體(長方體,球,或者更複雜的物體). 幾何物體必須最終轉換為三角網格,以便可以渲染.但3DS MAX渲染器和光線跟蹤渲染(mental ray renderer)都是工作在MESH物體級別下.所以基本物體,布爾物體,閣樓,粒子系統,面片柵格,NURBS曲面都必須轉換為三角網格.只有一個例外:光線跟蹤支持一個指定的基本體頭髮,並且比三角網格更為有效. 對於一個程序物體,3DS MAX提供修改器來擴展物體.可以對物體應用修改器進行適當的修改,變形,處理和編輯.用戶也能夠利用空間彎曲插件來改變幾何體的世界空間位置.對於插件開發者而言,所有這些功能的實現都必須要理解從參數物體到可修改的三角面片模型的轉換過程.
3DS MAX的幾何管道系統用來控制這些處理和轉換.幾何管道系統是用來使參數物體可以被修改器修改,最後產生一個適合的三角網格模型用來渲染和在視口中顯示. >>時間點
3DS MAX中基本的時間單位是Timue.SDK中在任何需要指定時間點的時候使用Timue.1Timue等於1/4800秒.
Timue同樣是一個3ds max數據類型.
比如,如果插件需要知道當前的系統時間(在3DS MAX中以幀滑塊表示),可以調用Interface::GetTime().這個方法返回當前的時間(以Timue為單位,即1/4800s).
>>時間間隔
在3ds max中,時間間隔(Interval類)通常被用來定義一個時間段,在這個時間段內物體不發生改變.為了盡可能快,3DS MAX避免在任何時候重新評估計算物體.如果一個動畫插件可以指定多長時間內它不發生改變,3DS MAX就可以知道它不用在這段時間內重新評估計算物體.
比如,3DS MAX需要知道在多長時間內修改器的修改是有效的.以彎曲修改器在100幀的動畫中為例,用戶改變彎曲的角度,並標誌在第0幀到第50幀內不彎曲,在50-100幀時彎曲45度.則在前50幀內,3DS MAX不需要重新評估計算修改器(畢竟,在前50幀不彎曲).3DS MAX用有效時間間隔來標識什麼時間段是變形的有效時間.有效時間間隔是一個時間段,比如在23幀處返回的有效時間間隔可能是FOREVER,在56幀返回的有效時間間隔可能是瞬時的.
3DS MAX中所有的動畫都由一個稱之為Animtable controller(動畫控制器)的插件管理,或者簡稱為控制器. 其它控制器是基於程序的,在特定的時間點編程狀態下設置其值(比如噪波控制器用不規則的碎片形功能計算其值). (1)浮點值(float)
(2)三個浮點值(Point3)
(3)位置(Matrix3)
(4)旋轉(Quat)
(5)縮放(Scalue)
(6)變換(Matrix3) 許多控制器用的參數變量,比如一個程序球的半徑參數變量.3DS MAX提供給開發者工具,使用參數變量以更容易地管理它們.最重要的是參數塊. 參數塊非常重要,它用來存儲和顯示插件的變量值.
對於插件和用戶交互所需要的數據,3DS MAX提供存儲,獲取和顯示這些數據的類.大多數插件以對話框的形式顯示信息,並且用戶可以控制這些顯示信息(比如定義一個程序物體的參數).
參數塊存儲插件使用的變量(通常稱之為參數),同時管理撤銷/重做功能,並自動提供這些參數給MAXScript,同時管理引用系統中的消息通知.
參數塊在相關類的協同下自動地將數據顯示到3DS MAX的用戶接口,這將開發者從繁瑣的底層任務中解脫出來.
用戶同3DS MAX的交互主要通過命令面板的卷展欄和對話框,鼠標(或者寫字板),鍵盤,和3D視口.SDK提供給開發者控制每個用戶交互的區域. (1)卷展欄:體現於材質編輯器,環境,和渲染對話框中.
(2)模態對話框
(3)非模態對話框
>>控制
對話框或卷展欄中許多按鈕,微調控制項,編輯區域等都來自於3DS MAX的Custom Control.這幫助3DS MAX中各個插件的圖形接口外觀一致.
>>鼠標
鼠標與視口交互在SDK中通過Command Modes(命令模式)控制.
>>鍵盤 >>視口
插件經常需要在3D視口中繪製以顯示其內容或其它小物件,可以通過調用交互渲染器(GraphicsWindow類)提供的方法.十一、DLL函數
這一部分介紹每一個插件DLL都需要的五個函數,更多詳情參閱Required  DLL Functions(Detailed).
每一個插件開發者需要提供DllMain的代碼,和四個Lib函數,下面簡單地描述這幾個函數:
>>函數初始化
DllMain() 這個函數是Windows用來初始化DLL的鉤子程序,3DS MAX插件使用該函數來初始化一般的控制庫和3DS MAX定制的控制.
>>3DS MAX管理和給DLL插件歸類的函數
這四個函數描述了DLL提供的插件的數目和屬性.
(1)LibNumberClasses()    該函數返回DLL中插件類的數目.
(2)LibVersion()    該函數允許系統處理DLL插件的廢置版本.
(3)LibDescription()    這個函數返回給用戶一個文本字符串,如果該DLL是不可用的.
(4)LibClassDesc(i)    這個函數返回一個descriptor類對象的指針,這是一個類描述符,每個DLL插件類都有該描述符對象,一個類描述符有以下功能:
a)描述每個插件類的屬性;
b)創建插件類;
c)銷毀插件類.
開發者可以在一個DLL文件中放置多個插件,在這種情況下,LibClassDesc()將會執行一個switch語句,並返回不同的類描述符指針.十二、創建插件和運行的類型ID標識
Descriptor類繼承於ClassDesc2,它有幾個重要的用途,但最重要的兩個是該插件的分類,和為該插件實例分配內存.
一個DLL插件包括許多插件類,在運行時,3DS MAX通過LibNumberClasses函數調用DLL,以確定其包含多少個插件類.然後根據插件類的個數,循環調用靜態的描述符類(調用LibClassDesc(i)).Max得到類描述符後,通過調用類描述符的Create()方法分配插件的實例.
每一個插件類都必須有一個類標識(ClassID).
每個插件對象關聯兩個類標識(2 IDS),它們是:
(1)Class ID唯一標識一個插件類
(2)Super Class ID指定插件類的超類.
>>例子
比如,一個球對象有一個唯一的Class ID,可以簡單地通過SDK提供的程序字哦那個生成這個ID,它唯一標識該插件類.(該程序在\MAXSDK\HELP\GENCID.EXE)
它的超類ID是GEOMOBJECT_CLASS_ID,因為它屬於基本幾何體.超類IDS由MAX定義,每個插件都必須屬於其中的一個分類.
比如,所有的紋理貼圖插件都有相同的超類ID,為TEXMAP_CLASS_ID.每個單獨的紋理貼圖插件都有它自己唯一的類標識符ID.因此,超類ID定義該插件屬於哪一個分類(這裡是紋理貼圖插件),而類ID唯一標識一個特定的插件類.
>>運行時類型ID
類描述符的方法ClassDesc::SuperClassID()返回超類ID,ClassDesc::ClassID()返回類ID.
>>創建插件
類描述符的另一個函數是為插件類實例分配內存.比如,當裝載一個3DS MAX文件,該文件包含一個程序球,3DS MAX需要創建一個球插件的實例.它通過調用球的類描述符ClassDesc::Create()實現.

arrow
arrow
    全站熱搜

    createps 發表在 痞客邦 留言(0) 人氣()