Android SDK + OpenGL

  • 4 Antworten
  • Letztes Antwortdatum
J

Jina

Neues Mitglied
0
Hallo liebe Freunde :)

Ich arbeite mit folgenden Entwicklungstools unter Ubuntu:

Eclipse ( spezielle Version für Android )
Android SDK

Ich habe Eclipse erfolgreich für die Entwicklung von Android Apps einrichten können. Einfache Beispiele konnte ich erstellen. Die Einbindung von OpenGL ging reibungslos.

Jetzt mein Problem:
Wenn ich jetzt externe Geometriedaten (z.B. obj ) laden möchte und anzeigen, dann funktioniert das nicht richtig. Ich benutze einen Input Stream und den Assert Manager. Es kommt immer ein Fehler, dass die Geometrie schon definiert wurde. Beispiel Sample Code kommt noch!

Vielleicht gibt es ja einen Android Game Engine, die einfach zu benutzen wäre. Das Laden von externen Geometrien sollte auch möglich sein. Ein Tutorial wäre auch gut. Hilfe wäre sehr nett:)

Der ursprüngliche Beitrag von 06:12 Uhr wurde um 06:39 Uhr ergänzt:

Hallo, hier etwas Code. Ist nicht meiner!

Code:
public class MeshLoader 
{

    /**
     * Loads a mesh from the given InputStream
     * @param file The file
     * @return The mesh
     */
    public static Mesh loadObj( GL10 gl, InputStream in )
    {
        String line = "";
        
        try
        {
            BufferedReader reader = new BufferedReader( new InputStreamReader(in) );
            StringBuffer b = new StringBuffer();
            String l = reader.readLine();
            while( l != null )
            {
                b.append( l );
                b.append( "\n" );
                l = reader.readLine();
            }
            
            line = b.toString();
            reader.close();
        }
        catch( Exception ex )
        {
            throw new RuntimeException( "couldn't load file mesh from input stream" );
        }
        return loadObjFromString( gl, line );
    }
    
    /**
     * Loads a mesh from the given string in obj format
     * 
     * @param obj The string
     * @return The Mesh
     */
    public static Mesh loadObjFromString( GL10 gl, String obj )
    {
        String[] lines = obj.split( "\n" );
        float[] vertices = new float[lines.length * 3];
        float[] normals = new float[lines.length * 3];
        float[] uv = new float[lines.length * 3];
        
        int numVertices = 0;
        int numNormals = 0;
        int numUV = 0;
        int numFaces = 0;
        
        int[] facesVerts = new int[lines.length * 3];
        int[] facesNormals = new int[lines.length * 3];
        int[] facesUV = new int[lines.length * 3];
        int vertexIndex = 0;
        int normalIndex = 0;
        int uvIndex = 0;
        int faceIndex = 0;        
        
        for( int i = 0; i < lines.length; i++ )
        {
            String line = lines[i];            
            if( line.startsWith( "v " ) )
            {
                String[] tokens = line.split( " " );
                vertices[vertexIndex] = Float.parseFloat(tokens[1]);
                vertices[vertexIndex+1] = Float.parseFloat(tokens[2]);
                vertices[vertexIndex+2] = Float.parseFloat(tokens[3]);
                vertexIndex += 3;
                numVertices++;
                continue;
            }
                
            if( line.startsWith( "vn " ) )
            {
                String[] tokens = line.split( " " );
                normals[normalIndex] = Float.parseFloat(tokens[1]);
                normals[normalIndex+1] = Float.parseFloat(tokens[2]);
                normals[normalIndex+2] = Float.parseFloat(tokens[3]);
                normalIndex += 3;
                numNormals++;
                continue;
            }
            
            if( line.startsWith( "vt" ) )
            {
                String[] tokens = line.split( " " );
                uv[uvIndex] = Float.parseFloat(tokens[1]);
                uv[uvIndex+1] = Float.parseFloat(tokens[2]);                
                uvIndex += 2;
                numUV++;
                continue;
            }
            
            if( line.startsWith( "f " ) )
            {
                String[] tokens = line.split( " " );
                
                String[] parts = tokens[1].split("/");
                facesVerts[faceIndex] = getIndex(parts[0], numVertices);
                facesNormals[faceIndex] = getIndex(parts[2], numNormals);
                facesUV[faceIndex] = getIndex(parts[1], numUV);
                faceIndex++;
                
                parts = tokens[2].split("/");
                facesVerts[faceIndex] = getIndex(parts[0], numVertices);
                facesNormals[faceIndex] = getIndex(parts[2], numNormals);
                facesUV[faceIndex] = getIndex(parts[1], numUV);
                faceIndex++;
                
                parts = tokens[3].split("/");
                facesVerts[faceIndex] = getIndex(parts[0], numVertices);
                facesNormals[faceIndex] = getIndex(parts[2], numNormals);                
                facesUV[faceIndex] = getIndex(parts[1], numUV);
                faceIndex++;    
                numFaces++;
                continue;
            }
        }
        
        Mesh mesh = new Mesh(gl, numFaces * 3, false ,numUV > 0, numNormals > 0  );
        
        for( int i = 0; i < numFaces*3; i++ )
        {
            if( numNormals > 0 )
            {
                int normalIdx = facesNormals[i] * 3;
                mesh.normal( normals[normalIdx], normals[normalIdx+1], normals[normalIdx+2] );
            }
            if( numUV > 0 )
            {
                int uvIdx = facesUV[i] * 2;
                mesh.texCoord( uv[uvIdx], uv[uvIdx+1]);
            }
            
            int vertexIdx = facesVerts[i] *3;            
            mesh.vertex( vertices[vertexIdx], vertices[vertexIdx+1], vertices[vertexIdx+2] );
        }
        
        return mesh;
    }    
    
    private static int getIndex( String index, int size )
    {
        if( index == null || index.length() == 0 )
            return 0;
        int idx = Integer.parseInt( index );
        if( idx < 0 )
            return size + idx;
        else
            return idx - 1;
    }
}
Das gibt er mir als Fehler aus!

Code:
[2013-05-06 06:33:05 - MyTest] res/drawable-hdpi/ship.obj:0: error: Resource entry ship is already defined.
[2013-05-06 06:33:05 - MyTest] res/drawable-hdpi/ship.mtl:0: Originally defined here.
[2013-05-06 06:33:05 - MyTest] res/drawable-hdpi/ship.png:0: error: Resource entry ship is already defined.
[2013-05-06 06:33:05 - MyTest] res/drawable-hdpi/ship.mtl:0: Originally defined here.
Die Geometrie und die Textur befinden sich unter dem Ordner : drawable-hdpi.
Muss ich vielleicht eine Ordner /raw erzeugen, damit es klappt!

Gruss:)
 
Jina schrieb:
Vielleicht gibt es ja einen Android Game Engine, die einfach zu benutzen wäre. Das Laden von externen Geometrien sollte auch möglich sein. Ein Tutorial wäre auch gut. Hilfe wäre sehr nett:)


LibGDX und jMonkey sind 2 sehr nette Engines die 3D/2D können und eine lebhafte Community haben.

LibGDX ist ein Deutsches Produkt wo sich der Support aber hauptsächlich in englisch abspielt, updates kommen regelmässig aber brauchen sehr lange, ich habe langsam den eindruck das LibGDX eine "One man show ist". Benutze es aber sehr gerne.

jMonkey ist gerade in der Version 3 (jMonkey Engine 3). jMonkey ist aber eine Vollwertige Spiele engine!

Beide Frameworks sind einsteiger freundlich und es gibt viele Tutorials im Netz.
 
Hi,

die .obj und .mtl Dateien gehören in den raw Ordner, die drawable Ordner sind für Bild Dateien, das löst aber nicht dein Problem.

Die Ressourcen werden in deinem Projekt mit integer werten indexiert (automatisch verwaltete mit negativen Zahlen, selbst verwaltete Ressourcen mit positiven Zahlen). Automatisch verwaltete Ressourcen bekommen auch automatisch eine id zugeteilt (Einen Namen unter dem du im Code auf das Objekt zugreifen kannst, z. B. mit findViewById(ship) ). Die id entspricht dem Datei Namen ohne die Datei Endung. Genau da scheint dein Problem zu liegen:

Die Material Datei ship.mtl ist in deinem Projekt mit der id "ship" versehen, nun versucht die Ressourcen Verwaltung eine .obj Datei zu importieren die, weil sie ship.obj heißt, von der automatischen Ressourcen Verwaltung mit der id "ship" versehen werden soll. Das klappt natürlich nicht weil die id "ship" bereits an die Material Datei vergeben ist. Das selbe Problem wiederholt sich mit der Datei ship.png.

Entweder du nennst die Dateien um (obj_ship.obj, mtl_ship.mtl, png_ship.png) oder du verwendest den assets Ordner, dann werden die Dateien nicht automatisch als Ressourcen in dein Projekt eingebunden. In dem Fall kannst du über den Asset-Manager auf deine Dateien zugreifen.

Gruß

NilsV
 
Zuletzt bearbeitet:
Hallo!

Ok, vielen Dank für die kompetente Unterstützung!:thumbsup:

Ich werde die Dateinamen mal anpassen. Die Engines werde ich mir auch mal ansehen.

Grüße :biggrin:
 
Hallo!

Ich habe die Dateinamen geändert und diese in den Assert Ordner gelegt. Es wird jetzt zwar kein Fehler mehr angezeigt, aber wenn ich die Anwendung auf dem Emulator (Nexus) starte, dann wird diese gestoppt!

Liegt das vielleicht an dem Emulator?

Grüsse
 

Ähnliche Themen

M
Antworten
21
Aufrufe
1.414
swa00
swa00
Mr-Fisch
Antworten
5
Aufrufe
1.005
migi01
migi01
Mr-Fisch
Antworten
8
Aufrufe
1.032
Mr-Fisch
Mr-Fisch
M
Antworten
9
Aufrufe
839
mkuz24
M
A
Antworten
5
Aufrufe
710
swa00
swa00
Zurück
Oben Unten