我正在使用Libgdx(Java)并尝试构建3D模型。目前,我可以使用已定义的方法创建模型,例如modelBuilder.createBox()
或modelBuilder.createSphere()
。但是,我想使用自定义网格(使用基于某些基本数学计算的顶点)构建自己的球体,然后细分以增加面数。例如,从 icosahdron 开始,然后进一步细分以增加面数。我必须手动执行此操作,因为似乎没有任何更简单的方法。我想这样做是因为后来想要单独定位这些面,以便为所述面部应用独特的颜色/纹理。
我想如果有人帮我制作一个自定义/手动立方体,我可以解决剩下的问题。
我的环境已经设置好了,我现在用这个来使用预定义的方法构建一个球体:
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);
}
}
摘要:
非常感谢提前。 Ĵ
修改: 我现在使用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()
我似乎无法将纹理应用于此三角形面,我只能指定随机漫反射颜色(参见图像)
所以我仍然需要
编辑2:
稍后的一些数学,我已经研究了如何编辑网格并在每个面上应用N个细分,再加上从原点向外挤出该点以保持球形。请参阅下图,其中包含我的细分方法的0,1和2次迭代。
我现在需要的是,能够将纹理应用于每个单独的面部,而不是随机颜色。有帮助吗?感谢。