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

麒麟子

~~

導航

<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

統計

常用鏈接

留言簿(12)

隨筆分類

隨筆檔案

Friends

WebSites

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

魔獸世界客戶端數據研究(一)

終于決定,還是通過wow model viewer起手,研究一下WOW的數據類型,從另一個角度,體驗一把這個唯一讓我充過值的游戲。

這將是一系列隨筆,即在讀代碼的時候,順便記錄,以理清思路和加深映象。 其中會有很多讓人費解的地方,如果有幸被某位兄弟看見,請勿見笑。

我們從讀取模型數據開始。。。
下面是這是頂點結構體 這是wow model viewer中的定義
struct ModelVertex
{
    Vec3D pos; //頂點位置
    uint8 weights[4];//骨骼權重
    uint8 bones[4];//受影響的骨骼索引
    Vec3D normal;//法線
    Vec2D texcoords;//紋理坐標,只有一層
    int unk1, unk2; // 總是0,0  可能沒有被使用到
};

讀完頂點數據后,我們需要對坐標系做一點修正,因為WOW用的是Z軸向上, Y軸向里(依稀記得torque也是這樣子)
很多人用得不是太習慣
若要轉換為GL中的坐標(Z向外),則 pos = vec3D(pos.x,pos.z,-pos.y);
若要轉換為D3D中的坐標(Z向里),則pos = vec3D(pos.x,pos.z,pos.y);
法線轉換方式和坐標一樣

轉換為了我們想要的坐標數據以后。我們還要強制對法線進行單位化。在這里,為了對法線進行壓縮,其實我們可以僅存儲X,Y分量就可以了。
不知WOW為什么沒有這樣子。

同時,在進行模型頂點數據讀取的時候,由于我們本來就要進行頂點數據遍歷,所以我們可以順便得出這個模型的半徑,用來做球形檢測

模型數據讀完了,緊接著是BoundingMesh(想說是包圍網格,又不太對,又或者,叫碰撞網格,這是一個簡化的網格,用于碰撞檢測和拾取之類的)數據
它由兩個部分組成BoundingVertices & BoundingTriangles (我又詞窮了,都懂的。)
BoundingVertices由一串float3組成,順序讀取即可,讀取完了后,如果上面的MESH做了坐標系統轉換,那這里也得做。
BoundingTriangles由一串uint16索引組成,順序讀取即可。

讀取完上面的模型數據后,接下來就是紋理數據。
在WMV中的定義如下

#define    TEXTURE_MAX    32  //最大紋理數
struct ModelTextureDef
{
    uint32 type;  //紋理類型
    uint32 flags; //紋理標記
    uint32 nameLen; //名字長度
    uint32 nameOfs; //名字在DBC中的偏移
};

搞笑得很啊,在結構體定義的時候,沒有對上面字段說明,在使用的地方,卻有一段描述。不過想想也是,用的時候方便查看嘛。
/*
Texture Types
Texture type is 0 for regular textures, nonzero for skinned textures (filename not referenced in the M2 file!)
For instance, in the NightElfFemale model, her eye glow is a type 0 texture and has a file name,
the other 3 textures have types of 1, 2 and 6. The texture filenames for these come from client database files:

DBFilesClient\CharSections.dbc
DBFilesClient\CreatureDisplayInfo.dbc
DBFilesClient\ItemDisplayInfo.dbc
(possibly more)
0     Texture given in filename
1     Body + clothes   身體和布料
2    Cape 肩膀
6    Hair, beard 頭發,胡子
8    Tauren fur 牛頭人的皮毛
11    Skin for creatures #1
12    Skin for creatures #2
13    Skin for creatures #3

Texture Flags
Value     Meaning
1    Texture wrap X X方向環繞
2    Texture wrap Y Y方向環繞
*/

下面是我對這段說明的理解
0 表示是普通紋理 并且,可以直接獲取它的紋理名字
非0表示是皮膚 值得說明的是,紋理名字不包含在M2文件中。
比如說,在暗夜男模型中,他的眼睛發光就是一個類型為0的紋理,并且,有一個文件名(這個文件名就存在本文件中)。其它3個紋理類型是1,2和6. 紋理名字是從客戶端數據庫文件中提取。nameOfs就是表示其位置

額,寫到這里的時候,突然發現,其實是有宏定義的

/*
Texture Types
Texture type is 0 for regular textures, nonzero for skinned textures (filename not referenced in the M2 file!) For instance, in the NightElfFemale model, her eye glow is a type 0 texture and has a file name, the other 3 textures have types of 1, 2 and 6. The texture filenames for these come from client database files:
DBFilesClient\CharSections.dbc
DBFilesClient\CreatureDisplayInfo.dbc
DBFilesClient\ItemDisplayInfo.dbc
(possibly more)
*/
enum TextureTypes
{
    TEXTURE_FILENAME=0,            // Texture given in filename
    TEXTURE_BODY,                // Body + clothes
    TEXTURE_CAPE,                // Item, Capes ("Item\ObjectComponents\Cape\*.blp")
    TEXTURE_ITEM=TEXTURE_CAPE,
    TEXTURE_ARMORREFLECT,        //
    TEXTURE_HAIR=6,                // Hair, bear
    TEXTURE_FUR=8,                // Tauren fur
    TEXTURE_INVENTORY_ART1,        // Used on inventory art M2s (1): inventoryartgeometry.m2 and inventoryartgeometryold.m2
    TEXTURE_QUILL,                // Only used in quillboarpinata.m2. I can't even find something referencing that file. Oo Is it used?
    TEXTURE_GAMEOBJECT1,        // Skin for creatures or gameobjects #1
    TEXTURE_GAMEOBJECT2,        // Skin for creatures or gameobjects #2
    TEXTURE_GAMEOBJECT3,        // Skin for creatures or gameobjects #3
    TEXTURE_INVENTORY_ART2,        // Used on inventory art M2s (2): ui-buffon.m2 and forcedbackpackitem.m2 (LUA::Model:ReplaceIconTexture("texture"))
    TEXTURE_15,                    // Patch 12857, Unknown
    TEXTURE_16,                    //
    TEXTURE_17,                    //
};

enum TextureFlags
{
    TEXTURE_WRAPX=1,
    TEXTURE_WRAPY
};

總之,就是如果遇上是0號類型,則直接讀文件名,否則就去DBC中取公共紋理數據。
比如頭發什么的,而上面牛頭人的毛發單獨定義,可能是因為毛發和一般人型生物不一樣吧。
另外,從TEXTURE_ARMORREFLECT中可以看出,WOW中的武器和盔甲是加上了反射紋理的,這樣才看起來有高光的感覺。

------------------------------------------------------------------------
------------------------------------------------------------------------
讀完模型,碰撞網格,紋理數據,接下來,就要讀取掛接物了,最常見的掛接物,就是WOW中的肩膀,頭盔或者武器上的一些粒子效果。

WMV中,掛接物的定義如下
/*
* This block specifies a bunch of locations on the body - hands, shoulders, head, back,
* knees etc. It is used to put items on a character. This seems very likely as this block
* also contains positions for sheathed weapons, a shield, etc.
*/
struct ModelAttachmentDef
{
    uint32 id; // Just an id. Is referenced in the enum POSITION_SLOTS.
    uint32 bone; // Somewhere it has to be attached.
    Vec3D pos; // Relative to that bone of course.
    AnimationBlock unk; // (Int32) Its an integer in the data. It has been 1 on all models I saw. Whatever.
};

無非就是定義了掛接的骨骼索引,偏移位置等。  最后一個參數,是動畫塊數據。定義如下

// sub-block in block E - animation data, size 28 bytes, WotLK 20 bytes
struct AnimationBlock
{
    int16 type;        // 插值類型 (0=none, 1=linear, 2=hermite)
    int16 seq;        // 全局隊列ID,-1表示無

    //下面的就是數據個數+數據在緩沖區中的偏移
    #ifndef WotLK
    uint32 nRanges;
    uint32 ofsRanges;
    #endif
    uint32 nTimes;  //
    uint32 ofsTimes;
    uint32 nKeys;
    uint32 ofsKeys;
};

上面的定義可以看中,WLK版本中,BLZ對文件進行了改動,加入了一個范圍數據。

讀取完上面的掛接頭信息以后,就可以根據這個信息,實例化一個掛接物,添加到模型身上。

下面是一個模型掛接物的信息
struct ModelAttachment
{
    int id;  //ID
    Vec3D pos; 位置
    int bone; //撞接的骨骼
    Model *model; //掛接的模型

    void init(MPQFile &f, ModelAttachmentDef &mad, uint32 *global);
    void setup();
    void setupParticle();
};

讀完上面的信息后,我發現,還有一個詭異的attLookup數據, 單看字面上意思,應該是拿來裝一個供掛接物ID查詢的數據的。
就是ModelAttachment中的ID作為下標,進行查詢。 目前還沒有搞明白。
本來想繼續寫下去,但發現寸步難行了,后面的數據都沒看明白是什么意思,只好留到下次了。
睡覺了,晚安!!!!!

posted on 2013-04-20 00:53 麒麟子 閱讀(831) 評論(0)  編輯 收藏 引用 所屬分類: BLIZZARD

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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成人黄色| 性色一区二区| 亚洲欧洲美洲综合色网| 你懂的一区二区| 亚洲国产成人久久| 一区二区三欧美| 亚洲视频在线观看| 欧美sm重口味系列视频在线观看| 99re8这里有精品热视频免费| 国产精品欧美一区喷水| 国产精品分类| 韩日精品视频| 国产伦精品一区二区| 国产午夜精品久久久| 伊人蜜桃色噜噜激情综合| 亚洲七七久久综合桃花剧情介绍| 国产精品高潮粉嫩av| 国产精品一区二区男女羞羞无遮挡 | 亚洲欧洲三级| 久久一区激情| 亚洲成色777777女色窝| 日韩午夜在线播放| 性亚洲最疯狂xxxx高清| 欧美高清视频一二三区| 国产精品欧美日韩一区| 亚洲人成人77777线观看| 午夜欧美精品| 亚洲午夜伦理| 久久免费视频在线观看| 亚洲国产小视频在线观看| 久久久久se| 亚洲精品一区二区三区婷婷月| 蜜臀91精品一区二区三区| 亚洲精品一级| 9国产精品视频| 久久成人精品| 国产精品亚发布| 一本久久综合亚洲鲁鲁五月天| 亚洲精品久久久久久一区二区| 国产精品三级久久久久久电影| 欧美另类一区二区三区| 国产偷久久久精品专区| 亚洲一二三区精品| 亚洲国产一区在线观看| 久久九九99| 好吊色欧美一区二区三区视频| 国产日产高清欧美一区二区三区| 国产精品网站视频| 亚洲另类在线一区| 裸体女人亚洲精品一区| 亚洲欧美在线磁力| 久久精品噜噜噜成人av农村| 欧美精品成人一区二区在线观看 | 久久男人资源视频| 亚洲人成网站色ww在线| 久久婷婷丁香| 影音先锋日韩精品| 久久久久久网| 久久久久国产精品厨房| 国产欧美日韩免费看aⅴ视频| 狠狠色丁香婷婷综合久久片| 中日韩美女免费视频网址在线观看 | 老司机成人在线视频| 夜夜嗨av一区二区三区免费区| 亚洲精品看片| 欧美va亚洲va香蕉在线| 亚洲精品一级| 欧美激情精品久久久久久免费印度| 欧美人与性禽动交情品 | 亚洲综合第一| 亚洲视频久久| 国产精品视频xxxx| ●精品国产综合乱码久久久久| 日韩一二三在线视频播| 亚洲视频福利| 一区二区欧美在线观看| 国产精品一二三| 亚洲黄色片网站| 亚洲人体影院| 国产精品久久久99| 久久久久久成人| 久久久久久久综合狠狠综合| 亚洲国产日韩欧美在线动漫| 欧美在线播放视频| 久久精品国产精品亚洲| 亚洲国产一成人久久精品| 91久久夜色精品国产九色| 欧美特黄一级大片| 久久日韩粉嫩一区二区三区| 蜜臀99久久精品久久久久久软件| 国产精品羞羞答答xxdd| 久久夜色撩人精品| 欧美日韩成人一区| 久久精品国产91精品亚洲| 久久亚洲欧美| 国产一区二区你懂的| 欧美激情亚洲| 国产精品美女诱惑| 亚洲天堂av在线免费| 欧美亚洲在线观看| 亚洲天堂av在线免费观看| 亚洲高清不卡| 国产欧美日韩高清| 亚洲青色在线| 很黄很黄激情成人| 亚洲看片网站| 在线观看欧美日本| 在线午夜精品| 亚洲狼人精品一区二区三区| 香蕉久久一区二区不卡无毒影院| 欧美午夜大胆人体| 老司机午夜精品| 国产女人精品视频| 99综合电影在线视频| 亚洲高清色综合| 亚洲自拍高清| 亚洲欧美日本在线| 欧美激情一二区| 中日韩美女免费视频网址在线观看| 亚洲国产日本| 老牛嫩草一区二区三区日本 | 99在线热播精品免费99热| 在线亚洲精品福利网址导航| 亚洲第一区在线| 欧美在线观看视频一区二区三区| 国产日韩精品视频一区二区三区| 亚洲在线中文字幕| 欧美激情视频在线免费观看 欧美视频免费一 | 久久久在线视频| 午夜精品av| 国产精品欧美日韩一区| 久久永久免费| 国产毛片一区二区| 亚洲小视频在线观看| 亚洲一区二区在线播放| 欧美天堂亚洲电影院在线播放| 欧美一区二区三区四区高清| 欧美日韩在线播放三区四区| 最新国产精品拍自在线播放| 国产精品久久久久av免费| 99v久久综合狠狠综合久久| 亚洲毛片av在线| 欧美激情精品久久久久久| 亚洲国产精品悠悠久久琪琪| 在线观看日韩av电影| 99视频日韩| 亚洲一二区在线| 久久本道综合色狠狠五月| 欧美一二区视频| 国产老肥熟一区二区三区| 免费亚洲视频| 一区二区三区在线免费观看| 老司机免费视频久久| 亚洲电影专区| 亚洲最新视频在线播放| 国产精品日韩欧美一区| 欧美在线观看网址综合| 亚洲视屏一区| 欧美午夜视频在线| 欧美激情精品久久久久久变态| 欧美伦理91| 亚洲视频一区二区| 久久九九精品99国产精品| 欧美日本国产精品| 在线视频精品一区| 久久久精品tv| 亚洲免费观看在线观看| 国产精品久久久久久av福利软件| 欧美寡妇偷汉性猛交| 亚洲精品在线二区| 国产精品v一区二区三区| 欧美一区二区日韩| 亚洲欧美中文字幕| 国产一区二区成人久久免费影院| 一区二区三区免费网站| 最新高清无码专区| 欧美性开放视频| 日韩一区二区精品视频| 久久精品91| 亚洲视频电影在线| 在线看片成人| 国产精品美女www爽爽爽视频| 亚洲三级免费观看| 久久综合色8888| 欧美刺激性大交免费视频| 宅男精品视频| 欧美**人妖| 午夜一区在线| 亚洲欧美怡红院| 亚洲精品久久久久久下一站| 国产乱人伦精品一区二区| 欧美大片在线看免费观看|