1. 程式人生 > >利用JPCT-AE在安卓裝置上進行*.obj檔案的載入和顯示

利用JPCT-AE在安卓裝置上進行*.obj檔案的載入和顯示

最近做一個專案,需要載入帶紋理的3d模型obj檔案並顯示出來,僅限於安卓平臺,因此需要一個輕量級的3d核心。

找了很多核心,要不就是太久沒更新不能用了,要不就是功能太複雜,後來找到了JPCT-AE,網上的文件相當少,但經過自己研究了兩天,終於成功完成了obj模型的載入和顯示,有需要的同學可以參考借鑑。

1、JPCT-AE簡介

官網:http://www.jpct.net/jpct-ae/index.html

支援載入3DS, OBJ, MD2, ASC,序列化檔案,也支援mtl和紋理,基於egl實現。

注意:紋理只支援圖片的寬高為2的n次方,如1024,512,如果紋理不是這些尺寸,那麼在載入時會出錯。此問題也有解決辦法,解決辦法詳見後面的說明。

jpct-ae顯示3d的流程大致如下:

     mWorld = new World();  //建立3d場景

     mWorld.setAmbientLight(20, 20, 20);  //新增環境光源

     mSun = new Light(mWorld);   //新增點光源

     mSun.setIntensity(250, 250, 250);   //設定點光源強度

     //此處略,利用loader載入3d模型

     // ......

     //載入3d模型完畢

    Camera cam = mWorld.getCamera();         //獲取相機
    cam.moveCamera(Camera.CAMERA_MOVEOUT, 130);  //調整相機位置


    cam.lookAt(mObj.getTransformedCenter());      //調整相機視角

場景繪製在一個GLSurfaceView上, 構建完畢後,在onDrawFrame方法中對場景進行渲染:

     mWorld.renderScene(mFb);
     mWorld.draw(mFb);

   在官方提供的demo中有很完整的示例程式碼,可以參考demo來完成程式碼的編寫。

2、利用JPCT-AE載入obj模型

JPCT-AE提供一個靜態的Loader類用於載入不同資料格式的3d模型,在官方文件中可以查到這個類的用法及api,載入.obj格式使用下面的api:

loadOBJ

public static Object3D[] loadOBJ(java.io.InputStream objStream,
                                 java.io.InputStream mtlStream,
                                 float scale)
此api會載入模型中的所有多邊形的幾何資訊,支援多邊形最多4個頂點(超過會有警告並且顯示異常)。對於模型的texture檔案,此api會載入成空檔案,並不會實際讀取,因此需要在執行此函式前預先將相關的texture檔案進行載入,或者在此函式執行後對相關的texture檔案進行替換,否則texture將不能顯示。

同時,JPCT-AE提供一個類TextureManager用於管理紋理,此類是一個單例,用於儲存和取出textures,常用的有addTexture, replaceTexture, containsTexture, unloadTexture,用法很簡單,詳細說明可以查官方api文件。

整理以上思路,得知正確的顯示出帶紋理的obj模型,需要做以下幾步:

1)解析obj檔案,得到mtl檔案;

2)解析mtl檔案,得到texture檔案;

3)使用TextureManager類,載入所有的texture檔案;

4)建立場景並顯示。

2.1 解析obj檔案,得到mtl檔案

開啟obj檔案檢視描述資訊,其中以“mtllib”關鍵字開頭,即是描述的mtl檔案的名稱,如: mtllib male02.mtl
參考程式碼:     

2.2  解析mtl檔案,得到texture檔案

開啟mtl檢視texture資訊,其中以"newmtl"關鍵字開關,描述的就是紋理資訊,一個mtl檔案中可以描述多個紋理,如:

newmtl _01_-_Default1noCulli__01_-_Default1noCulli
Ns 154.901961
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.165000 0.165000 0.165000
Ni 1.000000
d 1.000000
illum 2
map_Kd 01_-_Default1noCulling.JPG

newmtl FrontColorNoCullingID_male-02-1noCulling.JP
Ns 154.901961
Ka 0.000000 0.000000 0.000000
Kd 0.800000 0.800000 0.800000
Ks 0.165000 0.165000 0.165000
Ni 1.000000
d 1.000000
illum 2
map_Kd male-02-1noCulling.JPG

map_Kd 表示材質的固有色,map_Ka表示材質的陰影色。

得到所有的紋理。參考程式碼:


2.3 載入所有texture,參考程式碼如下:


2.4 建立場景並顯示

在onSurfaceCreated中建立場景,在onDrawFrame中進行繪製:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    Log.i(TAG, "onSurfaceCreated enter!!");
    createWorld();
}

public void onDrawFrame(GL10 gl) {
    //Log.i(TAG, "onDrawFrame enter!!");
    // Draw the main screen
    mFb.clear(mBgColor);

    if(mWorld != null) {

        mWorld.renderScene(mFb);

        mWorld.draw(mFb);
        mFb.display();
    }
}

3、解決texture只支援寬高為2的n次冪的圖片的問題。

解決辦法是改變bitmap的大小,不過我這個解決辦法很牽強,因為改變bitmap後會有一定程度的失真,另外也不是百分百適用,只適用於texture為正方形的情況。當然一般像3dmax這樣的建模軟體生成的texture肯定都是符合要求的。但是由於openge本身並沒有對texture有寬高上的要求,所以jpct-ae有這樣的限制感覺很不爽。

參考程式碼如下:

//jpct-ae only supports images size of which is 2^x 
public Bitmap scaleBitmap(Bitmap bitmap){  
            int w = bitmap.getWidth();  
            int h = bitmap.getHeight();
            int destW = 1024;
            int destH = h*destW/w;
     
            Bitmap newbm = Bitmap.createScaledBitmap(bitmap, destW, destH, true);  
            return newbm;  
    }

   總之,暫時利用jpct-ae快速解決了3d模型載入的問題,但還是覺得jpct-ae稍微有點重,而且存在一些限制不太方便,有空了還是自己利用egl寫一個比較好。

相關推薦

利用JPCT-AE裝置進行*.obj檔案載入顯示

最近做一個專案,需要載入帶紋理的3d模型obj檔案並顯示出來,僅限於安卓平臺,因此需要一個輕量級的3d核心。 找了很多核心,要不就是太久沒更新不能用了,要不就是功能太複雜,後來找到了JPCT-AE,網上的文件相當少,但經過自己研究了兩天,終於成功完成了obj模型的載入和顯示

EuhatRtsp優秀的裝置RTSP開源解決方案

下載ZIP包後解壓得到資料夾EuhatRtsp-0.1.3,進入此文夾,可以看到euhatrtsplib,其就是此開源軟體的原始碼庫。 編輯根目錄下的local.properties,將sdk.dir和ndk.dir修改正確。 開啟Android Studio,匯入工程時選擇根目錄EuhatRtsp-0.1

react native新建專案執行在裝置

一、二、1、新建(不含android和ios包的)專案:在終端輸入 npm install -g create-react-native-app和create-react-native-app AwesomeProject即可新建一個名為AwesomeProject的專案。2

react native 開發的app在裝置執行

前提條件:USB除錯 你需要開啟USB除錯才能在你的裝置上安裝你的APP。首先,確定你已經開啟裝置的USB除錯開關 確保你的裝置已經成功連線。可以輸入adb devices來檢視: $ adb devices List of devices attached emu

傳多檔案與servlet伺服器接收多檔案

android端上傳檔案很簡單  用xutils提供的方法 如下: RequestParams requestParams=new RequestParams(); requestParams.addBodyParameter("video", new File(pa

Java開發公眾號系列教程(一):微信js-sdk傳照片相容IOS裝置

很多開發者朋友在進行微信公眾號開發時,遇到微信js-sdk上傳手機相簿照片時IOS裝置無法正常預覽的情況,今天筆者結合多年的開發經驗,把相容IOS的解決方案分享給廣大微信開發者朋友。 微信最新版本JSSDK文件 地址https://mp.weixin.qq.com/advanced/wiki

Java開發公眾號系列教程(一):微信js-sdk傳手機相簿照片相容IOS裝置

很多開發者朋友在進行微信公眾號開發時,遇到微信js-sdk上傳手機相簿照片時IOS裝置無法正常預覽的情況,今天筆者結合多多年的開發經驗,把相容IOS的解決方案分享給廣大微信開發者朋友。 一、首先申明一點筆者本案例用的微信JSSDK版本是1.2.0的,官方文件給出的最

利用天天模擬器進行HBuilder App開發

HBuilder中右側自帶了內建瀏覽器,可以實時看到效果,但是對於一些需要呼叫plus才能顯示的效果就無能為力了。 如果用真機進行除錯,連線電腦裝驅動,每次都得檢測,有的手機電腦都檢測不到,我的就是-_-||,這時候,如果能用安卓模擬器進行除錯,全電腦操作,那

利用tcpdump對機頂盒進行抓包

最近遇到一個問題,詳情如下:同一檯安卓機頂盒(海思晶片 Android4.4)在同一樓層的不同位置播放同一個視訊流,結果一個能播放另一個不能播放。最終原因:不能播放的區域網路物理鏈路不一樣,符合防火牆的規則,導致機頂盒的請求被攔截了。解決思路:抓包分析步驟2、利用adb命令將

Unity3D 怎樣在手機播放視頻

nbsp screen mp4 unity3 clas 電腦 () div oid 曾經僅僅會在電腦上通過Unity3D播放視頻,研究了下發現通過Unity3D在手機上播放視頻也很easy。現介紹例如以下。 void OnGUI() { if

傳應用並生成下載鏈接需要多少錢;市場傳應用需要什麽

app上傳專業上架蘋果app app上架多少錢聯系QQ:2205357007 上傳應用並生成下載鏈接需要多少錢;安卓市場上傳應用需要什麽上傳應用程序到安卓分發市場時,經常需要填寫一些有關apk安裝包的信息。而作為非技術開發人員的我們同樣需要識記一下這些信息,在下載安裝包、安裝應用到手機時,都是非常有用的。目前

解決手機軟鍵盤彈出擠壓背景的問題

彈出 鍵盤 color col 軟鍵盤 func class div res demo: // 解決本頁面軟鍵盤彈窗背景擠壓的問題 var clientHeight = document.documentElement.clientHeight || documen

轉載一篇文章 python程序在手機使用

cto line str socket code -s sele led data from kivy.app import App from kivy.uix.button import Button class TestApp(App): def build(

手機有什麼好用的日程安排管理軟體?

安卓手機上有什麼簡單好用的日程安排管理軟體? 在百度知道上有一個於此相關的問題,題主的要求十分明確,在這篇文章中,小編不妨以圖中的問題為基準,為大家介紹一款簡單好用的手機日程安排管理軟體。 1.分類管理待辦任務的日程管理軟體 敬業籤雲便籤是一款專為商務辦公族設計的桌面提醒便

市場的時候提示應用圖示傳的圖示不一致

首先跟大家介紹一下應用圖示和上傳圖示的區別 應用圖示是你的應用包安裝後,顯示出的應用圖示,而上傳圖示是上傳到安卓市場的圖示,如果你在專案中沒有設定對應的應用圖示,則安裝到手機後,顯示的則是預設的安卓符號,不要忘記在對應程式碼中設定哦 1、AndroidManifest中appli

Android : 裝置配置網路adb除錯

一、除錯環境: Android Debug Bridge version 1.0.40 + Nexus7平板; 二、除錯步驟:    1. Android裝置除了用有線usb進行ADB除錯外,還可以在同一區域網通過網路ADB連線,一般指令為 adb connect 192.168.2.36(此為當前And

移動APP開發工作筆記002---Hbuilder js判斷當前裝置裝置還是蘋果裝置

   JAVA技術交流QQ群:170933152    js判斷是否為手機系統是安卓還是蘋果,是否為微信瀏覽器                  

手機免費使用的CAD看圖軟體推薦!

安卓手機上免費使用的CAD看圖軟體推薦!在我們需要在手機上開啟一張CAD圖紙檔案的時候,你會不會因為打不開圖紙而煩惱呢?還有就是圖紙開啟速度過慢時間太長而焦躁呢?不過現在不需要進行擔心了,今天小編就要來給大家安利一款在手機上進行CAD圖紙檔案開啟的軟體了,圖紙開啟時間迅速且使用方便操作簡單,小面小編就來教大家

獲取並輸出當前裝置的系統資訊

String TAG = "SystemInfo";String board = Build.BOARD;Log.i("TAG",String.Format("主機板資訊:%s",board));String brand = Build.BRAND;Log.i("TAG",String.Form

PyAndroidControl:使用python指令碼控制你的裝置

寫在前面 有的時候玩遊戲或者幹什麼想寫寫安卓的指令碼,不過用 java 或者 kotlin 寫影象處理什麼的太麻煩了,按鍵精靈的指令碼我也懶得學。adb 倒是可以,但是很多時候要用電腦,又有些不太方便。感覺現在雲手機比較方便吧,比如說:紅手指、愛雲兔這種,我比較喜歡用雲手機這種掛一掛機,在手機上隨時都能看看