美文网首页
OpenGL 中的向量与矩阵

OpenGL 中的向量与矩阵

作者: 远方竹叶 | 来源:发表于2020-07-16 13:53 被阅读0次

    向量

    在 3D 笛卡尔坐标系,一个顶点,就是 XYZ 坐标空间上的一个位置。而这个位置是由一个唯一的 XYZ 定义的,而这样的 XYZ 就是向量。

    • 标量:只有大小,没有方向。
    • 矢量:既有大小,又有方向(有方向的标量)

    向量的模计算公式:

    单位向量

    (1,0,0), (0,1,0), (0,0,1),分别称为 X 轴,Y 轴,Z 轴上的单位向量。

    如果一个向量不是单位向量,而我们把它缩放到 1,这个过程叫做标准化。(x, y, z),x,y,z不全为0,它的标准化计算:

    向量点乘

    对于向量 A = (x1, y1, z1) ,向量 B = (x2, y2, z2), 则向量A点乘向量 B:

    A·B = x1 * x2 + y1 * y2 + z1 * z2
    

    同时有

    A·B = |A||B|Cosθ
    

    以上可见,向量的点乘结果为一个标量,即一个数值。向量点乘符合乘法交换律,即:A·B = B·A。

    OpenGL 对于点乘相应的 API:
    //1.m3dDotProduct3 函数获得2个向量之间的点乘结果;
    float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
    
    //2.m3dGetAngleBetweenVector3 即可获取2个向量之间夹角的弧度值; 
    float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);
    

    向量叉乘

    • 向量 A 叉乘 B 的结果为一个新的向量C;
    • 且向量 C 的长度:|C| = |A||B|Sinθ;
    • 向量 C 的方向垂直于向量 A 且垂直于向量 B,即垂直于 A,B 形成的平面。
    A x B = C
    
    OpenGL 对于叉乘相应的 API:
    //1.m3dCrossProduct3 函数获得2个向量量之间的叉乘结果得到一个新的向量
    void m3dCrossProduct3(M3DVector3f result,const M3DVector3f  u ,const M3DVector3f v);
    

    OpenGL 中的向量

    有两个数据类型:

    • M3DVector3f 表示一个三维向量(x, y, z)
    • M3DVector4f 表示一个四维向量(x, y, z, w)

    代码示例:

    //三维向量
    M3DVector3f[3] vVertex = {0, 0, 1};
    
    //四维向量
    M3DVector4f vVertex = {0,0,1,1};
    
    //声明一个三分量顶点数组,例如⽣成一个三⻆形
    M3DVector3f vVerts[] = {
                                            -0.5f,0.0f,0.0f, 
                                            0.5f,0.0f,0.0f, 
                                            0.0f,0.5f,0.0f
    };
    

    矩阵(Matrix)

    矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合。

    分类

    • 行优先矩阵:逐行读取
    • 列优先矩阵:逐列读取
    • 行优先矩阵经过转置可得到列优先矩阵

    例如:一个3x4 的数组:

    通过行优先机制的编译器,意思为优先保留第1行的所有元素

    通过列优先机制的编译器,意思为优先保留第1列的所有元素

    单元矩阵

    • 主对角线上数据都是1,其余元素都是0
    • 向量 X 单元矩阵 = 向量,不会发生任何变化

    矩阵的点乘

    • 两个矩阵的行数和列数必须相等才能进行点乘
    • 两个矩阵相乘,结果为两个矩阵对应元素相乘组成的矩阵,即

    矩阵的叉乘

    • 两个矩阵叉乘必须满足第一个矩阵的列数与第二个矩阵的行数相等
    • 矩阵叉乘不满足交换律

    OpenGL 中的矩阵

    在其他编程标准中, 许多矩阵库定义一个矩阵时,使⽤二维数组;OpenGL 的约定里,更多倾向使⽤一维数组;这样做的原因是: OpenGL 使用的是 Column-Major(以列列为主)矩阵排序的约定。

    OpenGL 中的 4x4 的矩阵,每一列都是由4个元素组成的向量,第一列表示x轴方向,第二列表示y轴方向,第三列表示z轴方向,第四列表示交换位置

    一个4*4矩阵是如何在3D空间中表示一个位置和方向的,列向量进行了特别的标注:矩阵的最后一⾏都为0,只有最后一个元素为1。

    初始化一个单元矩阵
    1. 通过GLFloat定义一个一维数组
    GLfloat vMatrix[] = {
            1, 0, 0, 0, // X Column
            0, 1, 0, 0, //Y Column
            0, 0, 1, 0, //Z Column
            0, 0, 0, 1 //Translation
        };
    
    1. 通过 M3DMatrix44f 创建
    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
        };
    
    1. 通过 m3dLoadIdentity44f 创建
    void m3dLoadIdentity44f(M3DMatrix44f m);
    
    矩阵变换
    1. 数学角度

    数学中为了方便计算,都是以行矩阵为标准,从左到右的顺序进行计算,所以在数学中,顶点将以行向量的方式表示

    变换后顶点向量 = V_local * M_model * M_view * M_pro
    变换后顶点向量量 = 顶点 ✖ 模型矩阵 ✖ 观察矩阵 ✖ 投影矩阵

    1. OpenGL 的维度

    变换顶点向量量 = M_pro * M_view * M_model * V_local
    变换顶点向量量 = 投影矩阵 ✖ 视图变换矩阵 ✖ 模型矩阵 ✖ 顶点

    相关文章

      网友评论

          本文标题:OpenGL 中的向量与矩阵

          本文链接:https://www.haomeiwen.com/subject/srhphktx.html