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的基礎知識。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM