游戏开发论坛

 找回密码
 立即注册
搜索
楼主: zzzworm

关于骨骼动画及微软示例Skinned Mesh的解析

[复制链接]

154

主题

4567

帖子

4579

积分

论坛元老

Rank: 8Rank: 8

积分
4579
QQ
发表于 2007-7-22 21:13:00 | 显示全部楼层

Re:关于骨骼动画及微软示例Skinned Mesh的解析

好文!最近快被骨骼动画整疯了,不是花屏就是黑屏 T_T

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

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

Re: Re:关于骨骼动画及微软示例Skinned Mesh的解析

fromhell: Re:关于骨骼动画及微软示例Skinned Mesh的解析

顶一个,推荐[Advanced Animation with DirectX][EN],该书将xfile以及骨髓动画原理等讲解非常透彻!

的确是本好书,过去我也看的这个,不过很老了,例子是9.0b的,需要自己改成9.0C版本的,也是个大手术

3

主题

18

帖子

23

积分

注册会员

Rank: 2

积分
23
 楼主| 发表于 2007-7-24 15:49:00 | 显示全部楼层

回18楼:

----------------------------------------
问一下楼主,对于微软的这个例子我一直有个问题没弄明白,他为什么要把mesh存放到Frame里面,然后通过调用Frame包含的网格指针来绘制网格。这样画一个人可能没什么,可是如果我们画一条蜈蚣(呵呵),几百根骨骼几百个Frame,而在mesh只有一个的情况下,就需要递归的搜索Frame的二叉树才能把那个mesh画出来,是不是有点太浪费CPU了呢。如果我们反过来弄,每读取一个mesh就把它添加到一个线性链表中去,只是在网格宽容器通过保存一个指向Frame的指针来把它与Frame关联起来,这样绘制网格时就只需要循环网格链表就可以画出所有的网格了,尤其在Frame的数量很多而mesh较少的情况不是更结省时间呢。
事实上我就一直是这么干的,但是我不明白微软的做法有什么好的?请指救,谢谢!
-----------------------
你提的这个问题我也纳闷. 估计与生成X的工具有关系. 单Mesh和多Mesh都可以用,性能差别也不大.就看开发者本人的习惯和组织方式罢. 这个也只过来人能说清楚,咱们只能在实践中摸索了.好多做引擎的都不用x格式的而用自定义的mesh文件.

我下载的dx9_august2006 版本中,示例代码有不少变化.它所提供的max7的导出插件DxExtensionsMax.gup有时就生成多Mesh的. 而3dmax8的一个x插件xskinexp.dll就经常导出单个mesh的.


不过, 最近我也有一个很大的困绕,不知各位是否有答案. 动态减面的渐进网格PMesh,似乎不支持动画骨骼mesh. 也就是说,[B]动画人物无法做成动态减面的?![/B] ----- 这方面的资料奇缺. 也就是说,为了绘制最远处的一个小人,你也要和近处的一样,动用几千个面去绘! 是不是太笨了??  难道只能手动让美工做远中近三套骨骼来LOD吗???

关于骨骼动画的LOD,有两种典型说法: 一种是, 没必要----因为现在渲染瓶颈通常并不在几何面的数量上. 动画减面带来的提升不大. 另一种是上面所说的多模型方案. 不知有何良策? 肯定没有现成的DxAPI来减面吧.


11

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
发表于 2007-7-25 20:03:00 | 显示全部楼层

Re:关于骨骼动画及微软示例Skinned Mesh的解析

如何加载不同的动画集???????????????????????

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-7-26 13:55:00 | 显示全部楼层

Re:关于骨骼动画及微软示例Skinned Mesh的解析

回复14楼,可以考虑用法线贴图,用低模一样可以表现细致的高模效果

54

主题

116

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2007-7-27 18:28:00 | 显示全部楼层

Re:关于骨骼动画及微软示例Skinned Mesh的解析

    看过楼主的这篇文章,感觉受益颇深。对蒙皮骨骼模型的结构有个更深的了解。下面是我在您文章中体会的,不知道哪些不对,请指教。
   骨骼动画模型的骨骼是以树状结构组织起来的(由.X文件中的Frame框架结构描述骨骼的结构),整个骨骼结构中有一块根骨(在SDK的tiny.x文件中是Scene_Root),其他的骨骼都直接或间接连接到根骨骼上,形成角色的骨骼框架。
   在骨骼动画的基本原理中,每块骨头都带有两个矩阵。一个是初始变换矩阵,表示骨骼的初始位置。另一个是组合变换矩阵,实现角色动画。在.X文件中,Frame框架里的FrameTransformMatrix代表骨头的第一个矩阵(初始变换矩阵)。AnimationKey里每个关键帧中的变换矩阵(当keyType为4时)代表骨头的第二个矩阵(组合变换矩阵),而且他是根据时间变换而对应关键帧中的变换矩阵。这就说明了骨骼的运动由Frame框架和Animation模版决定。由Frame框架搭建起骨骼结构,Animation指定对应骨头在某一时刻的动作(在Animation要引用框架的名字)。
    当骨骼运动的时候,依附于骨头的蒙皮要随之一起运动。通过SkinWeights指定各骨头对应的顶点信息。从而“肉”的运动是由SkinWeights以及骨头的运动决定的。
    以上我把骨骼动画分为了两部分:分别是“骨头”的运动和“肉”的运动来理解。

    不知道我以上的论断对不对,请指教。

     另外我还有几个不懂的问题,
1。 Frame是不是所谓的骨头呢?我把Frame当作骨头看对不对呢?看起来挺合理的,但是这样看的话就会造成有的“骨头”没有“肉”(也就是没有SkinWeights与之关联)。比如SDK中的tiny.x文件中有47个Frame框架,47个Animation动作,它们两个是对应的,各个Animation中分别引用了响应的框架。但SkinWeights只有35个(XSkinMeshHeader中的nBone也是35),而且只有Frame和Animation中的35个与之对应,这岂不是造成有的“骨头”没有“肉”了么?
    按理说每个Frame框架都有一个Animation动作,那么Frame就应该是骨头啊。但是XSkinMeshHeader中的骨头数目又和Frame框架数目不同,太困惑了。

2。还有SkinWeights模版中的STRING transformNodeName进行实例化的时候,是不是就实例化为Frame的名字?

谢谢了,很期待答复




0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2007-7-27 21:50:00 | 显示全部楼层

Re: Re: Re:关于骨骼动画及微软示例Skinned Mesh的解析

tonykee: Re: Re:关于骨骼动画及微软示例Skinned Mesh的解析


的确是本好书,过去我也看的这个,不过很老了,例子是9.0b的,需要自己改成9.0C版本的,也是个大手术

[em6]动手术的人飘过..... [em22]

3

主题

18

帖子

23

积分

注册会员

Rank: 2

积分
23
 楼主| 发表于 2007-7-28 14:06:00 | 显示全部楼层

回26楼

你的理解是对的. 我也是这么想地.呵呵.

你第一个问题,关于Frame和Bone的异同及数目问题. 我的想法是这样的:
XSkinMeshHeader的骨骼数35,是指含有蒙皮信息的骨骼数目. 如果一个骨骼没有蒙皮信息,只有它本身的初始及运动矩阵,那么它就只有Frame及Animation数据,而没有SkinMesh相关数据. 在平时分析时,我们主要关心那些SkinMesh对应的Bone. 所以,纯骨骼和含蒙皮骨骼总数是47,与Frame一致.

那么,纯骨骼有用吗? ----是有用的.虽然它没有蒙皮信息,但它处在父Frame的地位,所以在矩阵变换中会影响到其它所属骨骼的坐标转换. 当然,看tiny.x文件,(你随便卡掉其中一个纯骨骼的AnimationKey,再观察后果)会发现,
其中有两个骨骼非常有影响.Box01,Bip01,人物出现平移,扭动等后果.可见这两个骨骼对人物起到了微调和定位作用.(微软做这个小丑的时候可能也用到了3dmax,把人物121走三步摆下来的).
当然,还有大量的哑元骨骼,起到占位的作用,即一系列dummy骨骼,它们的动画数据全是1.0000,0.00000,也就是它们的矩阵实际上不起作用.这些骨骼现在没用,可以去掉没影响.在必要时会有用(如弯腰,转身等)


第二个问题,Frame的名字,是由Frame xxxx{} 中名字xxxx决定的,不是由skinweight名字决定的,尽管二者有一定关联.Frame {} 这种情况,对应于无名的Frame
在示例中,我们用骨骼名寻找对应的Frame,用到了D3DXFrameFind()函数



8

主题

34

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2007-7-28 15:32:00 | 显示全部楼层

Re:关于骨骼动画及微软示例Skinned Mesh的解析

一个顶点对应的多个骨骼权重怎么存放?是不是在当前子集中有多个同样的顶点,权重不同,对应的矩阵索引不同,然后混合
--------------------------------
楼主你说的这个问题解决没?我也想知道

3

主题

18

帖子

23

积分

注册会员

Rank: 2

积分
23
 楼主| 发表于 2007-7-28 16:41:00 | 显示全部楼层

回楼上

下面的定义可以解决该疑问----不需要多份顶点,只一个顶点就行了.采用D3DFVF_XYZB4格式.
微软的这个示例可能只要用D3DFVF_XYZB2就够了

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 |D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
        D3DXVECTOR3 v;      
        FLOAT       blend1;  
        FLOAT       blend2;  
        FLOAT       blend3;  
                                                 
        DWORD       indices;  
        D3DXVECTOR3 n;      
        FLOAT       tu, tv;  
};
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-9 18:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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