试图让我周围的质感包装头部(该真棒)LibGDX框架,我需要帮助。
我要绑定的纹理(根据网格,颜色和纹理 ),其被从填充有TexturePacker一个TextureAtlas萃取。 纹理结合到矩形网格。
我想纹理(纹理的实例)基本上可以从压缩文件中提取。
它是可行使用的createsprite或findregion方法并以某种方式跳过文件句柄一步?
另外:任何合并与AssetManager上述方法时,特别应该记住?
谢谢整理我出去!
试图让我周围的质感包装头部(该真棒)LibGDX框架,我需要帮助。
我要绑定的纹理(根据网格,颜色和纹理 ),其被从填充有TexturePacker一个TextureAtlas萃取。 纹理结合到矩形网格。
我想纹理(纹理的实例)基本上可以从压缩文件中提取。
它是可行使用的createsprite或findregion方法并以某种方式跳过文件句柄一步?
另外:任何合并与AssetManager上述方法时,特别应该记住?
谢谢整理我出去!
首先,创建一个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,这个网格将有两个纹理每个顶点坐标(传统上,这两个纹理坐标被称为u
和v
)。 你可以有一大堆的每个顶点不同属性的,但我要承担的唯一的其他属性是三值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);
你可以计算出正确的u
和v
特定TextureRegion
使用getU
, getV
, getU2
和getV2
方法。 需要注意的是纹理坐标具有原点(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
支持具有限定精灵TextureRegion
和AssetManager
支持加载和查找TextureAtlas
作为第一级的元件。
得到它使用上面的解释工作。
我不能相信这么几个人都在运行问这个问题,因为它看起来像是其他人愿意这样做。
从接受的解决方案我创建了一个函数,也做数学的新的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;
}