/*
从前学线代的时候没认真,现在回过头再看看吧。
学习书籍的名字:OpenGL图形开发快速入门。机械工业出版社,杨柏林编写。
*/
一.OpenGL全称为:OpenGraphics Library,开放式图形库,为开发人员提供了图形硬件接口,是一个底层的3d图形函数库,跨平台,兼容主流操作系统。
一.数学相关
a) 点
i. 就是传统的横轴x、纵轴y的坐标系,(x,y),
ii. 两点坐标公式P1P2 = 根号下(两点x之差的平方+两点y之差的平方),3d场景同样适用,加个y。
·
iii. OpenGL采用右手坐标系。
在空间直角坐标系中,让右手拇指指向x轴的正方向,食指指向y轴的正方向,如果中指能指向z轴的正方向,则称这个坐标系为右手直角坐标系.
b) 向量
1. 向量的大小
向量既有方向又有大小,。我们计算向量的大小就是求响亮的长度或者模。我们可以吧向量n的长度记做: |N|。在3d空间该数值的计算如下:
|N| = 根号下(三个N的x、y、z三个方向分量的平方和)
2. 向量的归一化
有很多向量,我们只关心他的方向而不关心大小,比如求某个平面的法线方向,这种情况下,使用单位向量就很方便。单位向量就是大小为1的向量,我们称其为标准化向量。
求一个向量的单位向量的过程,叫做向量的归一化,运算法则:(图)
V= V/|V|
3. 向量的加法和减法
可以向对标量一样,对向量进行数学运算。但是要求是参与运算的向量维度都是一样的,即都是一维、二位、或者三维等。向量加法就是将两个向量的各自分量相加就可以了,比如向量A+向量B,得到向量C:
(Ax+Bx,Ay+By,Az+Bz)
两个向量相减也是一样,直接分量相减:
(Ax-Bx,Ay-By,Az-Bz)
4 . 向量与标量的乘法运算
虽然向量和标量不能加减,但是可以相乘,结果得到一个向量,他与原向量平行,长度不同或者方向相反。例如,用标量2乘以一个向量,结果为一个向量,其方向与向量N的方向一致,其长度变为原来的2倍。相似的用-1乘以一个向量,得到的结果向量大小和原向量相等,方向相反。
5. 点乘运算
向量和向量相乘有两种不同的类型,在这里我们首先介绍: 点乘(也叫作内积).
术语点乘来自于:a·b 中的点,标量乘法可以省略点号,但是向量乘法运算不可以省略。
向量点乘就是对应分量乘积的和,结果是一个标量,比如在2d和3d中的运算公式为:
A·B = AxBx + AyBy
A·B = AxBx + AyBy + AzBz
一般来说,点乘的结果描述了两个向量的“相似程度”,结果越大两个向量越相近。点乘等于向量大小与向量夹角的余弦值的积:
A·B = |A| |B| cosα(应该是希特)
由上面两个可知,两个向量之间的夹角:
cosα = A·B / |A| |B|
这就明显简化了性质:
A·B =0,说明A和B之间的夹角为90度
A·B> 0,说明A和B之间的夹角小于90度
A·B< 0,说明A和B之间的夹角大于90度
6. 叉乘运算
另一种向量乘法乘坐叉乘或叉积。叉乘仅可用于3D场景,和点乘不一样的是,叉乘得到的是一个向量。AxB = -(BxA),任意两个3d向量都可以确定一个平面。
AxB的另一个公式:
AxB=(AyBz-AzBy,AzBx-AxBz,AxBy-Ay,Bx)
c) 矩阵
矩阵是3d数学的重要基础,在这里讨论矩阵的性质和运算。
我们用m x n定义一个矩阵,他表示该矩阵m行n列。
两种特殊矩阵:
1. 方阵和对角矩阵
§ 行数和列数相同的矩阵称作方阵
§ 除了左上角到右下角都是0的,称这种矩阵为对角矩阵。例如
【
1 0 0
0 -3 0
0 0 2】
2. 单位矩阵:
单位矩阵是一种特殊的对角矩阵。他是nxn的矩阵,对角元素为1。
{
1 0 0
0 1 0
0 0 1
}
如果用一个矩阵和单位矩阵相乘,结果还是原来的矩阵。
3. 矩阵的加法和减法:
前提是:确定参加运算的矩阵具有相同的阶数,否则运算无法进行。
然后,将对应位置上的的元素进行相加减,其结果作为结果矩阵在该位置上的值。
4. 矩阵的乘法运算分为三种:
标量和矩阵相乘
标量k 和矩阵M相乘,其结果是一个和M维数相同的矩阵,其元素值为k乘以M中的每一个元素。公式如下:
实例:
§ 向量和矩阵相乘
向量可以看作是一行或者是一列矩阵,因此向量可以和矩阵相乘。在这里只有两种情况是允许的,即行向量左乘矩阵时,结果是行向量;列向量右乘矩阵时,结果是列向量。其中行向量的列数要和矩阵的行数相等,列向量的行数要和矩阵的列数相等。
§ 矩阵和矩阵相乘
比如乘法AB
一、1)用A的第1行各个数与B的第1列各个数对应相乘后加起来,就是乘法结果中第1行第1列的数;
2)用A的第1行各个数与B的第2列各个数对应相乘后加起来,就是乘法结果中第1行第2列的数;
3)用A的第1行各个数与B的第3列各个数对应相乘后加起来,就是乘法结果中第1行第3列的数;
依次进行,
(直到)用A的第1行各个数与B的第末列各个数对应相乘后加起来,就是乘法结果中第1行第末列的的数,
二、1)用A的第2行各个数与B的第1列各个数对应相乘后加起来,就是乘法结果中第2行第1列的数;
2)用A的第2行各个数与B的第2列各个数对应相乘后加起来,就是乘法结果中第2行第2列的数;
3)用A的第2行各个数与B的第3列各个数对应相乘后加起来,就是乘法结果中第2行第3列的数;
依次进行,
(直到)用A的第2行各个数与B的第末列各个数对应相乘后加起来,就是乘法结果中第2行第末列的的数,
依次进行,
三、1)用A的第末行各个数与B的第1列各个数对应相乘后加起来,就是乘法结果中第末行第1列的数;
2)用A的第末行各个数与B的第2列各个数对应相乘后加起来,就是乘法结果中第末行第2列的数;
3)用A的第末行各个数与B的第3列各个数对应相乘后加起来,就是乘法结果中第末行第3列的数;
依次进行,
(直到)用A的第末行各个数与B的第末列各个数对应相乘后加起来,就是乘法结果中第末行第末列的的数.