OpenGL-17-矩阵

一、认识矩阵

  • 假设在空间有⼀个点,使⽤ xyz 描述它的位置。此时让其围绕任意位置旋转⼀定⻆度后,我们需要知道这个点的新的位置,此时需要通过矩阵进⾏计算。
  • 因为新的位置的x 不单纯与原来的x 还和旋转的参数有关,甚⾄于y和z坐标有关。
  • 矩阵只有⼀⾏或者⼀列都是合理的. 只有⼀⾏或者⼀列数字可以称为向量. 也可以称为矩阵。
  • OpenGL中的矩阵,是以列为主的排序。
    在其他编程标准中,许多矩阵库定义⼀个矩阵时,是使⽤⼆维数组。
    在OpenGL的约定⾥,可以使用一维数组和二维数组,但是更多倾向使⽤ ⼀维数组。这样做的原因是: OpenGL 使⽤的是 Column-Major(以列为主)矩阵排序的约定

向量: 请看上一篇文章向量
矩阵:我们来看下百度给的定义:

方阵:⾏数和列数相同的矩阵。例如2 * 2、3 * 3、4 * 4矩阵。

行矩阵、列矩阵:根据不同编程定义不同,是一个优先顺序

单元矩阵:对角线元素都为1,其他元素都为0的矩阵。也可以看做是1。

矩阵在OpenGL中的初始化方法:

//三维矩阵声明
typedef float M3DMatrix33f[9];

//四维矩阵的声明
typedef float M3DMatrix44f[16];

单元矩阵初始化的三种方法:

//单元矩阵初始化⽅式1
GLFloat m[] = {
  1,0,0,0, //X Column
  0,1,0,0, //Y Column
  0,0,1,0, //Z Column
  0,0,0,1 // Translation
}


// 单元矩阵初始化⽅式 2
M3DMatrix44f m = {
  1,0,0,0, //X Column
  0,1,0,0, //Y Column
  0,0,1,0, //Z Column
  0,0,0,1 // Translation
}


//单元矩阵初始化⽅式3
void m3dLoadIdentity44f(M3DMatrix44f m);

⼀个4*4矩阵是如何在3D空间中表示⼀个位置和⽅向的?

  • 如下图。列向量进⾏了特别的标注:矩阵的最后⼀⾏都为0,只有最后⼀个元素为1
  • 如果将⼀个对象所有的顶点向量 乘以这个矩阵,就能让整个对象变换到空间中给定的位置和⽅向


    图片.png

二、矩阵的使用

1、矩阵转置

沿着对角线翻折,使 行矩阵变列矩阵 或者 列矩阵变行矩阵。

2、标量 x 矩阵

3、向量 x 矩阵

  • 向量也可以看做是一个1 * n矩阵,或者n * 1矩阵。同样要满足 前矩阵的列 = 后矩阵的行 才可以相乘。否则没有意义。
  • 比如:1 * 3代表向量 和 3 * 3代表矩阵。向量 * 矩阵 是可以的。矩阵 * 向量是没有意义的。


如此,我们可以得出:

  • ⾏向量左乘矩阵时,结果是⾏向量;
  • 列向量右乘矩阵时,结果是列向量;
  • ⾏向量右乘矩阵时,结果是⽆意义;
  • 列向量左乘矩阵时,结果是⽆意义;
  • 结果向量中的每个元素都是原向量与矩阵中单独⾏或列的点积;
  • 矩阵和向量乘法满⾜对向量加法的分配律,对于向量v、w 和 矩阵M ,
    (v + w)M = vM + wM;

4、矩阵 x 矩阵

  • 前矩阵的列 = 后矩阵的行 才可以相乘
  • 1.在满足相乘法则的情况下,[任意矩阵M]乘以[⽅阵S],不管从哪边乘,都得到与原矩阵⼤⼩相同的矩阵。当然,前提是假定乘法有意义。如果S是单位 矩阵,结果就是原矩阵M,即:MI = IM = M 。 ·
  • 2.矩阵乘法不满⾜交换律,即:AB != BA
  • 3.矩阵乘法满⾜结合律,即:(AB)C = A(BC)。假定ABC的维数使得其乘法有意义,要注意如果(AB)C有意义,那么A(BC)就 ⼀定有意义。
  • 4.矩阵乘法也满⾜与标量或向量的结合律,即:(kA)B = k(AB) = A(kB); (vA)B = v(AB);
  • 5.矩阵积的转置相当于先转置矩阵然后以相反的顺序乘法,即:(AB)T = BT AT

5、OpenGL中的矩阵左乘

线性代数中,矩阵相乘坐标计算是 从左向右的顺序(右乘),如下:
变换后顶点向量 = V_local * M_model * M_view * M_pro (MVP)
变换后顶点向量 = 顶点 x 模型矩阵 x 观察矩阵 x 投影矩阵

图片.png

但是,在OpenGL中是相反的顺序(左乘),如下:
变换顶点向量 = M_pro * M_view * M_model * V_local (PVM)
变换顶点向量 = 投影矩阵 x 视图变换矩阵 x 模型矩阵 x 顶点

图片.png

图片.png
    1. 从栈顶获取栈顶矩阵 复制到 mTemp这个临时变量中
    1. 将栈顶矩阵 mTemp 左乘 mMatrix
    1. 将结果放回栈顶空间⾥

我们代码段中矩阵的先手顺序:


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