我们都知道,OpenGL规定矩阵使用列主序存储,即glLoadMatrix等函数要求输入的数组是按列主序存储的矩阵。然而,一个很奇怪的事实是,OSG中矩阵存储是使用的标准C二维数组(行主序),并且也是直接将行主序存储的矩阵元素作为参数传递给glLoadMatrix调用的。
  另外一个奇怪的事实是,OpenGL规定的对顶点应用矩阵变换使用左乘(即把顶点坐标看做列向量,变换写做M*P),而OSG规定使用右乘(即把顶点坐标看作行向量,变换写做P*M)。
  然而,这两个奇怪的事实绝不是OSG设计上的失误,而是有意为之!
  在了解OSG的这一设计的目的及原理之前,先回忆一下矩阵运算的一些基础知识。
  我们知道,把一个一维向量看做行向量与看做列向量,从几何意义上来讲是没有差别的,但是,对它们进行相同的空间变换(平移、旋转),所需要的变换矩阵却是不同的(它们互为转置)。通常情况下,我们习惯把顶点坐标看待成行向量,即矩阵变换为V*M,因为在此情况下的平移矩阵是我们所习惯看到的,而对于列向量的平移矩阵则是
  然而,由于OpenGL规定对顶点的矩阵变换使用左乘,即顶点坐标被看做列向量。
  为了使引擎的使用者能够面向形如的平移矩阵,OSG做了这样的设计:首先,由于在矩阵变换应用顺序上与OpenGL使用了相反的规定(OSG的右乘对OpenGL的左乘),导致OSG计算得到的矩阵正好是OpenGL需要的矩阵的转置;然后,和在矩阵元素传递上再次使用了与OpenGL相反的规定(OSG的行主序对OpenGL的列主序),由于对同一个一维数组按行主序解析与按列主序解析得到的矩阵正好互为转置,所以OSG传递给OpenGL的矩阵被再一次转置;两次转置相抵消,使得最终OpenGL收到的矩阵正是引擎调用者所理解的矩阵。

  以上对OSG设计动机的解释纯属个人理解,重点在于对其计算逻辑正确性的推理。

  接下来说一下OSG中矩阵运算规则:

    1. 上文已经指出,OSG矩阵变换使用如下公式:V' = V * M  其中,V是变换前的节点坐标,M是变换矩阵,V'是变换后的节点坐标,三者均为世界坐标系下的表示。
    2. 设变换矩阵M由M1、M2两个变换矩阵组合而成,即 M = M1 * M2,则 V'= V * M1 * M2,对应到OSG节点树结构,则是:MT2->MT1->GEODE。
      对于变换几何意义的理解,可以以从左向右(矩阵相乘)/从下向上(节点树结构)的顺序,此时每个变换都是以世界坐标系为参考的;也可以以从右向左/从上向下的顺序理解,此时变换都是以模型坐标系(变换过程中的临时坐标系)为参考的。
    3. 对于平移T、旋转R、缩放S三种变换矩阵的组合,应该按如下顺序:M = S * R * T
    4. 变换矩阵与坐标系的关系,已知变换矩阵,则变换矩阵对应的坐标系的三个坐标轴为

最新文章

  1. 在WPF中使用WinForm控件方法
  2. DAY6 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单
  3. Windows系统使用putty远程连接DigitalOcean创建的Linux系统(CentOS6.7为例)
  4. Thymeleaf学习内容
  5. 剑指Offer:面试题28——字符串的排列(java实现)(待序)
  6. HDU 1394 & ZOJ 1484 Minimum Inversion Number
  7. 1059. Prime Factors (25)
  8. zoj2112
  9. IE中的事件对象
  10. java dbutils查询数据库时无法给部分字段赋值原因
  11. 对于ArrayList中的泛型进行分析
  12. Flink的分布式缓存
  13. Elastic Search 语法总结
  14. 【LeetCode每天一题】Simplify Path(简化路径)
  15. python之requests模块快速上手
  16. java.lang.ClassCastException: com.sun.proxy.$Proxy* cannot be cast to***
  17. Android之sqlite数据库版本升级和降级的处理(onUpgrade和onDowngrade)
  18. Nginx(七):keepalived实现Nginx负载均衡服务器的双机高可用
  19. jQuery实现自动调用和触发某个事件的方法
  20. tp5---树形菜单

热门文章

  1. Thinkphp框架
  2. windows 系统时钟
  3. Python 打包工具cx_freeze 问题记录及解决办法
  4. ajax请求成功后新窗口window.open()被拦截的解决方法
  5. 系统右键自定义功能-右键备份【C#】
  6. 开启JMX功能,使JVisvualVM能够连接JVM
  7. rpm与yum
  8. Mini ORM——PetaPoco笔记
  9. WPF打包32位和64位程序 运行在ghost WIN7上问题
  10. magento目录结构说明,Magento文件夹结构说明,Magento folder structure