我必须在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 :(得分:3)
您可以使用ModelCache
合并一个或多个Models
。这将在可能的情况下将它们合并到相同的网格和render call中,这将导致它们的个别转换直接应用。
如果您只想将一个模型的节点添加到另一个模型,那么您可以使用model1
执行此操作。但请注意,这不会使model2
负责管理model1
的资源,当您不再需要ModelBuilder.rebuildReferences(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();
创建两个单独的模型,然后询问如何组合它们。你也可以在第一时间建立一个模型。这看起来像(未经测试的代码):
modelBuilder.manage(troncoTexture)
有关详细信息,请参阅this link。请注意,在您的代码段中,您正在创建材料而不实际使用它。你也在那里创建一个纹理。请记住,需要处理纹理。如果您想让模型负责为您处置它,那么您可以致电part()
。
另请注意,如果您不需要锥体和圆柱体的单独材料,则不需要为其创建单独的node()
。另一方面,如果您希望能够在模型中彼此独立地移动它们,那么您可以在每个部分之前调用spell:
方法。