下图为证明过程:
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