在OpenGL中,模型变换的顺序经常吧初学者搞得一头雾水。以下模型变换顺序是本人验证出来的。
这里光讨论两种模型变换的顺序问题,平移和旋转。
有两种模型变换方式:
第一种:使用glTranslatef和glRotatef
第二种:使用glMultMatrixf
二者都是产生一个变换矩阵,和原来矩阵堆栈顶端的矩阵相乘,二者的区别是:
glTranslatef和glRotatef是进行局部坐标变换
glMultMatrixf是进行全局坐标变换
这里牵扯到两个容易迷惑人的问题:
(1)添加的矩阵与原来堆栈顶端的矩阵是左乘还是右乘?
(2)什么是局部坐标?
第一个问题就是变换顺序的问题,如果添加的矩阵与原来堆栈顶端的矩阵是左乘,那么程序顺序和实际变换顺序就是一致的,如果如果添加的矩阵与原来堆栈顶端的矩阵是右乘,那么程序顺序和实际变换顺序就是相反的。经过测试验证,glMultMatrixf添加的矩阵与原来堆栈顶端的矩阵是右乘,程序顺序和实际变换顺序是相反的。glTranslatef和glRotatef添加的矩阵与原来堆栈顶端的矩阵是左乘,程序顺序和实际变换顺序是一致的。
下面是验证过程:
这个是原始点集

下面建立两个变换矩阵m1,m2,m1代表将点集在x轴方向移动0.1,m2代表将点集绕z轴旋转60度
单独应用m1,程序和结果如下


单独应用m2,程序和结果如下


如果先m1后m2,程序和结果如下


如果先m2后m1,程序和结果如下


以上程序和图形显示结果请仔细考虑,看看我说的对不对
第二个问题的答案:局部坐标并不是一个点一个局部坐标,而是所有点共享一个局部坐标,glTranslatef和glRotatef实际上是在对局部坐标进行转换,而不是每个点。
下面是验证过程:
这个是原始点集

下面准备进行两个局部坐标变换,代码如下:

如果单纯进行glTranslatef(0.2,0,0) ,结果如下

如果单纯进行glRotatef(60,0,0,1) ,结果如下

如过先平移再旋转,代码和结果如下(用黑线标出了局部坐标系)


如过先旋转再平移,代码和结果如下(用黑线标出了局部坐标系)


可以看出,局部坐标变换的代码顺序和实际变换顺序是相同的。
&spm=1001.2101.3001.5002&articleId=128758132&d=1&t=3&u=f92a478aa2bd40ecbbc364666cc3c069)
5980

被折叠的 条评论
为什么被折叠?



