物惯(子到父节点)变换顺序原因和不同坐标系下的变换顺序详解

本文详细探讨了OpenGL与Direct3D在坐标变换顺序上的差异,主要涉及缩放、旋转和平移操作。在OpenGL中,由于采用列式矩阵,连续变换顺序需为平移->旋转->缩放,而D3D则相反。同时,文章解释了如何通过视口和投影变换调整乘法顺序,并讨论了在不同坐标系下变换顺序的影响。对于连续骨骼节点变换和局部坐标系统的情况,也给出了相应的变换方法和理解。
摘要由CSDN通过智能技术生成
在基于同一个参考坐标系中(也就是子节点到父节点坐标系中的变换),对于一个基本变换,D3D中要先缩放->旋转->平移。OGL中要先平移->旋转->缩放,其中的原因解释?

OGL中是左乘矩阵,因此子节点变换到父节点是先平移后旋转缩放,才是正确的变换顺序。
关于先平移后旋转不是OGL中解释的每次是基于当前嵌套坐标系变换,而是因为变换的矩阵乘法顺序和乘法规则规定的。
D3D中先旋转后平移才能如描述期望的正确变换。

如果改为先平移后旋转,出现问题的原因不是因为绕父节点基向量变换(公转,D3D中可以考虑为基于当前坐标系绕父节点公转),也不是绕子节点基向量变换(基于本地坐标,OGL中的变换顺序平移->旋转->缩放是可以这样考虑的),旋转没有问题,但是平移出现了不同。 因为在子节点坐标系为当前变换基向量中,进行了基于父节点的平移向量,乘以每个当前基向量提取出了部分相对于父节点基向量的权重也就是列向量,进行平移,作为结果。 进行了基于将要变换到的坐标系(旋转后坐标系,而不是平移)的分解组合结果,进行基于父节点坐标系的变换(平移量)。解释为矩阵变换顺序和乘法规则导致的结果即可,且要理解在D3D矩阵乘法规则下,子节点变换到父节点顺序是:缩放->旋转->平移, OGL中相反(乘法顺序不同)。

缩放和投影会改变轴大小,旋转会改变轴的走向,平移改变物体本地坐标原点位置;更多的是他们的乘法规则,乘法顺序会得到不一样的结果,结果是否是期望的作为判定是否正确标准
物体做不基于本地坐标系的变换,需要先平移回本地放射坐标系中进行放射变换,再平移回去原来位置,实现变换,但是一般设计中都是美术设计好基于模型本地坐标系进行缩放旋转平移变换,再平移到世界坐标系中。

下图为证明过程:


OGL中也是要缩放->旋转->平移顺序才得到在父坐标系(例如世界)中描述的结果,但是因为OGL中矩阵表示是列式矩阵,所以连续变换的顺序是左乘当前矩阵(矩阵变换向量也是左乘向量)才相当于D3D中的右连乘,所以OGL中同一个坐标系中变换是平移->旋转->缩放矩阵连序左乘才得到正确结果。


上述求取变换的转置矩阵:M^T = (SRT)^T = T^T * R^T * S^T刚好是OGL中的平移旋转缩放矩阵(D3D转置矩阵)存放方法,但是OGL中新进矩阵乘法顺序其实还是右乘新的(无论是新进矩阵还是新进入向量,D3D中也是右乘新的矩阵但是向量是左乘的),所以通过视口变换,投影变换提前压栈实现乘法顺序的改变(如果新进是左乘,则就不需要提前设置视口变换了,这叫矩阵列式存储了,矩阵变换必将乘法顺序改变,是手动改变,还是底层新进矩阵自动左乘,显然OGL给出的答案是底层新进还是用右乘的,代码调整顺序写入先后即可)。因为是右乘新进的矩阵,所以OGL中,先设置Translate, Rotate,Scale实现变换。得D3D的M^T = T^T * R^T * S^T也就是OGL的M=T*R*S,向量右乘矩阵即可。

故OGL视图模型变换中,先设置视图变换,然后再设置模型变换。但平移旋转缩放不是相对于相同的父坐标系(如世界)那么乘法顺序就另当别论了。


OGL中的连续骨骼节点变换,基于全局坐标系的思考,照样描述(D3D),实现代码用连续左乘(也确保了最终节点左乘在最左边)得到叶子节点的变换矩阵,左乘向量得结果。

OGL中连续变换在节点内也可以用本地坐标系统考虑,本地坐标系统会跟着物体变换,也就是先平移到一个位置,本地坐标系统也平移了这个位置,在进行旋转,然后基于旋转后的本地坐标系进行缩放,在节点之间平移累加是不分先后的直接累加即可

OGL中行星卫星绕恒星旋转示例:

/*
 * Copyright (c) 1993-2003, Silicon Graphics, Inc.
 * All Rights Reserved
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose and without 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值