本人3D编程方面超级菜鸟,因为项目需要,接触了一些Open Scene Graph(OSG)引擎的相关编程工作。首先我得承认,OSG这个引擎超级牛,无论是渲染效果和效率,都没的说,很棒。但是,OSG提供的Android example真是不敢恭维,里面的代码逻辑有很多冗余+bug(至少在我的三款测试机上都表现如此)。

闲话少说,为了不让别人再入坑&做个记录日后方便查阅,说一下osgAndroidExampleGLES1这个工程的坑。Java层代码没什么好说的,直接说Jni下面的C++代码。

Problem 1

一个example涉及的操作过多,而且都交织在一起,没什么注释。对于初学者,真心各种看不明白。在此做一下简单的介绍,OsgAndroidNotifyHandler这个类和android的log类一个功能,就是在logcat里打印一些信息。其实OsgAndroidNotifyHandler.cpp这个文件的内容就是利用OsgAndroidNotifyHandler对 __android_log_write函数做了简单封装。osgNativeLib.cpp这个文件包含了所有的接口函数,搞过ndk开发的人应该很容易看懂。整个jni文件夹下面的精华都在OsgMainApp这个类中,其中_viewer是用来设置投影矩阵之类的,相当于摄像头,将模型通过一系列矩阵变换最终投影到设备屏幕上(手机上就是手机的GLSurfaceView)。_root是所有模型的根节点,需要显示的模型都将添加进_root或_root的子节点中。_state用来设置一些OpenGL ES选项,比如是否打开灯光什么的。_manipulator是用来控制camera,就是控制摄像头的轨迹,用于展示包含模型的场景用的。

Problem 2

example里面添加的是鼠标响应事件,和android的触屏事件对应的很不好,我这边的效果是,轻轻一碰屏幕,模型就不知道飞哪里去了,响应太敏感了。如果是初学OSG+Android,建议把OsgMainApp.cpp中101到104行及相关代码注释掉。这样就不怕一摸屏幕就看不到模型了。如果需要模型能响应触屏,我觉得还是自己写触屏事件,然后根据相应参数添加变换矩阵来控制模型姿态比较好。

Problem 3

代码中的载入模型、清除模型等函数的逻辑有问题,会导致example的不正常显示。至少在我这边的测试中,如果载入了一个模型,但是不在退出程序之前clean,下次再打开应用,载入模型之后就会什么都不显示。这是因为应用退出之后,有些情况下Android系统没有完全kill掉它,再打开进入的时候,由于example中奇葩的、眼花缭乱的各种暂存model的vector设计,导致逻辑有误,无法正确显示。更奇怪的是,这个example在调用_viewer->frame()函数去显示每一帧的之前,都要重新载入一遍所有模型,这个操作显然是没有必要的。针对以上问题,改起来幅度比较大,建议直接把loadObject函数中的代码都删除,改为直接加载模型并添加到_root节点。

总之,OSG这个android example真是很难搞,想自己开发的话,最好大部分都不要参考这个工程里的代码并且要大概学学OSG的基础知识。

最新文章

  1. [Unity3D]自制UnityForAndroid二维码扫描插件
  2. SQL Server中一个隐性的IO性能杀手-Forwarded record
  3. 将服务器上的某些特定日志统一保存至XPS文件
  4. stm32 dac 配置过程
  5. POJ-2481 Cows (线段树单点更新)
  6. 立体匹配:关于Middlebury提供的源码的简化后的结构
  7. Sublime Text 前端插件推荐
  8. 设计模式之:组合模式(Composite)
  9. BestCoder Round #50 (div.1) 1001 Distribution money (HDU OJ 5364)
  10. hdu 4007 Dave (2011年大连ACM网络赛)
  11. Selenium WebDriver多层表单切换
  12. 并发编程(一):从头到脚解读synchronized
  13. trait与policy模板技术
  14. ASP.NET Core学习之一 入门简介
  15. centos下网络的配置
  16. 伪分布式hadoop1.1.2和hbase0.94.11配置
  17. servlet、servlet容器和web应用程序的关系
  18. thymeleaf 解析html时,出现 SAXParseException: The content of elements must consist of well-formed characte
  19. JS中自定义replace可替换特殊符号$等,但无法忽略大小写的函数
  20. 【源码编译】spark源码编译

热门文章

  1. java中定义enum示例
  2. C#学习笔记(25)——用刻盘器批量从U盘删除添加文件
  3. 【Unity Shader】六、使用法线贴图(Normal Map)的Shader
  4. Bitcoin A First Assessment
  5. shell常用命令大全
  6. #pragma alloc_text
  7. Linq to Sql 动态条件另类实现方法
  8. 15.5.26-linq to ef多级外链查询
  9. [数据结构]最小生成树算法Prim和Kruskal算法
  10. map-reduce 优化