查看: 1004|回复: 0

OpenGL的列向量和OSG的行向量

[复制链接]
  • TA的每日心情
    开心
    2020-3-20 17:50
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2020-5-8 15:27:02 | 显示全部楼层 |阅读模式
    本帖最后由 liyihongcug 于 2020-5-8 16:36 编辑

    OpenGL中使用的是列向量,在OSG中使用的是行向量 ,由于行向量和列向量的不同导致在矩阵作乘法的时候有左乘和右乘之分.
    1.  行向量和列向量的定义如下:
    在线性代数中,行向量是一个 1×n的矩阵, 即矩阵由一个含有n个元素的行所组成。
    在线性代数中,列向量是一个 n×1 的矩阵,即矩阵由一个含有n个元素的列所组成。
    2. 左乘和右乘
    说简单点,左乘(又称前乘)就是乘在左边(即乘号前),右乘(又称后乘)就是乘在右边(即乘号后)。比如说,A左乘E即AE,A右乘E即EA。
    .行向量和列向量的变换
    由于向量实际上是某一维度为1的矩阵,那么根据矩阵乘法的规则,会出现下面的情况:

    (1)行向量左乘矩阵

    在图形学中一般矩阵都是4x4的,行向量一般设置为1x4的矩阵(齐次坐标)。当行向量左乘矩阵的时候 (1x4)* (4x4)得到的是一个1x4的行向量

    (2)行向量右乘矩阵

    这种情况,也就是(4x4)*(1x4),根据矩阵相乘的规则,这是不允许的

    (3)列向量左乘矩阵

    这种情况,也就是(4x1)*(4x4),根据矩阵相乘规则,这也是不允许的

    (4)列向量右乘矩阵

    这种情况,也就是(4x4)*(4x1),得到的是一个4x1的行向量


    我们作三维的变化为的就是将一个坐标变换到另一个坐标,于是上面讨论的(1)(4)两种方式正好符合这一要求。根据上面的讨论有以下的结论:

    行向量左乘还是右乘根本就是矩阵乘法规则的限制,行向量只能左乘而列向量只能右乘矩阵,这和三维图形学没有一点儿的关系。因此有人说OpenGL都是右乘、OSG都是左乘从结论上来说是对的,但是这和OpenGL以及OSG本身并没有半点关系,这只是矩阵乘法的定义。

    行向量列向量以及在编程语言中的内存布局
    假设有一个4x4的矩阵M,我们现在有一个顶点的坐标是v,通过M矩阵的变换可以把它变为v’,现在分别假设 v是行向量或者v是列向量,于是有以下两种情形:

    (1)v是行向量 , 那么  v' = v*M  

    (2)v是列向量,  那么  v' = M*v
    顶点在观察体里面的坐标 = <投影矩阵> * <视图矩阵> * <模型变换矩阵> * 世界坐标中的顶点坐标 。
    OpenGL 使用列主序矩阵,即列矩阵,因此我们总是倒过来算的(左乘矩阵,变换效果是按从右向左的顺序进行): 投影矩阵 × 视图矩阵 × 模型矩阵 × 3D位置。
    gl_Position = projectionMatrix * modelViewMatrix * Position; (osg)

    gl_Position = position * modelMatrix * viewMatrix * projectionMatrix;
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    OSG中国官方论坛-有您OSG在中国才更好

    网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

    联系我们

    • 工作时间:09:00--18:00
    • 反馈邮箱:1315785073@qq.com
    快速回复 返回顶部 返回列表