Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 22:51

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Modelloader Java
BeitragVerfasst: Sa Sep 12, 2009 11:53 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Hi, ich beschäftige mich grad etwas mit der Thematik und habe ein wenig herumgesucht, aber bisher keinen wirklcihen Loader gefunden. In der JMonkey ist einer drin und den werd ich mir auch nochmal ansehen, aber einen seperaten Loader, den ich implementieren könnte, habe ich bisher noch nicht wirklich gefunden. Formate... ich werd wohl 3d studios und blender nutzen.

Habt ihr da irgendwelche Ideen, was man nehmen kann?
Ansonsten würd ich mich wohl auhc mal dran machen und soetwas selbst versuchen.

Ich beschäftige mich zwar schon eine weile mit ogl aber modelling ist für mich ziemlihces neuland, deswegen musste ich überhaupt erstmal versuchen durch die Begrifflichkeiten zu blicken. Zum Mesh bietet unser Wiki ja eine gute erklärung, aber zu face hab ich nichts gefunden. Soweit ich verstanden habe, ist ein Face "größentechnisch" betrachtet kleiner als ein Mesh. Face hört sich sehr nach einer Oberfläche an, aber das Mesh selbst ist ja schon die ganze Oberfläche. Ist ein Face nun nur ein Dreieck?

Gibt es zum Schreiben eines solchen loaders auch tutorials? hab da auch sdchon gesucht, aber bisher nur c++ gefunden und ich kann c++ nur so schlecht lesen, dass das kaum etwas wird. Ich werd mir hier die dglloader auch nochmal ansehen und evtl versuchen sie auf java zu portieren..
Danke schonmal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 12:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Ist ein Face nun nur ein Dreieck?

Ein Face ist ein einzelnes Polygon. Meistens benutzt man Dreiecke, aber es werden hin und wieder auch Quads (4 Eckpunkte) oder auch Polygone mit mehr Eckpunkten verwendet.

Zum Modelloader kann ich leider nichts beitragen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 14:06 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ah okay also war ich doch nicht sooo falsch

Da ja sowieso an jeder Ecke angeraten wird, alle Modelle in Triangles aufzuteilen, um die Tesselierung auszusparen, sind also faces im besten fall Triangles und ansonsten irgendeine andere Primitive (?)

Dann hab ich das soweit ;)

Hab mir auch eben die Nehetuts nochma angesehen
Mit dem tut auf der Website und den Portierungen kann man es sich verdeutlichen, wie alles funktioniert.
Wobei in der Portierung eine Klasse LittleEndianDataInputStream dabei ist, die sich offenbar auf bit- und byteebene mit dem Dateneinlesen beschäftigt. Das ist leider überhaupt nicht dokumentiert, ich nehme mal an, um diese Klasse und ihre Aufrufe innerhalb des Loadings nachvollziehen zu können, muss ich dazu noch den Aufbau des Milkshapeformats zur Hand nehmen...
(ich häng den Code mal an)
Code:
  1.  
  2. import java.io.*;
  3.  
  4. public class LittleEndianDataInputStream extends FilterInputStream implements DataInput {
  5.     private DataInputStream dataInputStream;
  6.     private int byteCount;
  7.  
  8.     public LittleEndianDataInputStream(InputStream inputStream) {
  9.         super(inputStream);
  10.         dataInputStream = new DataInputStream(inputStream);
  11.     }
  12.  
  13.     public int getByteCount() {
  14.         return byteCount;
  15.     }
  16.  
  17.     public int read() throws IOException {
  18.         byteCount++;
  19.         return super.read();
  20.     }
  21.  
  22.     private int readCheckEOF() throws IOException {
  23.         int byteRead = read();
  24.         if (byteRead == -1)
  25.             throw new EOFException();
  26.         return byteRead;
  27.     }
  28.  
  29.     public int readUnsignedByte() throws IOException {
  30.         return (readCheckEOF() & 0xFF);
  31.     }
  32.  
  33.     public short readShort() throws IOException {
  34.         int byte1 = (read() & 0xFF);
  35.         int byte2 = (read() & 0xFF) << 8;
  36.         return ((short) (byte1 | byte2));
  37.     }
  38.  
  39.     public int readUnsignedShort() throws IOException {
  40.         int byte1 = (read() & 0xFF);
  41.         int byte2 = (read() & 0xFF) << 8;
  42.         return (byte1 | byte2);
  43.     }
  44.  
  45.     public int readInt() throws IOException {
  46.         return (readCheckEOF() & 0xFF) |
  47.                 (readCheckEOF() & 0xFF) << 8 |
  48.                 (readCheckEOF() & 0xFF) << 16 |
  49.                 (readCheckEOF() & 0xFF) << 24;
  50.     }
  51.  
  52.     public float readFloat() throws IOException {
  53.         return Float.intBitsToFloat(readInt());
  54.     }
  55.  
  56.     public long readLong() throws IOException {
  57.         return (
  58.                 ((long) (readCheckEOF() & 0xff)) |
  59.                 ((long) (readCheckEOF() & 0xff) << <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) --> |
  60.                ((long) (readCheckEOF() & 0xff) << 16) |
  61.                ((long) (readCheckEOF() & 0xff) << 24) |
  62.                ((long) (readCheckEOF() & 0xff) << 32) |
  63.                ((long) (readCheckEOF() & 0xff) << 40) |
  64.                ((long) (readCheckEOF() & 0xff) << 48) |
  65.                ((long) (readCheckEOF() & 0xff) << 56)
  66.                );
  67.    }
  68.  
  69.    public double readDouble() throws IOException {
  70.        return Double.longBitsToDouble(readLong());
  71.    }
  72.  
  73.    public void readFully(byte[] b) throws IOException {
  74.        readFully(b, 0, b.length);
  75.    }
  76.  
  77.    public void readFully(byte[] b, int off, int len) throws IOException {
  78.        while (len > 0) {
  79.            int bytesRead = read(b, off, len);
  80.            if (bytesRead == -1) {
  81.                throw new EOFException("Unexpected end of file");
  82.            } else {
  83.                len -= bytesRead;
  84.                off += bytesRead;
  85.            }
  86.        }
  87.    }
  88.  
  89.    public int skipBytes(int n) throws IOException {
  90.        int bytesRead = 0;
  91.        while (bytesRead < n) {
  92.            int read = read();
  93.            if (read == -1) {
  94.                break;
  95.            } else {
  96.                bytesRead++;
  97.            }
  98.        }
  99.        return bytesRead;
  100.    }
  101.  
  102.    public boolean readBoolean() throws IOException {
  103.        return readInt() != 0;
  104.    }
  105.  
  106.    public byte readByte() throws IOException {
  107.        return (byte) readCheckEOF();
  108.    }
  109.  
  110.    public char readChar() throws IOException {
  111.        return (char) ((readCheckEOF() << <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) --> | (readCheckEOF() & 0xff));
  112.    }
  113.  
  114.    public String readLine() throws IOException {
  115.        return dataInputStream.readLine();
  116.    }
  117.  
  118.    public String readUTF() throws IOException {
  119.        return dataInputStream.readUTF();
  120.    }
  121.  
  122.    public synchronized void mark(int readlimit) {
  123.    }
  124.  
  125.    public boolean markSupported() {
  126.        return false;
  127.    }
  128.  
  129.    public synchronized void reset() throws IOException {
  130.        throw new IOException();
  131.    }
  132. }
  133.  


Mal von der Klasse abgesehen, die für mich gerade noch etwas sehr kryptisch anmutet, hab ich den Aufbau der Modelle und das Loadingverfahren verstanden ^^ Ich hatte eigentlich erwartet, dass ganze etwas mehr Voodoo beinhaltet, aber eigentlich ist alles sehr verständlich


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 23:46 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Nachdem der Import dank der Nehetuts für die Milkshape files geht, hab ich mir gedahct, ich nehme mal noch das 3ds format, um ein weitgehend wichtiges format abzudecken. Dazu hab ich auch eine nette erklärung gefunden:
http://www.spacesimulator.net/tut4_3dsloader.html

und die 3ds Spezifikationen:
http://www.jalix.org/ressources/graphic ... s-info.txt

Allerdings wühlt man da ziemlich viel in den Bytes herum und die Byteoperationen sind nicht mein Steckenpferd...
Ich habe mal die oben gepostete Datei zum Einlesen der Typen genommen, aber ich bekomme bei verschiedenen modellen immer (meiner Meinung nach) falsche Angaben für die Verticeanzahl zb

Code:
  1.         short header;
  2.         int length;
  3.         short quantity;
  4.         for (; (header = dis.readShort()) != -1;)
  5.         {
  6.             length=dis.read(); 
  7.             System.out.println("laden..");
  8.             switch (header)
  9.             {
  10.                 case VERSION_3DS: {System.out.println("VERSION_3DS");}
  11.                 case MAIN_CHUNK: {System.out.println("MAIN_CHUNK");}
  12.                 case EDITOR_3D_CHUNK: {System.out.println("EDITOR_3D_CHUNK");}
  13.                 case OBJECT_BLOCK:
  14.                 {System.out.println("OBJECT_BLOCK");
  15.                     char charBuffer=0;
  16.                     String str="";
  17.                     int i=0;
  18.                     do
  19.                     {
  20.                         charBuffer=dis.readChar();
  21.                         str+=charBuffer;
  22.                         System.out.println(charBuffer);
  23.                        i++;
  24.                     }while(charBuffer != '\0' && i<20);
  25.        
  26.  
  27.                     //System.out.println(">>>"+str);
  28.                 }  
  29.                 case TRIANGULAR_MESH: {System.out.println("TRIANGULAR_MESH");}
  30.                 case VERTICES_LIST: {
  31.                     System.out.println("VERTICES_LIST");
  32.                    
  33.                     quantity = dis.readShort();
  34.  
  35.                     System.out.println("Number: "+quantity);
  36.                     for (int i=0; i<quantity; i++)
  37.                     {
  38.                         System.out.println(i+": "+dis.readFloat()+" "+dis.readFloat()+" "+dis.readFloat());
  39.                     }                  
  40.                 }
  41.  


bei diesem Beispiel wird mir zb 512 angezeigt als Verticeanzahl, wobei das als potenz von 2 angesehen, gar nicht so falsch ist. Das beispiel, das diese Zahl erzeugt ist eine Plane aus Blender. Auch Namen werden mir nie ausgegeben... irgendwie steh ich ziemlich im Wald und Tutorials zum Javaapproach gibt es auch 0...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 14, 2009 09:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Hätte hier noch einen alten und eher experimentellen OBJ Loader im Angebot. Hab den mal angehängt. Vielleicht hilft dir das bei deiner Problematik. Ist zwar nicht perfekt, da ich den damals auch nur aus meinem damaligen Design-Kenntnisstand zusammengewürfelt hab, aber er lief zumindest mit den von Maya 7 erstellen OBJ Dateien ^^

Das Teil nutzt LWJGL und die Standard Java IO.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 17 Queries | GZIP : On ]