前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >glLoadIdentity()与glTranslatef()和glRotatef()--坐标变换

glLoadIdentity()与glTranslatef()和glRotatef()--坐标变换

作者头像
望天
发布2018-08-02 11:48:21
1.4K0
发布2018-08-02 11:48:21
举报
文章被收录于专栏:along的开发之旅along的开发之旅

初学OpenGL,对它的矩阵变换不甚了解,尤其是glTranslatef和glRotatef联合使用,立即迷得不知道东西南北。在代码中改变数据多次,终于得到了相关变换概念。

代码语言:javascript
复制
        glLoadIdentity();						// 重置当前的模型观察矩阵	
	glTranslatef(2.5f,0.0f,-20.0f);
	glRotatef(rtri,1.0f,0.0f,0.0f);
	glTranslatef(0.0f,1.0f,0.0f);
	glBegin(GL_TRIANGLES);		
	glColor3f(1.0f,1.0f,0.0f);	// 绘制三角形
	glVertex3f( 0.0f, 1.0f, 0.0f);					// 上顶点
	glColor3f(1.0f,0.0f,1.0f);	
	glVertex3f(-1.0f,-1.0f, 0.0f);					// 左下
	glColor3f(1.0f,0.5f,0.5f);	
	glVertex3f( 1.0f,-1.0f, 0.0f);					// 右下
	glEnd();
代码语言:javascript
复制

知识准备:

OpenGL中的矩阵采用列优先存储,矩阵表示如下

假设有点(3,3,3),如果把该点沿x轴移动2单位,沿y轴移动3单位,沿z轴移动4单位,那么该点会是(3+2, 3+3, 4+4) = (5,6,7). 用矩阵表示是: 

 ,左边的矩阵称为平移变换矩阵,若把2、3、4换成x、y、z,则用它乘以一个齐次坐标表示的向量,就可以将该向量平移(x,y,z). 旋转变换和缩放变换都像平移变换一样可用一个矩阵来表示。这里可以不用理会这些矩阵长什么样,只需清楚它们乘以一个齐次坐标表示的向量,就可以使该向量发生需要的变换。

 把平移变换矩阵记为T(x,y,z),旋转变换矩阵记为R(s,x,y,z),表示绕向量(x,y,z)旋转s角度;把向量记为X。现在要把一个点X,如(3,3,3,1),移动(2,2,2)单位,再绕y轴旋转30度角,用矩阵表示即R(0,1,0,30)*T(2,2,2)*X,可以理解为离X最近的矩阵最先作用。理解这个顺序很重要,这样,所有变换都可以用一串矩阵的相乘来表示。

代码解释:

代码中glBegin到glEnd是绘制三角形。首先对三角形起作用的是旋转,然后是移动。明确了作用顺序后,还有一个让人困惑的就是坐标轴是否改变。因为glTranslatef的变换是以当前位置来变换的,也就是说用的是相对坐标而不是绝对坐标。

代码语言:javascript
复制
glLoadIdentity();         
glTranslatef(-1.5f,0.0f,-6.0f);
glTranslatef(-1.5f,0.0f,-6.0f);

当glLoadIdentity之后,坐标轴回到OpenGL窗口的中心,通过两次glTranslatef(-1.5f,0.0f,-6.0f),坐标轴到了(-3.0f,0.0f,-12.0f);

所以三角形首先按向量(0.0f,1.0f,0.0f)移动,然后绕X轴旋转,然后再按向量(-2.5f,0.0f,-10.0f)移动,最终得到的就是把一个如下描述的图形:

这个图形在旋转,可以看出是绕X轴旋转的三角形,而所在的位置有两次glTranslatef确定。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013年04月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 知识准备:
  • 代码解释:
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档