Libgdx meshbuilder手动创建3d对象

时间:2016-01-02 17:14:56

标签: java 3d libgdx mesh

我正在使用Libgdx(Java)并尝试构建3D模型。目前,我可以使用已定义的方法创建模型,例如modelBuilder.createBox()modelBuilder.createSphere()。但是,我想使用自定义网格(使用基于某些基本数学计算的顶点)构建自己的球体,然后细分以增加面数。例如,从 icosahdron 开始,然后进一步细分以增加面数。我必须手动执行此操作,因为似乎没有任何更简单的方法。我想这样做是因为后来想要单独定位这些面,以便为所述面部应用独特的颜色/纹理。

enter image description here

我想如果有人帮我制作一个自定义/手动立方体,我可以解决剩下的问题。

我的环境已经设置好了,我现在用这个来使用预定义的方法构建一个球体:

public class ManagerSphere {

    //Settings
    public String ASSET_TEXTURE_BOX = "data/libgdx.png";
    public float SPHERE_RADIUS = 2f;

    //init
    private GameScreen _gameRef;
    private ModelBuilder modelBuilder = new ModelBuilder();
    private Texture tex;
    private Material mat;
    private ModelInstance boxInstance;
    public AssetManager assets;

    public ManagerSphere(GameScreen gameRef) {
        this._gameRef = gameRef;
        createSphere();
    }


    public void createSphere() {
        this.tex = new Texture("spheretexture02.jpg"); 
        this.mat = new Material(TextureAttribute.createDiffuse(this.tex));

        Model tempSphere;
        tempSphere = modelBuilder.createSphere(SPHERE_RADIUS*2, SPHERE_RADIUS*2, SPHERE_RADIUS*2,
                50,50,
                new Material(),
                VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates
        );

        boxInstance = new ModelInstance(tempSphere,0,0,0); //x,y,z (+ve z = away, -ve z = behind)
        boxInstance.nodes.get(0).parts.get(0).material.set(this.mat);

    }

    public void render(float delta) {

        this._gameRef.modelBatch.render(boxInstance, this._gameRef.environment);

    }

}

摘要:

  • 我需要一种在3d空间中手动构建对象的基本方法。    理想情况下就像二十面体一样,但会很高兴有一个立方体来吸引我    开始
  • 我需要能够编辑这个网格,然后细分来创建更多的面/三角形
  • 我希望能够针对每一个目标 这些面孔和改变它们的颜色/纹理,最有可能使用 ' meshpart'和它自己的网格ID。

非常感谢提前。 Ĵ

修改: 我现在使用meshbuilder创建了二十面体对象。我使用了一些基本数学来计算12个顶点的初始位置,将其放入一个数组中,然后创建一个包含20个面的数组(其中每个面包含对三个顶点的引用)。这是我的新代码:

public void createSphere() {

    createFaces();

    int attr = VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates;
    Texture myTexture = new Texture("badlogic.jpg");

    ModelBuilder modelBuilder = new ModelBuilder();
    modelBuilder.begin();
    modelBuilder.manage(myTexture); //make modelbuilder responsible for disposing the texture resource

    Random r = new Random();
    for(Face face : faces) {

        modelBuilder.part("face"+face.id, GL20.GL_TRIANGLES, attr,
                //new Material(TextureAttribute.createDiffuse(myTexture)))
                new Material(ColorAttribute.createDiffuse(r.nextFloat(), r.nextFloat(), r.nextFloat(), 1)))
                .triangle(face.p1.toVector3(), face.p2.toVector3(), face.p3.toVector3());

    }


    boxInstance = new ModelInstance(modelBuilder.end(), 0, 0, 0);

}

但是,因为我使用modelBuilder.part(...).triangle()代替modelBuilder.part(...).box()我似乎无法将纹理应用于此三角形面,我只能指定随机漫反射颜色(参见图像)

enter image description here

所以我仍然需要

  • 找出如何细分每个面并将二十面体的形状更改为更圆形的细分
  • 将纹理(从某个点处的图集)应用到单个三角形面。也许所有面孔都可以具有相同的纹理,但也可以使用它扩散可变颜色。

编辑2:

稍后的一些数学,我已经研究了如何编辑网格并在每个面上应用N个细分,再加上从原点向外挤出该点以保持球形。请参阅下图,其中包含我的细分方法的0,1和2次迭代。

enter image description here

我现在需要的是,能够将纹理应用于每个单独的面部,而不是随机颜色。有帮助吗?感谢。

0 个答案:

没有答案