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

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

        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();

知识准备:

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的变换是以当前位置来变换的,也就是说用的是相对坐标而不是绝对坐标。

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确定。



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGl坐标变换是指将一个坐标系中的点转换到另一个坐标系中的点的过程。在OpenGL中,常见的坐标系包括模型坐标系、世界坐标系、视坐标系和裁剪坐标系。坐标变换可以通过矩阵变换来实现,OpenGL提供了一些函数来进行矩阵变换,例如glTranslate、glRotate和glScale等函数。 下面是一个简单的例子,演示了如何使用OpenGL进行坐标变换: ```python import glfw from OpenGL.GL import * from OpenGL.GLU import * def main(): # 初始化glfw if not glfw.init(): return # 创建窗口 window = glfw.create_window(640, 480, "OpenGL Window", None, None) if not window: glfw.terminate() return # 设置窗口为当前上下文 glfw.make_context_current(window) # 设置视口 glViewport(0, 0, 640, 480) # 设置投影矩阵 glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(45, 640/480, 0.1, 100) # 设置模型视图矩阵 glMatrixMode(GL_MODELVIEW) glLoadIdentity() # 绘制三角形 glBegin(GL_TRIANGLES) glVertex3f(-1, -1, -5) glVertex3f(1, -1, -5) glVertex3f(0, 1, -5) glEnd() # 平移变换 glTranslatef(0, 0, -5) # 旋转变换 glRotatef(45, 0, 1, 0) # 缩放变换 glScalef(2, 2, 2) # 绘制三角形 glBegin(GL_TRIANGLES) glVertex3f(-1, -1, 0) glVertex3f(1, -1, 0) glVertex3f(0, 1, 0) glEnd() # 交换缓冲区 glfw.swap_buffers(window) # 循环渲染,直到窗口关闭 while not glfw.window_should_close(window): glfw.poll_events() # 终止glfw glfw.terminate() if __name__ == '__main__': main() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值