实时渲染(第三版):第四章 转换 4.2.2 4.2.3 4.2.4

 

4.2.2 从欧拉转换矩阵中提取参数

    有时需要一个过程,来从一个正交矩阵中提取偶来参数h、p、r。该过程如公式4.19(4*4的矩阵被舍弃,3*3的矩阵已提供了足够的旋转信息)所示:

    公式4.19中,三个旋转矩阵的串联产生:

    从这个公式中,很显然,可以看出,pitch参数可以通过sin(p) = f21求得。还有,f01除以f11,f20除以f22,和head、roll参数有如下关系:

    因此,欧拉参数可以使用下面的公式4.22提取:

    不过,有一种特性情况需要我们处理。它发生于cos(p) = 0时;此时f01 = f11 = 0,函数atan2无法使用;但同时,sin(p) = ±1。因此,矩阵F可以简化为:

    我们可以先求出r±h的值:sin (r±h)/cos (r±h) = tan (r±h) = f10/f00 -> (r±h) = atan2(f10, f00)。然后,r、h的值就看着办吧(一般h可以取0)。

    注意,根据arcsin的定义(参考节B.1),p要满足:-π/2≤p≤π/2;也就是说,如果F创建时的p值超出该范围,则无法提取原参数。如果h、p、r的值不唯一,则说明有多套欧拉参数可以产生相同的转换。欧拉角转换的更多信息可参考Shoemake1994年的文章。上面概述的简单方法可能会产生数值不稳定的问题,这个问题可以用一点速度为代价而避免。

示例:约束一个转换

    想象一下,你正拿一个扳手拧着螺栓,为将螺栓拧紧,你不得不旋转扳手,绕着x轴。现在假设你的输入设备(鼠标、VR手套,空间球等)向你提供了扳手的一个正交转换矩阵。你碰到的问题是,你不想对扳手使用该转换矩阵,因为扳手应当仅绕着x轴旋转,而提供的旋转矩阵可能是全方位的。因此,为限制输入的转换P为绕着x轴,可以简单地使用本节中叙述的方法提取欧拉角h、p、r,然后创建一个新的矩阵Rx(p)。它就是我们苦苦寻找的转换矩阵,让扳手仅绕着x轴旋转(如果P包含x轴移动的话)。

4.2.3 矩阵分解

    到现在为止,我们都处于一种前提,即我们知道转换矩阵产生的过程(PS:如何串联等)。但有时并不是这样:比如,和已转换的某个对象关联的串联后的矩阵。从串联后矩阵获取各种转换矩阵的任务叫做矩阵分解。

    获取一组转换的原因有许多,包括:

  • 为一个对象提取缩放因子。

  • 查找粒子系统所需的转换矩阵。比如,VRML使用一个Transform节点(参考节4.1.5),而不允许使用任意的4*4矩阵。

  • 检测模型是否仅使用了刚体转换。

  • 在动画的关键帧之间进行插值,如果只有对象的矩阵有效的话。

  • 从旋转矩阵中移除错切。

    我们已经介绍了两种分解:刚体转换到平移和旋转转换(参考结4.1.6),和正交矩阵到欧拉角(参考节4.2.2)。

    如我们所见,获得平移矩阵轻而易举,因为我们只需简单地取得4*4矩阵的最后一列的元素。我们还可以通过检查矩阵的行列式是否为负来检测是存在反射。要分离出旋转、缩放和错切,需要加倍的努力。

    幸运的是,网络上有若干关于该主题的文章以及代码。Thomas 和 Goldman 介绍了一些不同的方法用于各种类型的转换。Shoemake 对他们的技术作了改进,使之可以用于仿射矩阵;其算法独立于参照系,尝试分解矩阵以获得刚体转换。

4.2.4 任意轴旋转

    有时,让实体绕着任意轴旋转一个角度会比较方便。假设旋转轴为r,且已标准化,转换矩阵需要绕着r旋转α弧度。

    为创建该矩阵,首先需要找出另外的两个单位长度的轴(他们和r互相正交)。这些形成了一个基(基的一个例子是标准基,他们的轴分别是:ex = (1,0,0), ey = (0,1,0), ez = (0,0,1))。思想是改变基(节A.3.2):将标准基改变到新基,然后绕着轴(就说是x轴吧,需要和r对应)旋转α弧度,最后再转换回标准基。这一过程如图4.7所示:


图 4.7 绕任意轴r旋转,通过寻找有r,s,t组成的正交基达成。我们将找到的正交基对齐到标准基,以便让r和x轴对齐。然后执行绕着x轴的旋转,最后再转换回去。

    第一步是计算基的正交轴。第一个轴是r,即我们想要绕着旋转的轴。现在我们关心于寻找第二个轴s,而第三个轴t可以通过r和s的叉积求出。一种数值稳定的方法是找到r绝对值最小的部分,然后将之设为0。交换剩下的两个部分,其中的第一个部分取负(事实上,也可以是第二个部分)。数学上,它可以表示为:

    这可以保证s'和r是正交的(垂直的),且(r, s, t)是一个正交基。我们使用这三个向量作为矩阵的行:

    该矩阵转换向量r为x轴(ex),s为y轴,t为z轴。因此,最终的绕着标准化向量r旋转α弧度的转换矩阵为:

X = MTRx(α)M                (4.26)

    换句话说,我们首先进行转换让rchengwi x轴(使用M),然后我们绕着x轴旋转α弧度(使用Rx(α)),最后,我们再转换回去(使用M的逆,此处它的值和MT相同)。

    Goldman还介绍了另外一种绕任意标准化轴r旋转α弧度的方法。此处,我们简单地给出其转换矩阵:

    在节4.3.2,我们将介绍另外一种解决这个问题的方法--使用四元组。同时,在该节中还有对相关问题(比如从一个向量旋转到另外一个)的更加高效的算法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值