游戏开发论坛

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

关键帧插值的问题

[复制链接]

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
发表于 2009-3-6 14:33:00 | 显示全部楼层 |阅读模式
请大家看下我对关键帧插值的理解是否正确。
插值有两种方式:网格变换矩阵的插值和网格的对应顶点间插值。
网格变换矩阵的插值,是将4X4矩阵的前3X3矩阵用四元数做平滑旋转插值,将最后一行的1X3向量做线性插值。这种方式可以插值出网格移动和旋转效果。
网格的对应顶点间插值,是将两个网格对应的顶点位置做线性插值。这种方式可以让两帧间的过度更为平滑。

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-3-6 22:01:00 | 显示全部楼层

Re:关键帧插值的问题

对quaternion做slerp差值,对translation做lerp差值
最后再合成矩阵

不是先构造矩阵,然后对每个部分差值

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2009-3-7 09:27:00 | 显示全部楼层

Re:关键帧插值的问题

clayman的意思是,每帧的方位用 四元数和位置 记录?
我是想每帧的方位用矩阵记录。
用四元数更好些么?

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-3-7 10:04:00 | 显示全部楼层

Re:关键帧插值的问题

位置用vector3记录
旋转用quaternion,如果有旋转的再用额外的变量来记录

.x文件的思路也是这样的,把关键帧分为4类:
rotation,只有旋转,用quaternion保存,大部分人物骨骼动画都只有渲染
scale,只有缩放,用vector3保存
translation, 只有位置,用vector3保存
transormation matrix,可以包含缩放,旋转和位移

因为matrix对旋转的插值不正确,所以对最后一种关键帧,我也把matrix decompose成了单独的旋转,缩放和位移,分别插值。
quaternion插值要比matrix计算量小,特别是对于多次旋转的情况,先用quaternion计算,最后再转为matrix是最高效的
另外分开保存比matrix还节约储存空间,对于均匀缩放来说(大部分引擎都只允许均匀缩放),只要8个float,非均匀缩放10个float,而4×4的matrix需要16个

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2009-3-8 11:42:00 | 显示全部楼层

Re:关键帧插值的问题

对于均匀缩放来说(大部分引擎都只允许均匀缩放),只要8个float,非均匀缩放10个float,而4×4的matrix需要16个
我觉得均匀缩放只要1个float,非均匀3个float啊。

我的意思是用矩阵保存帧的方位,然后在插值时将矩阵分解成旋转,缩放,平移,插值后再组成新的矩阵。

另外想问下矩阵的旋转插值是怎么做的?求三个方向的旋转角度,然后对角度插值,再组合成矩阵?

3

主题

84

帖子

84

积分

注册会员

Rank: 2

积分
84
发表于 2009-3-10 17:33:00 | 显示全部楼层

Re:关键帧插值的问题

请问从一个矩阵中
就可以获得旋转、缩放、位移的分量吗?

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2009-3-10 17:56:00 | 显示全部楼层

Re:关键帧插值的问题

kalu169
用D3DXMatrixDecompose

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2009-3-11 08:20:00 | 显示全部楼层

Re:关键帧插值的问题

其实可以不用对矩阵和四元素进行差值,即使差值用线性差值也完全可以的,我的骨骼插件里面没有去使用四元素,全部用了矩阵,我是把一个顶点的最终位移按骨骼影响权重直接在shader里面进行差值的,效果也很不错。

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-3-11 10:22:00 | 显示全部楼层

Re:关键帧插值的问题

直接对矩阵插值只适用于关键帧密度很大的情况。

位置、旋转、放缩三个分量分别插值是最正确的做法。旋转用四元数插值,结果最正确、计算量最小。

D3DXMatrixDecompose有一定的适用范围,并不能保证总是拆解成功。一般主要用于只有旋转和位移组成的正交矩阵。

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2009-3-11 10:41:00 | 显示全部楼层

Re:关键帧插值的问题

谢谢大家的热心回答。
仔细想想也对,要从矩阵获取旋转,缩放,矩阵必须是正交的,否则拆不出来。
因为我用Md2,Md2只有矩形,一开始我是想直接用它的矩阵,看了大家的回答还是用一次D3DXMatrixDecompose拆开吧,分开插值。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 03:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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