2012-02-16 45 views
1

我試圖手動(沒有像Three.js這樣的庫)將JSON 3D模型加載到我的webGL代碼中,只是爲了好玩,但當我的模型具有超過1個紋理時,我遇到了困難。 在一個OBJ-> JSON轉換後的文件中,我如何知道哪個紋理是後續面的「活動」? OBJ文件使用'usemtl'標記來標識正在使用的紋理/材質,但在使用JSON時我似乎無法找到這種指針。 隨着時間的推移,我使用的是由alteredq多紋理OBJ-> JSON轉換文件如何跟蹤面部紋理映射?

感謝一大堆寫的OBJ-> JSON轉換器, 杆

回答

1

看看日是文件:three.js/src/extras/loaders/JSONLoader.js

JSON文件faces數組中每個面的第一個元素是位域。第一位說,如果這張臉有三個四個指標。第二位表示該臉部是否分配了材料。物料索引(如果有的話)出現在索引之後。

實施例:faces: [2, 46, 44, 42, 0, 1, 45, 46, 48, 3, ...

第一面(三角形材料):

Type: 2 (00000010b) 
Indices: 46, 44, 42 
Material index: 0 

第二面(四無材料):

Type: 1 (00000001b) 
Indices: 45, 46, 48 

第三面(四用材料):

Type: 3 (00000011b) 
Indices: ... 

檢查該位字段的完整含義的源代碼。

+0

現貨。感謝你的回答,胡安。 – rod 2012-02-16 20:11:50

+0

就像澄清一樣,這個字段不是「字節字段」嗎?一個「位字段」將保持1位,只給出2個可能性,0或1.儘管如此,非常有幫助的答案,謝謝。 – rod 2012-02-16 20:31:01

+0

@rod否,「位域」是可以的。參見維基百科[文章](http://en.wikipedia.org/wiki/Bit_field)。 – 2012-02-16 21:57:07

0

在我對KickJS遊戲引擎編寫的OBJ-> JSON轉換器,每種材料都有它自己的指數範圍。

這意味着簡單的OBJ模型如

mtllib plane.mtl 
    o Plane 
    v 1.000000 0.000000 -1.000000 
    v 1.000000 0.000000 1.000000 
    v -1.000000 0.000000 1.000000 
    v -1.000000 0.000000 -1.000000 
    usemtl Material 
    s 1 
    f 2 3 4 
    usemtl Material.001 
    f 1 2 4 

將被翻譯成本(有兩個索引;一個用於每種材料):

[ 
     { 
      "vertex": [1,0,1,-1,0,1,-1,0,-1,1,0,-1], 
      "name": "Plane mesh", 
      "normal": [0,-1,0,0,-1,0,0,-1,0,0,0,0], 
      "indices0": [0,1,2], 
      "indices1": [3,0,2] 
     } 
    ] 

使用用於轉換的交互的在線模型查看器:

http://www.kickjs.org/example/model_viewer/model_viewer.html

+0

感謝您的回答,mortennobel。但是,您提供的鏈接似乎已被破壞。我能看到的只有按鈕(鴨子,立方體,茶壺等),沒有別的。 – rod 2012-02-16 20:11:26

+0

Firefox目前存在問題。嘗試Chrome(當我解決Firefox問題時) – Mortennobel 2012-02-16 20:56:20

+0

問題已修復。感謝您的反饋。我希望我的工具有趣。 – Mortennobel 2012-02-16 21:04:53