2013-10-14 198 views
0

我在Blender3D中製作了一把劍,將它導出爲三角模型.OBJ格式,它也生成了一個.MTL文件,並且我使用UV貼圖來創建紋理我以.PNG格式輸出的模型。如何將3D紋理加載到我的LWJGL 3D模型中

我該如何將劍紋理加載到我的LWJGL劍模型中?

我只能找到關於如何使用立方體做這個教程,但我的遊戲不是MineCraft的副本,所以立方體對我來說沒有用處。

任何人都可以幫助我嗎?

澄清:這裏要問的是如何在適當的OBJ文件中使用MTL文件,並在LWJGL環境中將MTL材質應用於OBJ對象。

+0

那麼你有什麼嘗試? – Vallentin

+0

@Vallentin我正在嘗試做與這個人完全相同的東西。我需要幫助將紋理加載到LWJGL中的.OBJ 3D模型中。到目前爲止,我已經嘗試過使用Slick-Util紋理加載器,但是(如問題中所述)似乎只適用於多維數據集:c Idk還有什麼其他的嘗試,我是一個新手,真的很掙扎。準備好現在拉我的頭髮D': – FreelanceCoder

+0

@FreelanceCoder閱讀我的答案,它會給你如何去做的想法。 – Vallentin

回答

1

基本上你可以創造一些像class OBJModel,然後有它加載波前obj文件並返回class OBJModel實例的OBJModelLoader.load(final InputStream is);

class OBJModel,你會有些存儲陣列頂點,法線紋理座標,面,材料等

加載模型

如果你不知道什麼是所有裏面的那些事.OBJ文件的手段,那麼你可以閱讀所有關於它的Wikipedia click here

只給一個想法,你會怎麼做OBJModel load()方法,這裏是一個想法:

public final static OBJModel load(final InputStream is) 
{ 
    final OBJModel model = new OBJModel(); 

    try (final BufferedReader br = new BufferedReader(new InputStreamReader(is))) 
    { 
     String line; 

     while ((line = br.readLine()) != null) 
     { 
      if (line.isEmpty() || (line.charAt(0) == '#')) 
      { 
       continue; 
      } 

      if (line.contains("#")) 
      { 
       line = line.substring(0, line.indexOf('#')); 
      } 

      line = line.trim(); 

      if (line.isEmpty()) 
      { 
       continue; 
      } 

      if (line.startsWith("v ")) 
      { 
       String[] xyz = line.split(" "); 

       float x = Float.parseFloat(xyz[1]); 
       float y = Float.parseFloat(xyz[2]); 
       float z = Float.parseFloat(xyz[3]); 

       model.addVertex(x, y, z); 

       continue; 
      } 
      else if (line.startsWith("vn ")) 
      { 
       String[] xyz = line.split(" "); 

       float x = Float.parseFloat(xyz[1]); 
       float y = Float.parseFloat(xyz[2]); 
       float z = Float.parseFloat(xyz[3]); 

       model.addNormal(x, y, z); 

       continue; 
      } 
      else if (line.startsWith("vt ")) 
      { 
       String[] uv = line.split(" "); 

       float u = Float.parseFloat(uv[1]); 
       float v = Float.parseFloat(uv[2]); 

       model.addTextureCoordinate(u, v); 

       continue; 
      } 
      else if (line.startsWith("f ")) 
      { 

因爲我只是讓你知道如何製作它,你必須自己完成它。

渲染模型

當你想渲染模型,以及剛做,你會經常做的時候,你會渲染紋理座標頂點。

攪拌器提供所有正確的紋理座標,因此您需要做的唯一事情就是在渲染具有紋理座標的所有頂點之前綁定紋理。

我會推薦使用VAOs來存儲和渲染模型,儘管它取決於您使用的OpenGL版本。如果您不能使用VAOs,則只需使用gl*Pointer調用即可使用常規VBOs,但不要使用即時模式進行渲染。