2016-03-08 103 views
0

我要的數字,libgdx錐寶盒:結合模型實例在Libgdx

ModelBuilder modelBuilder = new ModelBuilder(); 
     Model cone= modelBuilder.createCone(40f,250f,40f,8,cMaterial, VertexAttributes.Usage.Position|VertexAttributes.Usage.Normal|VertexAttributes.Usage.TextureCoordinates); 
    Material tMaterial = new Material(ColorAttribute.createDiffuse(com.badlogic.gdx.graphics.Color.GRAY)); 
    Texture troncoTexture = new Texture(Gdx.files.internal("t.jpg")); 
    TextureAttribute taTronco = new TextureAttribute(TextureAttribute.Diffuse,troncoTexture); 
    tMaterial.set(taTronco); 
    Model cylinder= modelBuilder.createCylinder(20, 320, 20, 12, boxMaterial, VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates); 

有什麼辦法,我可以這兩種模式結合成一種新的模式或使modelInstance的時候我都申請轉換模型在同一時間移動?

例子:

Model myCominedModel = new Model(cone,cylinder) //Something like this is possible? 
myCombinedModel.rotate(1,1,1,60) // Rotate both models 
+0

爲什麼建立兩個模型,如果你只需要一個? https://github.com/libgdx/libgdx/wiki/ModelBuilder%2C-MeshBuilder-and-MeshPartBuilder。順便說一句,不要使用'createXXX'方法。 – Xoppa

+0

感謝您的鏈接。爲什麼不好使用createXXX方法?我想創造一個錐體和一個圓柱來製作一把劍。我也想學習如何在代碼中進行學習。 –

+0

因爲他們創建了只包含該形狀的模型。這對於測試/調試是可以的,但在其他任何情況下,您可能都希望顯示的不僅僅是單個形狀。 – Xoppa

回答

3

您可以使用ModelCache合併一個或多個Models。在可能的情況下,它們會將它們合併到同一個網格物體中,並將​​其單獨轉換爲直接應用。

如果您只是想將一個模型的節點添加到另一個模型,那麼您可以使用model1.nodes.add(model2.nodes);來實現。但請注意,這不會使model1負責管理model2的資源,但如果您不再需要model1(但在此之前不需要),則仍需要處理這兩種模型。爲了解決這個問題(以及對材料的引用等),你可以使用靜態方法,在這之後你應該丟棄model2,但是而不是處置它。

還有其他幾個選項。例如。爲了防止必須處理一次性用品的所有權,您可以結合使用ModelInstance而不是Model。您也可以使用ModelBuilder創建新模型並將兩個模型的節點添加到該模型中。

這就是說;在您的示例代碼中,您首先使用ModelBuilder創建兩個單獨的模型,然後詢問如何組合它們。首先你可以建立一個模型。這看起來是這樣的(未測試的代碼):

ModelBuilder modelBuilder = new ModelBuilder(); 
modelBuilder.begin(); 
modelBuilder.part("cone", GL20.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, cMaterial) 
.cone(40f,250f,40f,8); 
modelBuilder.part("cylinder", GL20.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, boxMaterial) 
.cylinder(20, 320, 20, 12); 
Model model = modelBuilder.end(); 

更多信息請參見this link。請注意,在您的代碼段中,您正在創建一個材質而不實際使用它。你也在那裏創建一個紋理。請記住,需要處理紋理。如果您想讓模型負責爲您處置,那麼您可以撥打modelBuilder.manage(troncoTexture)

另請注意,如果您不需要爲錐體和圓柱體單獨使用材料,則無需爲其創建單獨的part()。另一方面,如果您希望能夠在模型內獨立移動它們,則可以在每個零件之前調用node()方法。