游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4339|回复: 7

[求教]骨骼动画一般是如何存储的? 又是按何种流程进行渲

[复制链接]

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-11-17 21:56:00 | 显示全部楼层 |阅读模式
下面是我对骨骼动画的理解,不知道对不对:

假设有以下数据

数据1: 顶点
struct SVertex
{
   顶点位置(3D向量)
};

数据2: 纹理坐标信息
struct SUVInfo
{
   顶点0的UV
   顶点1的UV
   顶点2的UV
};

数据3: 三角形
struct SFace
{
   顶点0索引
   顶点1索引
   顶点2索引
   UV纹理坐标索引
};

数据4:骨骼数据
struct SBone
{
   父骨骼索引
   相对于父骨骼的位置(3D向量)
   相对于父骨骼的旋转量(4D向量)
   这个骨骼影响的所有顶点信息(一个顶点索引表)
};

文件存储格式可能是这样:
1:顶点数据
2:纹理坐标信息
3:三角形信息
4:N个动画帧,其中每一个动画帧都包含X个骨骼数据
5:每个骨骼对应的一个变长的顶点索引表


然后,下面是游戏里每一帧的计算流程:
首先找到当前帧的骨骼,然后遍历所有骨骼,对每一个骨骼进行如下计算:
1:若该骨骼有父骨骼,则将父骨骼旋转矩阵和自己的矩阵进行相乘,然后找到他所影响的所有顶点,对这些顶点进行变换.
2:若该骨骼还有子骨骼,则遍历子骨骼,直到处理完所有子骨骼.
其中,内存里有一份完整的模型顶点存储区,用来存储被变换后的顶点,然后,三角形索引将使用这些顶点进行光栅化.

另外,这里有个很模糊的一点是,对于骨骼所影响的那些顶点,他们的位置应该是相对于骨骼的吧?
那这样的话,上面提到的第1个顶点数据似乎就没有必要存在了,只需要存储每个骨骼对应哪些顶点就行了.
然后,流星蝴蝶剑里的模型文件,却不是这样,他就有一个原始的顶点数据,就是两臂伸直,直立的造型.

请问,到底应该是什么样子的呢[em24]

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2012-11-18 14:19:00 | 显示全部楼层

Re:[求教]骨骼动画一般是如何存储的? 又是按何种流程进

你搞反了.骨骼不存储顶点信息.
每个顶点存储影响该顶点的骨骼索引.通过索引找到骨骼信息,对自身的原始坐标进行变换.

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-11-18 16:55:00 | 显示全部楼层

Re: Re:[求教]骨骼动画一般是如何存储的? 又是按何种流程

神秘的猫: Re:[求教]骨骼动画一般是如何存储的? 又是按何种流程进行渲染的?

你搞反了.骨骼不存储顶点信息.
每个顶点存储影响该顶点的骨骼索引.通过索引找到骨骼信息,对自身的原始坐标进行变换.


恩,
那还有2个问题有点模糊
1:顶点位置究竟是如何被改变的? 用骨骼的变换矩阵直接变换顶点(原始坐标)就行了?
2:骨骼的变换矩阵,是从父骨骼的父骨骼的父骨骼...一路累乘下来的么?

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2012-11-18 22:14:00 | 显示全部楼层

Re:[求教]骨骼动画一般是如何存储的? 又是按何种流程进

1.是的
2.是的

6

主题

74

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
发表于 2012-11-18 23:48:00 | 显示全部楼层

Re:[求教]骨骼动画一般是如何存储的? 又是按何种流程进

骨骼动画模型分成顶点数据,3角型数据 和骨骼数据来看

1.顶点数据
vec3 pos
vec3 normal
vec2 uv
byte bindex[4]       ->>> 影响该顶点的骨骼变换矩阵索引,一般有1-4个
float bweight[4]     ->>> 每个骨骼对该顶点的权重

2.三角形数据,就是三角形顶点index

WORD/DWORD index[n]

3.骨骼joint信息,和层次信息

struct jointAttrib{
vec3 translation;
quat rotate;
vec3 scale;
};

然后每帧动画有多少根骨骼就有多少个joint属性。

最后还有个层次信息。 使骨骼组合为树形结构。


绘制准备。

1.取当前时刻的joint属性(视情况插值)
2.根据层次信息计算为matrix[n] n是骨骼数


渲染步骤。
A.可编程管线
vs里面做的话就是传matrix[n]到vs里面,然后剩下事情都在shader里面做了

B.软件做顶点变换。

for(each vertex){
vec3 pos=0,normal=0;
for(each index){
pos+=vertex.pos*bweight[index]*matrix[index];
normal+=vertex.normal*bweight[index]*matrix[index];
}
normalize(normal);

out.pos=pos;
out.normal=normal;
}

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2012-11-19 13:05:00 | 显示全部楼层

Re:[求教]骨骼动画一般是如何存储的? 又是按何种流程进

To 3楼:
如果按照LZ2楼的想法,第一点是不对的,模型的顶点是模型空间的,乘Bone矩阵之前还要乘一个初始矩阵进行空间转换.

另外4楼与法线相乘的那个matrix应该是3x3矩阵.

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-11-19 16:43:00 | 显示全部楼层

Re:[求教]骨骼动画一般是如何存储的? 又是按何种流程进

多谢楼上几位指点.

10

主题

149

帖子

149

积分

注册会员

Rank: 2

积分
149
QQ
发表于 2012-11-26 12:18:00 | 显示全部楼层

Re:[求教]骨骼动画一般是如何存储的? 又是按何种流程进

你放弃了2D啊?看来3D也不远了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-27 10:39

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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