OpenGL中模型变换的顺序(验证)

在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) ,结果如下

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

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

可以看出,局部坐标变换的代码顺序和实际变换顺序是相同的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值