游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8023|回复: 14

矩阵也可以进行插值

[复制链接]

20

主题

136

帖子

172

积分

注册会员

Rank: 2

积分
172
发表于 2008-12-21 19:16:00 | 显示全部楼层 |阅读模式
前一段时间打算使用四元数来存储角位移,书上说明四元数存储方位使用了四个数,而矩阵则需要“浪费”九个数,事实真的如此吗?

四元数可以说在动态物体中一无是处,首先,动态物体伴随着旋转、平移、缩放等;其次,动态物体具有三个朝向,而四元数仅能连接针对向量的多次旋转,最后,每一桢动态物体经过少量的运动变换便总是要转换到基向量矩阵以便输出给渲染系统。

若要完整的表现动态物体的方位问题,共需要对三个朝向进行旋转,至于插值问题,仍需要从动态物体的状态中抽取向量,不仅各个轴向均要参与计算,要使得多个轴向均符合插值需要,仍要计算两组。鉴于四元数不是动态物体状态的标准表达形式,和其难于使用的特点,并且比矩阵更难于捉摸的误差累积,使得相机动画等设计实现受到了限制。

旋转矩阵使用了九个数,这在存储上处于劣势,但是对于动态物体,这点损失可以忽略,具体的旋转连接,四元数展开的运算和矩阵的任意轴旋转是一样的,但因为只反映一个向量的旋转,所以不像矩阵那样作用于三个向量,而事实上 UVN 系统要求旋转连接对应于三个向量而非一个,所以四元数在这里便失去了连接以优化效率的作用,并且矩阵用法在结合平移的时候,避免了表达方式之间的转换。四元数是一种古怪的使用四个数替代了原本共需要完整的九个数反映三个向量的旋转、平移、缩放的连接来处理单个向量的旋转连接的系统。

看来 slerp 插值成为了使用四元数的决定性因素,其实,在考虑使用四元数之前,我便解决了矩阵的插值问题,我认为矩阵不仅可以插值,并且更好地反映了插值的本质。另有一个优势,矩阵的单位基向量对于四元数来说是零角位移,而四元数则无法使用零角位移参与连接,必须连接对象的模为单位长度,只能通过外部指定,缺乏封装的特性。

void SystemUVN::Match_N(const Vector3& p)
{
    if (p.Mod() < Epsilon)
        return;
    Vector3 N(_Axis._31, _Axis._32, _Axis._33);
    N.Normalize();
    Vector3 P = p.Normalize();
    float dot = N * P;

    Vector3 n;
    if (dot > 0.99999f) // cos(Angle(0.25).ToRadian())
        return;
    if (dot < -0.99999f)
    {
        dot = std::max(dot, -1.0f);
        n = (Get_U() - Get_V()).Normalize();
    }
    else n = N.CrossProduct(P).Normalize();

    _Axis *= Matrix().BuildRotation(n, Radian(acos(dot)).ToAngle());

    _CheckOrthogonalization();
}

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2008-12-21 22:02:00 | 显示全部楼层

Re:矩阵也可以进行插值

lz还没有完全把四元数弄明白吧
四元数的很多优点是matrix比不上的,占用空间少,计算时间快,旋转没有顺序约束
至于你说的
“动态物体具有三个朝向,而四元数仅能连接针对向量的多次旋转”
去研究一下四元数乘法的意义吧

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
发表于 2008-12-22 07:46:00 | 显示全部楼层

Re: Re:矩阵也可以进行插值

clayman: Re:矩阵也可以进行插值

lz还没有完全把四元数弄明白吧
四元数的很多优点是matrix比不上的,占用空间少,计算时间快,旋转没有顺序...


4元数确实很好用.但也不能说matrix就不好用,某些图形引擎使用欧拉角+矩,比直接算元数方便

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-12-22 10:35:00 | 显示全部楼层

Re:矩阵也可以进行插值

感觉骨骼里面的运动旋转差值还是四元素的好,其他用矩阵

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2008-12-22 20:05:00 | 显示全部楼层

Re:矩阵也可以进行插值

个人感觉骨骼动画不插值也看不出来..使用世界坐标-_-!父节点都不需要了

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-12-22 23:42:00 | 显示全部楼层

Re:矩阵也可以进行插值

父节点都不要?
那旋转时影响的权重传递怎么解决?

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2008-12-23 09:06:00 | 显示全部楼层

Re:矩阵也可以进行插值

没有最好的。看你怎么用。不同的地方用不同的东西

7

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
发表于 2008-12-23 18:21:00 | 显示全部楼层

Re: Re:矩阵也可以进行插值

tonykee: Re:矩阵也可以进行插值

父节点都不要?
那旋转时影响的权重传递怎么解决?


functional

1

主题

203

帖子

208

积分

中级会员

Rank: 3Rank: 3

积分
208
发表于 2008-12-25 10:01:00 | 显示全部楼层

Re:矩阵也可以进行插值

楼主根本不懂数学,去看看Graphics Gems里面的Polar Decomposition吧

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2008-12-26 20:59:00 | 显示全部楼层

Re: Re:矩阵也可以进行插值

tonykee: Re:矩阵也可以进行插值

父节点都不要?
那旋转时影响的权重传递怎么解决?

权重传递是什么东西?-_-
貌似受父节点影响的只有旋转缩放位移..顶点的蒙皮权重也要受影响?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 14:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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