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

OpenGL中的向量和矩阵

作者: iOSer_jia | 来源:发表于2020-07-17 11:45 被阅读0次

    OpenGL坐标变化时经常用到矩阵来计算变化后点的位置,为了更好的理解3D数学在OpenGL中的作用,本文将简单地介绍一些概念。

    向量

    在3D笛卡尔坐标系中,一个坐标为(x, y, z)的顶点就是坐标系中的位置,坐标系每个位置都有一个唯一的坐标与之对应,一个xyz坐标我们可以认为他是一个有几何意义(在坐标轴中的位置),有模(到原点的的距离)的一个向量。
    向量的模计算公式为:
    m = \sqrt{ x^2 + y^2 + z^2 }

    这个公式可以通过勾股定理求的

    单位化向量

    我们将模为1的向量(即m=1)成为单位向量,将一个向量缩放至模为1,这个过程称为标准化向量,也称为单位化向量

    由以上公式可以推导出单位化向量的公式为:
    (\dfrac{x}{m}, \dfrac{y}{m}, \dfrac{z}{m})

    m 为向量的模

    向量点乘

    点乘也叫数量积,它的结果代表意义是一个向量在另一个向量方向上的投影,是一个标量。


    点乘.png

    公式为:
    A·B = |A||B|cosθ

    如果向量A和向量B均为单位向量,那么A·B = cosθ,所以,两个单位向量的点乘结果是它们之间的夹角值的余弦值,范围为[-1, 1]。

    OpenGL中可以用 float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v); 函数获得两个向量的点乘结果,也可以用 float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v); 得到两个向量之间夹角的弧度值

    向量叉乘

    点乘也叫向量积,它的结果代表的几何意义是一个和两个向量都垂直的向量,向量的模长是两个向量组成的平行形的面积。

    叉乘.png
    它的公式为:

    OpenGL中可以用void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);得到两个的叉乘结果。

    矩阵

    矩阵在数学中的定义是一个按照长方阵列排列的复数或实数集合,在OpenGL中我们经常用来计算物体位置或旋转后的位置。
    OpenGL中经常使用以为数组表示一个矩阵(因为OpenGL是使用以列为主的矩阵排序的),

    行优先和列优先

    如下图,一个矩阵按照从左往右排序的称为行优先矩阵排序,从上往下的称为列优先矩阵排序。

    行优先和列优先

    矩阵的叉乘

    矩阵的相乘是有规则,一个m*n矩阵只能和n*x的矩阵相乘,得到的结果是一个m*x的矩阵,从这里也可以看出矩阵相乘不满足交换律。

    矩阵变换顶点的奥秘

    一个4*4的矩阵,可以表示三维空间中x,y,z,w要变化的位置和方向。


    4*4矩阵.png

    列向量进行了特别标注:矩阵的最后一行都为0,只有最后一个元素为1

    OpenGL一个4*4的矩阵中,每一列都表示一个向量,如果将一个物体的所有顶点乘以一个这个矩阵,从叉乘的性质可以知道每个顶点表示的向量将会得到一个新的向量,从而变化到另一个给定的位置和方向。

    矩阵的使用

    平移

    void m3dTranslationMatrix44(M3DMatrix44f m, floata x, float y, float z);
    

    旋转

    M3DMatrix44f m3dRotationMatrix44(m3dDegToRad(45.0), floata x, float y, float z);
    

    缩放

    void m3dScaleMatrix44(M3DMatrix44f m, floata xScale, float yScale, float zScale);
    

    综合变化

    void m3dMatrixMultiply44(M3DMatrix44f product, const M3DMatrix44f a, const M3DMatrix44f b);
    

    更多关于OpenGL中的矩阵和矩阵堆栈可以参考OpenGL的常见矩阵和变化

    相关文章

      网友评论

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

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