|
发现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 编辑 ] |
|