游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4028|回复: 9

骨骼蒙皮.X 文件一些???

[复制链接]

8

主题

17

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2007-12-5 22:27:00 | 显示全部楼层 |阅读模式
各位前?好
??r是??拥
小弟手上有一本DX8的??Programming Role Playing Games with DirectX, 1st edition)
?面有?解到骨骼蒙皮.X的?取方法以及概念等等
小弟想利用?概念然後?⒖?DK改成DX9.0c版本的作法
但是遇到一些???

想?教
IDirectXFile, IDirectXFileEnumOject, IdirectXFileData, IDirectXFileDataReference
?四?型?B是差在哪?
以及 AnimationSet和Animation又是差?e在哪?
然後根??牢牡慕Y果
似乎是IDirectXFile ?成了 ID3DDirectXFile  
IdirectXFileData ?成了  ID3DDirectXFileData
IDirectXFileEnumOject同理
但是在DX9.0c?面似乎?]有IDirectXFileDataReference??????

小弟?? 了解?些?α私?DK中?例文件???是有?椭??(MultiAnimation, SkinnedMesh等等)
??各位前?指教 感?

14

主题

48

帖子

48

积分

注册会员

Rank: 2

积分
48
发表于 2007-12-5 22:49:00 | 显示全部楼层

Re:骨骼蒙皮.X 文件一些???

你可以找同作者的另一本书看看《DirectX高级动画制作》,兴许你在那里会找到不少线索

5

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2007-12-6 11:32:00 | 显示全部楼层

Re:骨骼蒙皮.X 文件一些???

为了加载数据.使用IDirectXFile接口.主要有三个方法:
CreateEnumObject();
CreateSaveObject();
RegisterTemplates();

第一个方法是创建IDirectXFileEnumObject的方法.
IDirectXFileEnumObject 接口
可以使用这个接口所提供的方法来读取X文件里的数据;主要方法有
GetDataObjectById 通过GUID号来读取数据;
GetDataObjectByName 通过名称来读取数据;
GetNextDataObject  遍历所有顶层模板的数据;

IDirectXFileData用来在X文件中获取单个模型中的数据.类似IDirectXFileEnumObject::GetNextDataObect,IDirectXFileData::GetNextObject
可以遍历所以的子模板然后返回一个IDirectXFileData接口.方法IDirectXFileData::GetData用于获取来自模板的数据,但在获取数据之前,需要知道模板的类型.方法IDirectXFileData::GetID返回模板的GUID.例如,如果模板是Frame模板,GetID将会返回TID_D3DRMFrame,这在DX的头文件里有定义.

5

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2007-12-6 11:34:00 | 显示全部楼层

Re:骨骼蒙皮.X 文件一些???

为了加载数据.使用IDirectXFile接口.主要有三个方法:
CreateEnumObject();
CreateSaveObject();
RegisterTemplates();

第一个方法是创建IDirectXFileEnumObject的方法.
IDirectXFileEnumObject 接口
可以使用这个接口所提供的方法来读取X文件里的数据;主要方法有
GetDataObjectById 通过GUID号来读取数据;
GetDataObjectByName 通过名称来读取数据;
GetNextDataObject  遍历所有顶层模板的数据;

IDirectXFileData用来在X文件中获取单个模型中的数据.类似IDirectXFileEnumObject::GetNextDataObect,IDirectXFileData::GetNextObject
可以遍历所以的子模板然后返回一个IDirectXFileData接口.方法IDirectXFileData::GetData用于获取来自模板的数据,但在获取数据之前,需要知道模板的类型.方法IDirectXFileData::GetID返回模板的GUID.例如,如果模板是Frame模板,GetID将会返回TID_D3DRMFrame,这在DX的头文件里有定义.

5

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2007-12-6 11:34:00 | 显示全部楼层

Re:骨骼蒙皮.X 文件一些???

为了加载数据.使用IDirectXFile接口.主要有三个方法:
CreateEnumObject();
CreateSaveObject();
RegisterTemplates();

第一个方法是创建IDirectXFileEnumObject的方法.
IDirectXFileEnumObject 接口
可以使用这个接口所提供的方法来读取X文件里的数据;主要方法有
GetDataObjectById 通过GUID号来读取数据;
GetDataObjectByName 通过名称来读取数据;
GetNextDataObject  遍历所有顶层模板的数据;

IDirectXFileData用来在X文件中获取单个模型中的数据.类似IDirectXFileEnumObject::GetNextDataObect,IDirectXFileData::GetNextObject
可以遍历所以的子模板然后返回一个IDirectXFileData接口.方法IDirectXFileData::GetData用于获取来自模板的数据,但在获取数据之前,需要知道模板的类型.方法IDirectXFileData::GetID返回模板的GUID.例如,如果模板是Frame模板,GetID将会返回TID_D3DRMFrame,这在DX的头文件里有定义.

8

主题

17

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2007-12-6 22:27:00 | 显示全部楼层

Re:骨骼蒙皮.X 文件一些???

感?指?
不?似乎?]提到IDirectXFileDataReference???的作用
不知道能不能再厚?皮要??大略的解??
?之小弟再配合SDK揣磨看看
有不了解之?再?碚?教
也感?二?翘峁┑??

0

主题

2

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2007-12-7 00:02:00 | 显示全部楼层

Re:骨骼蒙皮.X 文件一些???

《DirectX高级动画制作》书中详细的介绍,我大致说明一下:
读取.x文件得一般过程为:1.创建文件对象(IDirectXFile object);2.注册通用模版;3.创建枚举对象(IDirectXFileEnumOject object);4.循环遍历顶层数据对象;5.循环遍历底层数据对象。
至于IdirectXFileData, IDirectXFileDataReference在遍历数据对象时用到,IdirectXFileData是实例型对象;IDirectXFileDataReference是引用型对象,这两种对象在PaseObject函数中分别处理;
AnimationSet和Animation都是.x文档中的通用模板名称,AnimationSet是动画集,它包括Animation,你可以自己用写字板打开一个带关键帧动画的.x文件查看他们的关系;
如果有这方面的经验可以和我联系:sh_l999@126.com

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2007-12-7 23:00:00 | 显示全部楼层

Re:骨骼蒙皮.X 文件一些???

那套书我全看了
了解个思路最重要
深入研究具体实践用处不大
因为DX接口狂改
我用了书上那套方法用DX9.0C加载了X文件
最后发现效率很低
原因在一个更新层次的函数
用了锁两段内存然后对拷,这个吃了太多的CPU了
还是得学学DXUT的那些API加载才有效率

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2007-12-7 23:29:00 | 显示全部楼层

Re:骨骼蒙皮.X 文件一些???

顺便说一下
X文件到了9.0C如果想要实现加载动画的话
那么不要用IDirectXFile那些接口
要用ID3DXFile
ID3DXFile跟先前版本的API的改动比较大的有两个地方
第一个就是遍历所有元素的时候用的是:
if(SUCCEEDED(pDXEnum->GetChildren(&dsize)))
{
        for(DWORD i=0;i<dsize;i++)
        {
                pDXEnum->GetChild(i,&pDXData);
                ParseXFileData(pDXData, TempFrame,TexturePath);
                ReleaseCOM(pDXData);
        }
}
第二个地方就是引用对象IDirectXFileDataReference这个不用了
因为里面有一个函数是ID3DXFileData::IsReference()
这个可以判断当前的ID3DXFileData是不是引用对象
这个在加载蒙皮骨骼动画的时候要用上
是引用对象的话
那么存的就是的名称AnimationKey 的名称
分析下一个X文件就会看到
  AnimationKey {
   .............
  }
  { Scene_Root }
}
如果遍历到的那个ID3DXFileData调用IsReference()的话那就是指向{ Scene_Root }
这种对象
这种是属于Frame这种对象,那么就把这些当Frame处理,获取其字段当作这个结点的名称
最后一点要注意的就是动画里面的信息要跟
template AnimationKey
{
    < 10DD46A8-775B-11CF-8F52-0040333594A3 >
    DWORD keyType;
    DWORD nKeys;
    array TimedFloatKeys keys[nKeys];
}
里面这些对得上,因为
pDataObj->Lock( &dSize, &Buffer )这样来得到指向对象的指针的
所以最好熟悉C++里面结构内存分布,别移错位置了,要不...可怜的模型(例如TINY.X(这个女人被大伙摧残得快不成人了=.=!))
具体代码因为本人老电脑不幸归天,所以正确加载X文件动画的代码短时间内得不到
其他代码很混乱
就不发了...

8

主题

17

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2007-12-8 13:53:00 | 显示全部楼层

Re:骨骼蒙皮.X 文件一些???

???孜徊??其?┑闹v解
?ξ?W??椭?艽
非常感?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-17 10:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表