圖片來源:http://tw.freeimages.com/photo/3d-lines-and-sphere-photo-2-1165195

圖片來源:http://tw.freeimages.com/photo/3d-lines-and-sphere-photo-2-1165195

上一篇 Android Vuforia with jPCT-AE (1) – 基本範例 我們已經把 Vuforia 與 jPCT-AE 的環境建立出來,也可以正常顯示 Vuforia + jPCT-AE 的範例─一個顏色有點昏暗的桶子,這篇繼續記錄怎麼直接載入一般常見的 .obj 檔案。

 

囉哩巴唆

透過 Android Vuforia with jPCT-AE (1) – 基本範例 是直接在 ImageTargetRenderer.java 的建構式中,將要畫出物件的座標以及一些參數設定好之後,透過 jPCT-AE 畫出來,聽起來不怎麼有彈性,加上一些複雜的模型要透過自己訂定座標點的方式畫出來,貌似非常不科學啊!因此,這篇要記錄如何透過 Loader 類別來載入 .obj 的檔案,而不是在程式中,自己把座標一一描繪出來。

 

到 TD3M 下載需要的檔案

這篇小蛙使用 Bedside Table (4 skins) @ TF3DM 當作範例,因為這個範例非常符合 jPCT-AE 載入的規則,後面會再提到這是什麼意思,總之先把這個範例下載下來,下載完解壓縮之後會看到如下圖

Bedside table 3d model

Bedside table 3d model

將這三個檔案通通複製到 Android Studio 專案中的 assets 目錄下

將模型放入 assets 目錄下

將模型放入 assets 目錄下

小蛙測試的時候用了很多模型,造成 assets 目錄下面亂七八糟,因此又在 assets 下新增了 obj、mtl、texture 等目錄,分別把上述「Bedside Table D.obj」、「Bedside_Table_D.mtl」、「Bedside_Table_D_default_1_1.png」依類別放入。

 

讓 jPCT-AE 載入 obj, mtl, texture 

建議可以先把 jPCT-AE 的 ImageTargetRenderer.java 的建構式注解起來,到時候如果改壞了,還可以還原回去,然後把以下建構式的程式碼貼上

public ImageTargetRenderer(ImageTargets activity, SampleApplicationSession session) {
    mActivity = activity;
    vuforiaAppSession = session;
    world = new World();
    // 如果亮度太暗或是亮度怪怪的,可以調整這裡
    world.setAmbientLight(150, 150, 150);
    world.setClippingPlanes(2.0f, 3000.0f);
    sun = new Light(world);
    // 如果亮度太暗或是亮度怪怪的,可以調整這裡
    sun.setIntensity(250, 250, 250);
    try{
        // 載入材質,第一個參數是 texture 名稱,這邊使用原始檔名
        // 因為當載入 mtl 時,mtl 的檔名會自動對應到該 texture
        TextureManager.getInstance().addTexture(
                "Bedside_Table_D_default_1_1.png",
                new Texture(mActivity.getAssets().open("texture/Bedside_Table_D_default_1_1.png"))
        );
        // loadOBJ 參數分別是:.obj, .mtl, 縮放大小
        Object3D[] tmp = Loader.loadOBJ(
                mActivity.getAssets().open("obj/Bedside Table D.obj"),
                mActivity.getAssets().open("mtl/Bedside_Table_D.mtl"),
                5
        );
        if(tmp != null && tmp.length >= 1){
            cylinder = tmp[0];
        }

        cylinder.strip();
        cylinder.build();
        // 位移
        cylinder.translate(-110, -160, 0);
        // x 軸旋轉,不然載入的櫃子可能是趴著或是躺著的
        cylinder.rotateX(-1.5f);
        // 如果有 mtl 就可以不用 setTexture,mtl 內有 texture 名稱會自動載入
        //cylinder.setTexture("Bedside_Table_D_default_1_1.png");

        world.addObject(cylinder);
        cam = world.getCamera();

        SimpleVector sv = new SimpleVector();
        sv.set(cylinder.getTransformedCenter());
        sv.y -= 100;
        sv.z -= 100;
        sun.setPosition(sv);
    }catch(Exception e){
        e.printStackTrace();
    }
    MemoryHelper.compact();
}

執行看看是不是可以正常載入一個櫃子了呢?

載入 .obj 測試

載入 .obj 測試

 

遭遇問題 

小蛙之前弄了半天,遇到一拖拉庫的錯誤,有些事情後來才釐清到底為什麼會發生錯誤,在 texture 的部份,圖片大小必須要是 2 的次方,像是:128, 256, 512, 1024, 2048 … 等,只要邊長不是 2 的次方,就會得到圖片大小錯誤的訊息,外加因為載不到圖片隨之而來的 javaNullPointer Exception。

render 出來沒有東西,這個要仔細看,有時候是模型太小,小蛙有一次 render 出來的東西,必須要放大 30000 倍,才符合使用大小 … 有時候是座標軸不對導致 redner 在 image target 下面 (被紙張遮住了),有時候是沒有 mtl 也沒有材質,就會 render 出空的東西 (沒有東西) … 等,有時候是 mtl 裡面的 texture 有問題,像是根本沒有 texture 資訊,或是 texture 資訊還是錯誤的檔案路徑(如:C:\xxx\rrr\ccc\xx.png 但是實際上根本沒有這種路徑,此時就要手動修正他),有時候其實根本也不知道為什麼就是沒有東西。

到 TD3M 多下載幾個範例檔試試看,再慢慢釐清為什麼不能載入的原因,這個範例應該是不需要做什麼調整就可以直接載入,因此使用這個當作範例。

 

Android Vuforia with jPCT-AE 系列文章

Android Vuforia with jPCT-AE (1) – 基本範例
Android Vuforia with jPCT-AE (2) – 載入 obj 測試
Android Vuforia with jPCT-AE (3) – 載入 md2 測試
Android Vuforia with jPCT-AE (4) – 載入 3ds 測試
Android Vuforia with jPCT-AE (5) – 多重模型載入

參考資料:

  1. Bedside Table (4 skins) @ TF3DM
    http://tf3dm.com/3d-model/bedside-table-4-skins-96709.html
相關文章

Android Vuforia with jPCT-AE (5) – 多重模型載入,以 obj 為例

要進到這系列最後一篇文章了,這篇文章拖了很久,一直沒有時間整理,結果到最後 ... 程式碼留下來了,記憶卻有些模糊了,這邊小蛙配著程式碼盡可能的把還記得的東西寫下來。
2016-07-06 11:24:19
hans

18

Android Vuforia with jPCT-AE (4) – 載入 3DS 測試

延續 jPCT-AE Loader 載入模型的部份,這篇要記錄載入 3ds 檔案格式的方法,基本上跟前面幾個 obj, md2 的方法差不多,只有一些小小的變化而已。
2016-07-06 10:24:33
hans

18

Android Vuforia with jPCT-AE (3) – 載入 md2 測試

前兩篇介紹如何直接透過 jPCT-AE 直接繪圖以及載入 .obj 檔案,這邊繼續介紹 jPCT-AE 載入 md2 的方法,載入動作大致上類似,唯一不同的只有 texture 設定部份。
2016-07-06 09:24:43
hans

18

Qualcomm Vuforia 教學 (6) – 3D model -> .obj -> .h

終於來到 Vuforia 記錄的最後一篇了,這篇參考到網路上神人的做法,怎麼把一個 3D model 轉換成 Vuforia 可以使用的 .h 檔,這邊之後都直接使用 An
2014-12-10 11:25:50
hans

18

java/lang/NoClassDefFoundError: java/lang/Object

今天小蛙要使用 Eclipse 的時候發現開啟的時候,馬上就又瞬間關閉,連個錯誤訊息都沒有看到,有錯誤訊息大概還能看一下問題出在哪,最怕這種完全沒有任何訊息的問題 ... 花了五分鐘 Google 搞定,這邊記錄一下,免得下次又發生這種情況
2012-09-07 17:45:40
hans

18

SSL For Free – 免費又有綠色鎖頭的 SSL Certificates

之前聽說 Google 會優先搜尋有 https 的網頁 (參考:
2016-07-07 23:00:54
hans

8

Android Vuforia with jPCT-AE (1) – 基本範例

說來慚愧,從 Google Adsense 被 ban 之後,就好久沒有發文了,站上 Vuforia 的文章也已經是好久以前的事情了 (遠目),最近有專案要用到 Vuforia,爬以前的文回來看,蛙哩咧 ... 現在已經更新到 Vu
2016-07-06 07:57:58
hans

8

ClickForce (MobiForce) 當機問題

這真是個浪費時間又漫長的過程,CF 推出新版後台以及新版 SDK 的時候,小蛙就下載來測試,一開始小蛙直接套在「我的股票精算師」上,但只要一套上去就當機 ...
2015-09-02 10:32:51
hans

8

我的股票精算師備份功能

常遇到使用者詢問「我的股票精算師」要怎麼備份,這篇記錄一下,需要寫怎麼備份表示軟體設計上有很大的問題,造成使用者使用上的困難,但小蛙最近沒有時間去做修改 ... 只好委屈精算師的使用者了 ><
2015-02-06 18:32:07
hans

8




  一個回應 to “Android Vuforia with jPCT-AE (2) – 載入 obj 測試”

  1. 使用前相機好像有問題,某個方向的旋轉與移動是相反的。

 回覆

你可以使用以下語法 HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="">

(required)

(required)

   
© 2012 蛙齋 Suffusion theme by Sayontan Sinha