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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法与Python学习

Python:numpy的总结(1)

1、multiply 例子: x1=[1,2,3];x2=[4,5,6] print multiply(x1,x2) 输出: [ 4 10 18] multi...

37240
来自专栏ATYUN订阅号

重新调整Keras中长短期记忆网络的输入数据

你可能很难理解如何为LSTM模型的输入准备序列数据。你可能经常会对如何定义LSTM模型的输入层感到困惑。也可能对如何将数字的1D或2D矩阵序列数据转换为LSTM...

26140
来自专栏文武兼修ing——机器学习与IC设计

mxnet RNN简单剖析官方github教程部分代码

import mxnet as mx 官方github教程部分代码 网络生成 num_layers = 2 num_hidden = 256 stack = m...

39670
来自专栏生信小驿站

机器学习识别乳腺癌

人工神经网络是一种类似于大脑神经突触连接的结构进行信息处理的数学模型,由大量的输入层节点、隐藏层节点和输出层节点连接构成。有关神经网络算法最核心的三个问题就是:...

12620
来自专栏刘明的小酒馆

图片相似检测:三行代码实现

检查两个图片的相似度,一个简单而快速的算法:感知哈希算法(Perceptual Hash),通过某种提取特征的方式为每个图片计算一个指纹(哈希),这样对比两个图...

63550
来自专栏Python小屋

Python使用空域融合技术进行图像去噪

本文要点在于Python内置函数和扩展库pillow的用法。图像空域融合的主要思路是:把所有含有随机噪点的临时图像中对应位置像素值的平均值作为最终像素值,生成结...

46580
来自专栏Spark学习技巧

基于Spark Mllib的文本分类

基于Spark Mllib的文本分类 文本分类是一个典型的机器学习问题,其主要目标是通过对已有语料库文本数据训练得到分类模型,进而对新文本进行类别标签的预测。这...

26480
来自专栏深度学习那些事儿

风格迁移中直方图匹配(Histogram Match)的作用-附pytorch直方图匹配代码

风格迁移是神经网络深度学习中比较重要且有趣的一个项目。如果不知道什么是风格迁移的请参考这篇文章:https://oldpan.me/archives/pytor...

1.4K50
来自专栏机器学习算法与理论

Tensorflow 实战笔记

tf.Variable(tf.random_normal([2,3],stddev=2)) 通过满足正态分布的随机数来初始化神经网络中的参数是一个常用方法。

11820
来自专栏海天一树

决策树

决策树是一种特殊的树形结构,一般由节点和有向边组成。其中,节点表示特征、属性或者一个类。而有向边包含有判断条件。如图所示,决策树从根节点开始延伸,经过不同的判断...

31520

扫码关注云+社区

领取腾讯云代金券