OpenGL入门(八)-- OpenGL向量和矩阵简介

在前面,我们对OpenGL中绘图做了简单的介绍,还想继续深入OpenGL的后面的内容,就需要熟悉OpenGL中涉及到的数学知识,因此,本篇文章主要介绍OpenGL中的基本数学。(原博主链接:https://blog.csdn.net/wangdingqiaoit/article/details/51383052

向量的概念

向量是研究2D、3D数学的标准工具。向量V是一个既有大小又有方向的量(联系位移和速度的概念)。在数学上,常用一条有方向的线段来表示向量。例如下图n维空间的向量v=AB→=(v1,v2,...,vn)v=AB→=(v1,v2,...,vn)如下图所示,向量起点为A,终点为B:


image

注意:

  • 向量的大小就是向量的长度(模),向量的长度是非负的;
  • 向量的方向描述了向量的指向;
  • 向量是没有位置的,与点是不同的;
  • 向量与标量不同,变量是只有大小而没有方向的量,例如位移是向量,而距离是标量;

零向量与单位向量

向量的长度即模,定义为:


屏幕快照 2019-05-20 14.04.40.png

模等于0的向量成为0向量,模等于1的向量叫做单位向量。注意零向量的方向是任意的。
由一个向量v求与它同方向的单位向量过程称为标准化(normalization),这个单位向量成为标准化向量(normalized vector)。计算过程为:


屏幕快照 2019-05-20 14.05.28.png

三角形法则和平行四边形法则

两个向量a和b,当将b的起点放在a的终点,连接a的起点和b的终点的向量成为向量a,b之和,记为:c=a+b,如下图所示:


image

物理上力学求和经常使用平行四边形法则,表达的是向量加法运算的结合律,即:a+b=b+a,如下图所示:


image

与一个向量a大小相同,方向相反的向量,称为向量a的负向量,两者相加得到零向量,即:
a+(−a)=0

向量夹角

两个非零向量的夹角规定为不超过π的角度θ,即:0≤θ≤π,如下图所示:


image

注意这个夹角的范围。当θ=π/2称两个向量a与b垂直,当θ=0或者π时,称向量a与b平行。

向量点积

向量点积,也称为向量的数量积,点积的结果是一个标量,其定义为: A.B=|A||B|cosθ,其中θ表示向量A和B之间的夹角。

向量点积的几何意义

要理解点积的几何意义,首先了解概念向量在轴上的投影(scalar projection ),这个投影计算得到一个标量。向量A在B上的投影定义为: AB=|A|cosθ。如下图所示:


image

则可以写为: A.B=|A|BA=|B|AB。
在空间几何中,例如n空间中,向量的坐标表示为: A=(a1,b2,⋯,cn) ,B=(b1,b2,⋯,bn), 则两个向量的点积可以表示为:


屏幕快照 2019-05-20 14.12.41.png

向量点积的应用

向量点积的一个重要应用在于,可以快速求出两个向量的夹角余弦。
两个向量的夹角余弦计算公式为:


屏幕快照 2019-05-20 14.13.55.png

当a和b都是单位向量时,两单位向量的夹角余弦值为:
cosθ=a.b。
因此,我们能很快的计算出两个单位向量的夹角余弦,在计算光照时经常使用。
另外当一个向量为单位向量时:


屏幕快照 2019-05-20 14.16.20.png

向量的叉积

两个向量a和b的叉积,结果是一个向量c=a×b,c的方向垂直于a和b,它需要根据右手规则来确定,c的大小等于:


屏幕快照 2019-05-20 14.17.24.png

叉积如下图所示:


image

注意c的方向需要根据右手规则来确定。所谓右手规则是指,将向量a与b放在同一个起点时,当右手的四个手指从a所指方向转到b所指方向握拳时,大拇指的指向即为a×b的方向。如下图所示:


image

尤其要注意 a×b≠b×a,事实上,a×b=−b×a。在利用以坐标形式表示向量a和b时,在3D空间中,叉积的结果用矩阵表示为:
屏幕快照 2019-05-20 14.19.18.png

叉积的几何意义

叉积的模可以视为以a和b为两边的平行四边形的面积,如下图所示:


image

其中|b|sinθ可以视为平行四边形的高,计算后a×b的模即为平行四边形的面积。

叉积的应用

在OpenGL图形编程中,叉积经常在已知两个方向时,用来确定第三个方向。例如已知相机的朝向dir和侧向量side,则相机的顶部向量为: up=dir×side,后面再介绍相机矩阵时会用到。

投影向量的计算

一个向量a在另一向量b上的投影向量,包括与b平行的部分a1和与b垂直的部分a2。a1即是之前提到的scalar projection,不过这里a1是一个向量。具体过程如下图所示:


image

上图可知与b平行分量a1可计算为:


屏幕快照 2019-05-20 14.22.52.png

垂直分量a2计算为:


屏幕快照 2019-05-20 14.22.12.png

投影向量的应用

投影向量的计算过程,是一个向量分解的过程,这种向量分解的思路在后面推导其他内容时很有帮助,例如求解后面的物体旋转矩阵时会派上用场。

矩阵的概念

矩阵从形式上就是一个数字表,以行和列的形式呈现,简单的矩阵如下图所示:


屏幕快照 2019-05-20 14.23.58.png

矩阵的行数m和列数n可以不相同,m行n列矩阵记为矩阵Am×n。当行数和列数相等时,m= n ,矩阵A也称为n阶方阵。例如下图给出了3x4矩阵A3×4的抽象表示:


屏幕快照 2019-05-20 14.24.09.png

行向量和列向量

对于1xn的矩阵,我们称之为行向量,nx1的矩阵称为列向量。一般可以用列向量表示空间中的向量(以行向量表示也可以),例如上面的向量a=(ax,by,cz)可以用列向量表示为:


屏幕快照 2019-05-20 14.24.20.png

注意:OpenGL编程中习惯用列向量表示点或者向量。矩阵在内存中以列优先存储,但是具体传递参数时,一般函数提供了是否转置的布尔参数来调整存储格式。例如void glUniformMatrix4fv函数提供了布尔变量 GLboolean transpose 来表示是否转置矩阵。

零矩阵和n阶单位阵

mxn矩阵,如果所有元素都为0,则成为零矩阵。 对于一个n阶方阵,如果主对角线元素全为1,其余元素都为0则称为n阶单位阵。对于一个矩阵Am×n,存在单位阵满足:ImA=AIn=A。 任意矩阵Am×n与对应的零矩阵Bn×p相乘得到零矩阵。

矩阵转置

转置操作即是将矩阵的行和列互换,即原矩阵A的第一行变为转置矩阵AT的第一列,原矩阵A的第二行变为转置矩阵AT的第二列,其他部分依次类推。

例如矩阵:
屏幕快照 2019-05-20 14.24.31.png

则其转置矩阵为:


屏幕快照 2019-05-20 14.24.39.png

矩阵的运算

矩阵加减法

两个矩阵A和B要能执行加减法,必须是行和列数目相等的,计算过程,即对应的元素相加(Aij+Bij)或者相减(Aij−Bij),如下图所示:


image

image

标量和矩阵乘法

用一个数k乘以矩阵A,结果为矩阵A中每个元素乘以数k。例如:


image

矩阵和矩阵乘法

两个矩阵Am×n和Bn×p要执行乘法操作,需要满足: 左边矩阵的列数和右边矩阵的行数相等,并且结果矩阵为Cm×p。
计算过程如下图所示:

image

其中
屏幕快照 2019-05-20 15.00.33.png

,即C中第i行第j列的元素,即为矩阵A的第i行和第j的对应元素相乘后的和。例如:
image

注意矩阵乘法不满足交换律,一般而言矩阵乘积AB≠BA(当然存在特殊情况下满足),因此在OpenGL中应用变换矩阵时注意变换应用的顺序。变换的例子后面会介绍。

矩阵和矩阵相乘举例

给定两个矩阵相乘,过程如下图所示:


image

image

image

熟悉了矩阵相乘后,则上述向量的点积公式可以重新表示为:


屏幕快照 2019-05-20 15.04.00.png

则两个向量的点积可以表示为:


屏幕快照 2019-05-20 15.04.35.png

矩阵不满足交换律举例

image

这里AB≠BA,提醒我们注意矩阵相乘时的顺序。

矩阵和向量相乘

矩阵和向量相乘是矩阵和矩阵相乘的特例,给定矩阵A和列向量v,相乘过程如下所示:


屏幕快照 2019-05-20 15.06.03.png

行列式

行列式是n阶方阵的数字构成的数的行列集合,例如2阶方阵A表示为:


屏幕快照 2019-05-20 15.07.40.png

其行列式det(A)表示为:
屏幕快照 2019-05-20 15.07.57.png

3x3矩阵的行列式计算如下:
屏幕快照 2019-05-20 15.08.06.png

关于矩阵行列式计算的更多方法可以参考线性代数教材。

--
总结:OpenGL中向量与矩阵的简要介绍大概就这些了,要想了解全部的内容或者更详细的内容,可以参考一下资料:

  • 《3D数学基础:图形与游戏开发》清华大学出版社
  • 线性代数》武汉大学数学与统计学院 高等教育出版社 齐民友主编
  • 《交互式计算机图形学-基于OpenGL着色器的自动向下方法》电子工业出版社 Edward Angle等著

--
系列连载

OpenGL入门(一)-- 图形API简介与作用
OpenGL入门(二)-- 快速了解OpenGL下的专业名词
OpenGL入门(三)-- OpenGL坐标系解析与坐标变换
OpenGL入门(四)-- OpenGL坐标系与坐标变换
OpenGL入门(五)-- OpenGL渲染流程图解析
OpenGL入门(六)-- OpenGL 固定存储着色器的理解使用
OpenGL入门(七)-- 图形图像渲染中的深度缓冲区
OpenGL入门(八)-- OpenGL向量和矩阵简介
OpenGL入门(九)-- OpenGL 纹理简单介绍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容