liyihongcug 发表于 2020-5-8 15:27:02

OpenGL的列向量和OSG的行向量

本帖最后由 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;
页: [1]
查看完整版本: OpenGL的列向量和OSG的行向量