查看: 5985|回复: 4

关于OSG/OPENGL矩阵变换和矩阵存储的思考和疑问

[复制链接]

该用户从未签到

发表于 2009-4-2 11:19:09 | 显示全部楼层 |阅读模式
发现OSG对矩阵的存储和矩阵变换的使用方式与OpenGL的用法有些不一致:

1. 在OpenGL中使用glMultMatrix/glLoadMatrix 设置矩阵时,参数矩阵需要是列主序存储的;而OSG中的矩阵(Matrixd)却是按行主序存储的(仍然使用glMultMatrix/glLoadMatrix 设置矩阵),二者互为转置。

2. 红宝书中讲到,OpenGL中对顶点坐标应用矩阵变换,应该是左乘矩阵(v' = M × v );然而,我在OSG中计算顶点坐标投影的视口坐标的时候,却需要使用右乘才能得到正确的结果,计算裁剪坐标的代码如下:
        osg::Matrix matMVP = view->getCamera()->getViewMatrix() * view->getCamera()->getProjectionMatrix();
        v = matMVP.preMult(v);          // 右乘矩阵
即 OpenGL中的矩阵变换为:矩阵×列向量
     OSG中的矩阵变换为:行向量×矩阵
如果对于同一个向量v(x,y,z,w)(可以作为行向量也可以作为列向量),应用同一个矩阵变换M,使用左乘和使用右乘得到的结果显然是不同的;

单独考虑以上的两点,似乎都是不可理解的
但是考虑以下情况的结果:
             [x,y,z,w]×[m0,m1,m2...m15](行主序)  与  [m0,m1,m2...m15](列主序)×[x,y,z,w]
          (或者写作:  v×M  与  MT×v  (MT为M的转置))
二者的结果是相同的(虽然得到的一个是行向量,一个是列向量),这似乎能够为解释以上两点差异提供一些支持

以上内容是我学习OSG/OPENGL矩阵变换是的一点理解,似乎是收获了一些东西,但又没有能够穿起来的感觉
希望哪位能够不吝给我点点播,也欢迎大家加入讨论,共同学习共同进步

[ 本帖最后由 indif 于 2009-4-2 11:29 编辑 ]

该用户从未签到

发表于 2009-4-2 12:40:53 | 显示全部楼层
OSG使用行主序(row-major)的矩阵格式,DirectX也是行主序,而OpenGL“号称”是列主序的形式——真的是这样吗?看了下面的链接之后也许您会有更多收获,真正无法让人理解的说不定其实是OpenGL:
http://www.openscenegraph.org/pr ... trixTransformations

因此,OSG中进行顶点变换需要使用:
V' = V * M;
的格式,即行向量乘以矩阵。
但事实上,M*V也是有效的,其结果为矩阵乘以列向量,但是由于变换矩阵为行主序,因此对于顶点变换来说这一计算也许没有意义。这的确让人有些迷惑,大多数时候我们不要使用后者就是。

该用户从未签到

 楼主| 发表于 2009-4-2 14:18:17 | 显示全部楼层
多谢array提供的链接

OpenGL本身并没有问题,这只是一种选择吧,如果仅仅像Robert 说的,OSG使用行主序的矩阵只是为了方便使用C数组存储,那么使用glLoadTransposeMatrix/glMultTranspseMatrix设置矩阵就可以了,矩阵运算还是可以采用与OpenGL一致的左乘嘛! 或许这种选择还有为了与D3D的用法保持一致的原因吧 (D3D提供的也是用C数组存储的行主序矩阵,矩阵运算采用右乘)。

按照Robert的说法,M*V的用途在于,如对法线向量应用矩阵变换时,需要给向量右乘模型视图矩阵的逆转置,这时只需计算向量左乘模型视图矩阵的逆就可以了,结果一样。

该用户从未签到

发表于 2009-4-2 15:06:53 | 显示全部楼层
正是由于OpenGL的一些概念混乱(参看那个链接中Don Burns的说法,他才是OSG的鼻祖),OSG才会强调“行主序”的概念,不可以仅仅为了和谁谁统一而设计出混淆不清的代码来。这一点我个人支持OSG的做法

该用户从未签到

发表于 2011-2-19 09:29:30 | 显示全部楼层
确实是,只要是转换一下矩阵就可以理解了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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