Question

J'ai vérifié pour un chargeur Libgdx Hauteur et trouvé un , mais je ne suis pas tout à fait sûr de savoir comment fonctionne le code BuildinDices ().Je ne sais pas non plus pourquoi il génère uniquement un morceau de hauteur de hauteur de 128 * x * 128, tout ce qui est de plus grand que 128 (par exemple, 1024) rend le chargeur, comme ceci:

1024 morceau 1024 morceau

Comme vous pouvez le constater, les montagnes ont des trous et la forme du morceau rendu comme un maillage de 128 * 1024

128 morceau 128 morceau

parfaitement ok avec le 128 * 128 morceau

Voici mon code:

package com.amzoft.game.utils;

import java.util.Arrays;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Pixmap;

public class HeightmapConverter {

    public int mapWidth, mapHeight;
    private float[] heightMap;
    public float[] vertices;
    public short[] indices;
    private int strength;
    private String heightmapFile;
    private float textureWidth;

    public HeightmapConverter(int mapWidth, int mapHeight, int strength, String heightmapFile)
    {
        this.heightMap = new float[(mapWidth+1) * (mapHeight+1)];
        this.mapWidth = mapWidth;
        this.mapHeight = mapHeight;
        this.vertices = new float[heightMap.length*5];
        this.indices = new short[mapWidth * mapHeight * 6];
        this.strength = strength;
        this.heightmapFile = heightmapFile;

        loadHeightmap();
        createIndices();
        createVertices();
    }

    public void loadHeightmap()
    {
        try{
            FileHandle handle = Gdx.files.internal(heightmapFile);
            Pixmap heightmapImage = new Pixmap(handle);
            textureWidth = (float)heightmapImage.getWidth();
            Color color = new Color();
            int indexToIterate = 0;
            for(int y = 0;  y < mapHeight + 1; y++)
            {
                for(int x = 0; x < mapWidth + 1; x++)
                {
                    Color.rgba8888ToColor(color, heightmapImage.getPixel(x, y));
                    heightMap[indexToIterate++] = color.r;
                }
            }
            handle = null;
            heightmapImage.dispose();
            heightmapImage = null;
            color = null;
            indexToIterate = 0;
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public void createVertices() 
    {
        int heightPitch = mapHeight + 1;
        int widthPitch = mapWidth + 1;

        int idx = 0;
        int hIdx = 0;

        for(int z = 0; z < heightPitch; z++)
        {
            for(int x = 0; x < widthPitch; x++) 
            {
                vertices[idx+0] = x;
                vertices[idx+1] = heightMap[hIdx++] * strength;
                vertices[idx+2] = z;
                vertices[idx+3] = x/textureWidth;
                vertices[idx+4] = z/textureWidth;
                idx += 5;
            }
        }
    }

    public void createIndices() 
    {
        int idx = 0;
        short pitch = (short)(mapWidth + 1);
        short i1 = 0;
        short i2 = 1;
        short i3 = (short)(1 + pitch);
        short i4 = pitch;

        short row = 0;

        for(int z = 0; z < mapHeight; z++) 
        {
            for(int x = 0; x < mapWidth; x++) 
            {
                indices[idx++] = (short)(i1);
                indices[idx++] = (short)(i2);
                indices[idx++] = (short)(i3);

                indices[idx++] = (short)(i3);
                indices[idx++] = (short)(i4);
                indices[idx++] = (short)(i1);

                i1++;
                i2++;
                i3++;
                i4++;
            }

            row += pitch;
            i1 = row;
            i2 = (short)(row + 1);
            i3 = (short)(i2 + pitch);
            i4 = (short)(row + pitch);
        }
    }

    public String getHeightmapFile()
    {
        return heightmapFile;
    }

}

Pourquoi ne pas travailler de plus grandes morceaux?Comment Catégorie () (appelée Buildindices () dans le code Libgdx) fonctionne?

Était-ce utile?

La solution

solution est ici: http://badlogicgames.com/forum/Vieftopic.php? f= 11 & t= 4918 # p23683

Java Short ne peut contenir que des valeurs [-32768 .. 32767] ce maillage de terrain utilisez plus de indices que cela.256 * 256 est trop (environ 65k) pour que vous soyez seulement voir une petite partie de la carte de hauteur.

Merci à Kalle_H pour la solution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top