OSG 坑爹的Android example
本人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的基础知识。
OSG 坑爹的Android example的更多相关文章
- 坑爹的Android Ble 问题记录日志
开发Ble(公司项目,防丢器)已经有一段时间,由于是第一次接触Ble而网上资料又不多,且android平台自身的差异性,遇到了很多问题.为了将来方便查阅,在此做下记录.1.中兴手机,蓝牙手动断开后,无 ...
- Android 中与 so 有关的一个大坑
Android 应用开发中不可避免的会引入第三方的代码.如果是开源项目风险相对可控,如果引入商用的 SDK 那就要谨慎了,难免会有这样或那样的问题.比如我们今天要说的这一个. 对集成过第三方 SDK ...
- android R.layout 中找不到已存在的布局文件
在R.layout.test文件时,总是找不到您想要的文件,可是它明明就在layout文件下面,而且在R.Java中也已经生成了,那么找不到的原因就是你导入了Android.R的包,这样你永远找不到你 ...
- android 时间控件概述
android的自带时间选择控件,是一个让用户既能输入的又能选择的样子.这本来没有太大的问题了. 但是,坑爹的android是开源的.自带的时间控件在某些机型上,早已经是面目全非了,在用以一个普通用户 ...
- 自定义标签+阻尼动画+圆角图片+titleBar随滑动渐隐和显示
写这个小Demo,也是因为刚好手里没什么事然后看到很多朋友还在好奇这个阻尼界面效果,还有自定义标签,其实这个标签因为现在Google已经有推出更好使用的东西可以替代,那就是“FlexboxLayout ...
- osg for android (一) 简单几何物体的加载与显示
1. 首先需要一个OSG for android的环境. (1).NDK 现在Eclipse 对NDK已经相当友好了,已经不需要另外cygwin的参与,具体可以参考 Android NDK开发篇(一) ...
- 编译osg for android
做osg数数已经快两年了,之前将一些opengl的代码搬到了osg上,现在将一些osg的代码搬到了android上,尝试看看效果. 首先是编译的事情,android for android在http: ...
- osg for android学习之一:windows下编译(亲测通过)【转】
1. 首先需要一个OSG for android的环境 (1)NDK 现在Eclipse 对NDK已经相当友好了,已经不需要另外cygwin的参与,具体可以参考 Android NDK开发篇(一):新 ...
- 在Android上编译OSG[3.0.2 ] (转)
在Android上编译OSG[3.0.2 ] 分类:Android This file contents can be applied for version OpenSceneGraph(OSG ...
随机推荐
- liunx Swap 分区的作用
1.1 SWAP 概述 当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存 ...
- 3. DNN神经网络的正则化
1. DNN神经网络的前向传播(FeedForward) 2. DNN神经网络的反向更新(BP) 3. DNN神经网络的正则化 1. 前言 和普通的机器学习算法一样,DNN也会遇到过拟合的问题,需要考 ...
- Flask简介,安装,demo,快速入门
1.Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug ...
- MAMP和WAMP搭建Web环境,数据库,数据分布可视化
MAMP和WAMP搭建Web环境,数据库,数据分布可视化 1. 数据库 用MAMP和WAMP搭建Web环境,数据分布可视化 Web环境Web服务器:Apache.Nginx,处理Web请求数据库:My ...
- spark 数据倾斜的一些表现
spark 数据倾斜的一些表现 https://yq.aliyun.com/articles/62541
- Extjs js 产生Guid或者UUID
Ext.data.IdGenerator.get('uuid').generate() 结果:a9c4efb8-06c9-4c2e-8a70-bb36a69e053e 更多介绍:http://docs ...
- Matlab基本用法
转至:http://blog.sina.com.cn/s/blog_8354dda801012dyn.html 目录: 一.说明 二.数据类型及基本输入输出 三.流程控制 四.循环 五.数组.数组运算 ...
- Java设计模式(2)单态模式(Singleton模式)
定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化 ...
- 通过URI返回File文件
/** * 通过Uri返回File文件 * 注意:通过相机的是类似content://media/external/images/media/97596 * 通过相册选择的:file:///stora ...
- Sword redis配置
Redis 配置 Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf. --查看配置 你可以通过 CONFIG 命令查看或设置配置项(使用CONFIG必须在redis客 ...