从LibGDX texturepacker纹理(Texture from texturepacker

2019-07-29 20:39发布

试图让我周围的质感包装头部(该真棒)LibGDX框架,我需要帮助。

我要绑定的纹理(根据网格,颜色和纹理 ),其被从填充有TexturePacker一个TextureAtlas萃取。 纹理结合到矩形网格。

我想纹理(纹理的实例)基本上可以从压缩文件中提取。

它是可行使用的createsprite或findregion方法并以某种方式跳过文件句柄一步?

另外:任何合并与AssetManager上述方法时,特别应该记住?

谢谢整理我出去!

Answer 1:

创建TextureRegion

首先,创建一个TextureAtlas通过描述你的图谱(:图像和描述其内容的文本文件创建地图集将创建两个文件的工具)的文本文件指向的对象:

TextureAtlas myTextures = new TextureAtlas("images/packed.txt");

然后,你可以查找TextureRegion在阿特拉斯(即寰特定的子结构)。 该地区应该有使用(有更多的细节和选择,如果你遵循一些特殊的命名约定来创建纹理元素的数组,但离开这个关现在)原始文件的基本名称:

TextureRegion region = myTextures.findRegion(fname);

配置纹理网

要在网格得出这样的纹理区域,则需要初始化Mesh纹理协调与支持:

Mesh myMesh = new Mesh(...,
                       new VertexAttribute(Usage.TextureCoordinates, 2, "y"));

new VertexAttribute(Usage.TextureCoordinates, 2, ...)告诉libGDX,这个网格将有两个纹理每个顶点坐标(传统上,这两个纹理坐标被称为uv )。 你可以有一大堆的每个顶点不同属性的,但我要承担的唯一的其他属性是三值Usage.Position为X,Y,Z空间坐标。

现在,彩车的数组定义了你的网格(您传递到阵列中的setVertices你需要设置X,Y和Z空间坐标加上U),并为每个顶点v纹理坐标:

final int floatsPerVertex = 5; // 3 spatial +  2 texture
float[] meshData = new float[numVerticies * floatsPerVertex];
for (int i = 0; i < numVerticies; i++) {
   meshData[(i * floatsPerVertex) + 0] = ... ; // x coordinate of i'th vertex
   meshData[(i * floatsPerVertex) + 1] = ... ; // y coordinate of i'th vertex
   meshData[(i * floatsPerVertex) + 2] = ... ; // z coordinate of i'th vertex
   meshData[(i * floatsPerVertex) + 3] = ... ; // u texture coordinate of i'th vertex
   meshData[(i * floatsPerVertex) + 4] = ... ; // v texture coordinate of i'th vertex
}
myMesh.setVertices(meshData);

你可以计算出正确的uv特定TextureRegion使用getUgetVgetU2getV2方法。 需要注意的是纹理坐标具有原点(U1,V1)在左上角,而y轴指向“向下”(在OpenGL屏幕和空间坐标通常在左下和y轴点的原点“上“)。 它有点复杂,但在这种非常灵活的可翻转或伸展或扭曲纹理它映射到您的网格。

由于质地大(512×512说)和特定区域就是一个小的子集(20×20说,在128×128),你会最终真正给利用只是整个512×512图像的20×20集的网状纹理坐标。

渲染纹理网

最后,当你渲染需要渲染之前的图像进行绑定,并启用纹理:

region.getTexture().bind();
Gdx.graphics.getGL10().glEnable(GL10.GL_TEXTURE_2D);
myMesh.render();
Gdx.graphics.getGL10().glDisable(GL10.GL_TEXTURE_2D);

请注意,这是非常低效率的比它应该是。 纹理图集的好处之一是,它应该包含很多可以呈现在一起的区域,所以你只需要绑定一个纹理,然后渲染了很多不同的纹理从一个必然的纹理网格。

SpriteBatch支持具有限定精灵TextureRegionAssetManager支持加载和查找TextureAtlas作为第一级的元件。



Answer 2:

得到它使用上面的解释工作。

我不能相信这么几个人都在运行问这个问题,因为它看起来像是其他人愿意这样做。

从接受的解决方案我创建了一个函数,也做数学的新的UV位置。

经测试,它为我工作,但请阅读我不是一个Java开发人员。

public Mesh RebuildMeshUVtoTextureRegion(Mesh ObjectMesh, TextureRegion UVMapPos)
{
    int numFloats = ObjectMesh.getNumVertices() * ObjectMesh.getVertexSize() / 4;
    float[] vertices = new float[numFloats];
    ObjectMesh.getVertices(vertices);

    int numIndices = ObjectMesh.getNumIndices();
    short SourceIndices[] = new short[numIndices];
    ObjectMesh.getIndices(SourceIndices);

    final int floatsPerVertex = 5;
    int TimesToLoop = ((vertices.length) /floatsPerVertex); 

    float previousU;
    float previousV;

    float FullMapHeight = UVMapPos.getTexture().getHeight();
    float FullMapWidth  = UVMapPos.getTexture().getWidth();
    float NewMapWidth = UVMapPos.getRegionWidth();
    float NewMapHeight = UVMapPos.getRegionHeight();

    float FullMapUPercent;
    float FullMapVPercent;

    for (int i = 0; i < TimesToLoop; i++) 
    {   
        previousU = (vertices[(i * floatsPerVertex) + 3]);
        previousV = (vertices[(i * floatsPerVertex) + 4]);
        FullMapUPercent = previousU / FullMapWidth;
        FullMapVPercent = previousV / FullMapHeight;
        vertices[(i * floatsPerVertex) + 3] = (NewMapWidth * FullMapUPercent) + UVMapPos.getU(); //New U
        vertices[(i * floatsPerVertex) + 4] = (NewMapHeight * FullMapVPercent) + UVMapPos.getV();//New V
    }

    ObjectMesh.setVertices(vertices);
    ObjectMesh.setIndices(SourceIndices);

    return ObjectMesh;
}


文章来源: Texture from texturepacker in LibGDX