4

(素晴らしい)LibGDXフレームワークのテクスチャラッパーに頭を悩ませようとしていますが、助けが必要です。

TexturePackerがパックされたTextureAtlasから抽出されたテクスチャ( Mesh、Color、Textureによる)をバインドしたいと思います。テクスチャは長方形のメッシュにバインドされています。

テクスチャ(Textureのインスタンス)は基本的にパックされたファイルから抽出したいです。

createspriteまたはfindregionメソッドを使用して、ファイルハンドルの手順をスキップすることはできますか?

さらに:上記の方法をAssetManagerと組み合わせる場合、特別な点に注意する必要がありますか?

私を整理してくれてありがとう!

4

2 に答える 2

10

TextureRegionを作成します

まず、TextureAtlasアトラスを説明するテキストファイルをポイントしてオブジェクトを作成します(アトラスを作成するツールは、画像とその内容を説明するテキストファイルの2つのファイルを作成します)。

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に、このメッシュが頂点ごとに2つのテクスチャ座標を持つことを通知します(従来、2つのテクスチャ座標はandと呼ばれuますv)。頂点ごとにさまざまな属性を設定できますが、他の属性はUsage.Positionx、y、z空間座標の3値のみであると想定します。

ここで、メッシュを定義するfloatの配列(渡す配列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を計算できます。テクスチャ座標は左上に原点(u1、v1)があり、y軸は「下」になっていることに注意してください(OpenGLの画面座標と空間座標は通常、左下に原点があり、y軸は「上")。少し複雑ですが、メッシュにマッピングするときにテクスチャを反転、ストレッチ、または歪ませることができるという点で非常に柔軟性があります。vTextureRegiongetUgetVgetU2getV2

テクスチャは大きく(たとえば512x512)、特定の領域はその小さなサブセット(たとえば、128x128で20x20)であるため、実際には、512x512画像全体の20x20サブセットのみを利用するメッシュテクスチャ座標を与えることになります。

テクスチャメッシュをレンダリングする

最後に、レンダリングするときは、画像をバインドし、レンダリングする前にテクスチャリングを有効にする必要があります。

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

これは本来よりもはるかに効率が悪いことに注意してください。テクスチャアトラスの利点の一部は、一緒にレンダリングできる多くの領域が含まれている必要があるため、1つのテクスチャをバインドするだけで、その1つのバインドされたテクスチャから多くの異なるテクスチャメッシュをレンダリングする必要があります。

SpriteBatchaで定義されたスプライトをTextureRegionサポートし、ファーストクラス要素としてのAssetManagerロードと検索をサポートします。TextureAtlas

于 2012-06-12T16:42:40.437 に答える
1

上記の説明を使用して動作するようになりました。

他の人がやりたいと思うようなことなので、この質問をしている人はほとんどいないと思います。

受け入れられたソリューションから、新しい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;
}
于 2013-06-30T12:46:34.977 に答える