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的基础知识。

时间: 2024-10-03 04:40:43

OSG 坑爹的Android example的相关文章

坑爹的Android Ble 问题记录日志

开发Ble(公司项目,防丢器)已经有一段时间,由于是第一次接触Ble而网上资料又不多,且android平台自身的差异性,遇到了很多问题.为了将来方便查阅,在此做下记录.1.中兴手机,蓝牙手动断开后,无法再次链接问题.(可能别的手机也存在类似问题)解决办法: 在连接gatt之前,对bluetoothadapter进行一次scan 顺利解决此问题. 2.Gatt链接不稳定(在部分手机上出现过,此问题先排除硬件问题.此处只针对自己遇到的情况,或许有别的方案,待补充)解决办法: 由于用到了gattser

编译osg for android

做osg数数已经快两年了,之前将一些opengl的代码搬到了osg上,现在将一些osg的代码搬到了android上,尝试看看效果. 首先是编译的事情,android for android在http://www.openscenegraph.com/index.php/documentation/platform-specifics/android/43-building-openscenegraph-for-android-3-0-2 已经有了教程,结合CSDN其他人的博客,努力了几天终于编译

osg for android (一) 简单几何物体的加载与显示

1. 首先需要一个OSG for android的环境. (1).NDK 现在Eclipse 对NDK已经相当友好了,已经不需要另外cygwin的参与,具体可以参考 Android NDK开发篇(一):新版NDK环境搭建(免Cygwin,超级快)  (2).osg for android的编译,参考 osg for android学习之一:windows下编译(亲测通过) 建议编译OpenGL ES2版本. 2.然后加载OSG自带的Example:osgAndroidExampleGLES2 (

坑爹啊!gradle 2.1构建android出现错误的解决方案

坑爹啊 浪费了我好长时间,结果是gradle版本不对 http://tools.android.com/tech-docs/new-build-system/version-compatibility 改成 buildscript { repositories { //mavenCentral() maven { url "http://maven.oschina.net/content/groups/public/" } } dependencies { classpath 'com

android 布局权重问题(最近布局经常坑爹)

android 布局 权重 With layout_weight you can specify a size ratio between multiple views. E.g. you have a MapView and a table which should show some additional information to the map. The map should use 3/4 of the screen and table should use 1/4 of the s

OSG for Android新手教程系列(二)——项目配置

在上一篇教程中,主要介绍了如何把OSG源代码编译成为能够在Android项目下使用的函数库.在这一篇教程中,我将针对如何在自己的Android项目中配置OSG函数库进行详细讲解. 现阶段网上关于OSGfor Android的配置方式教程有很多,但是大部分在实际使用起来都会或多或少的出现一些问题,无法完全照搬,需要一定的修改.而且,对于配置中的那些变量的具体含义,也很少有人能够进行仔细的讲解.这非常不利于新手的学习和理解,往往会造成出现bug后面对满屏幕的错误log完全一脸茫然的情况. 所以我将在

在Android上编译OSG[3.0.2 ] (转)

在Android上编译OSG[3.0.2 ] 分类:Android This file contents can be applied for version OpenSceneGraph(OSG) 3.0.2 or newer. Prerequisites for build process To compile OSG as a standalone library you'll only need the Android NDK. To develop applications with

osg for android 操作器

很短的文章解决一个实用的问题 osg for android默认操作器,用起来是不是不能动,一触屏模型就飞了? 是的,原因是由于在相机操作的时候的一个计算引起的. 引擎代码段中,会看到许多下面的处理. float dx = _ga_t0->getXnormalized()-_ga_t1->getXnormalized(); float dy = _ga_t0->getYnormalized()-_ga_t1->getYnormalized(); 这个计算本身没有问题,问题就出在an

android listview 每一项都是edittext 导致的坑爹问题 内容的保存和焦点,光标位置的设置

activity布局:布局很简单,只有一个listview <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_