www.jpct.net

General => German corner => Topic started by: Max on March 02, 2005, 02:17:39 pm

Title: Einfaches Beispiel?
Post by: Max on March 02, 2005, 02:17:39 pm
Ich will ein Objekt dynamisch erzeugen (eine art band), ohne textur, shading etc. einfach nur blaues objekt auf weissem hintergund... wenn ich mir jetzt die beispiele anschaue, die ja weitaus komplizierteres machen versth ich jetzt nicht soo viel... gibt's keine simpleren beispiele...?

vor allem fuer applets... ich hab bis jetzt noch kein beispiel dafuer gesehen.
Title: Einfaches Beispiel?
Post by: EgonOlsen on March 02, 2005, 11:19:41 pm
Für Applets ist es nicht anders, als für Applikationen, wenn man von den naturgegebenen Unterschieden einmal absieht. Es gab mal ein Applet-Beispiel, aber in 0.97 ist es rausgeflogen. Die Version 0.96 mit dem Beispiel gibt es noch hier drin: http://www.jpct.net/download/
Aber nimm davon nur das Beispiel, nicht die API selber..0.96 ist uralt. Ob das Beispiel noch mit 1.05 compiliert weiß ich nicht genau, aber wenn nicht, dann sollte nicht viel zu ändern sein.
Um ein einfaches Object zu erzeugen, musst du einfach ein Object3D mit der gewünschten Polygonanzahl erzeugen und mit addTriangle(...) deine Dreiecke hinzufügen. Hier ein Beispiel für einen Ring:

Code: [Select]
private static Object3D buildRing(float maxSize, float minSize, float texSize) {
      final float rot=2*0.19634954084936207740391521145497f;

      Object3D obj=new Object3D(16*2);
      float div=Math.abs(maxSize)*2;

      SimpleVector s1=new SimpleVector(-maxSize, 0, 0);
      SimpleVector s2=new SimpleVector(-minSize, 0, 0);
      SimpleVector st=new SimpleVector(-texSize, 0, 0);
      SimpleVector e1=null;
      SimpleVector e2=null;
      SimpleVector et=null;

      int i=0;
      while (i<16) {
         i++;
         e1=new SimpleVector(s1);
         e2=new SimpleVector(s2);
         et=new SimpleVector(st);

         e1.rotateY(rot);
         e2.rotateY(rot);
         et.rotateY(rot);

         if (i==16) {
            e1=new SimpleVector(-maxSize, 0, 0);
            e2=new SimpleVector(-minSize, 0, 0);
            et=new SimpleVector(-texSize, 0, 0);
         }

         float us1=s1.x/div+0.5f;
         float vs1=s1.z/div+0.5f;
         float us2=st.x/div+0.5f;
         float vs2=st.z/div+0.5f;

         float ue1=e1.x/div+0.5f;
         float ve1=e1.z/div+0.5f;
         float ue2=et.x/div+0.5f;
         float ve2=et.z/div+0.5f;

         obj.addTriangle(s1, us1, vs1, e1, ue1, ve1, s2, us2, vs2);
         obj.addTriangle(e1, ue1, ve1, e2, ue2, ve2, s2, us2, vs2);

         s1=e1;
         s2=e2;
         st=et;
      }
      return obj;
   }


Für ein Band ist es noch eine ganze Ecke einfacher.
Title: Einfaches Beispiel?
Post by: Max on March 03, 2005, 10:41:04 pm
Vielen Dank, werd's mir morgen anschauen, wenn ich wieder Zeit hab;-)
Title: Re: Einfaches Beispiel?
Post by: Empire on March 12, 2011, 11:47:42 am
Ich hab das Bsp getestet und bei mir kam das raus:
Code: [Select]
Loading Texture...box.jpg
[ Sat Mar 12 11:44:24 CET 2011 ] - ERROR: File 'box.jpg' not found - replacement texture used instead!
Java version is: 1.6.0_24
-> support for BufferedImage
Version helper for 1.5+ initialized!
-> using BufferedImage
Software renderer (OpenGL mode) initialized
Using LWJGL's AWTGLCanvas
Exception in thread "main" java.lang.NoClassDefFoundError: org/lwjgl/opengl/AWTGLCanvas
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.threed.jpct.AWTGLRenderer.init(Unknown Source)
at com.threed.jpct.FrameBuffer.enableRenderer(Unknown Source)
at com.threed.jpct.FrameBuffer.enableGLCanvasRenderer(Unknown Source)
at klassen.HelloWorldAWTGL.loop(HelloWorldAWTGL.java:47)
at klassen.HelloWorldAWTGL.main(HelloWorldAWTGL.java:20)
Caused by: java.lang.ClassNotFoundException: org.lwjgl.opengl.AWTGLCanvas
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 17 more

Was hab ich jetzt schon wieder verbockt?

mfg
Empire
Title: Re: Einfaches Beispiel?
Post by: EgonOlsen on March 12, 2011, 08:43:33 pm
Du hast vergessen, die jars von lwjgl einzubinden. Zusätzlich musst du auch noch die nativen Teile davon, also dlls für Windows, sos für Linux...einbinden. Wie das geht, steht so grob auch im Wiki. Sollte sich hier im Forum aber auch irgendwo finden lassen.
Title: Re: Einfaches Beispiel?
Post by: Empire on March 12, 2011, 09:12:18 pm
DANKE DU BIST GENIAL!!!!
(Am einbinden bin ich bei C/C++ gescheitert^^)

mfg
Empire

PS: Sag mal wackelt das Teil leicht hin und her, oder
warum werd ich Seekrank?
Title: Re: Einfaches Beispiel?
Post by: EgonOlsen on March 12, 2011, 10:09:38 pm
Nee, wackelt nicht. Liegt vielleicht an den Texturen, die sind nicht fest drauf gepappt, sondern werden als Envirionment Map gerendert.
Title: Re: Einfaches Beispiel?
Post by: Empire on March 12, 2011, 10:12:54 pm
Kann ich eigendlich auch einfach eine farbe staat einem Image
als Textur angeben? zb für ein Dreieck.

mfg
Empire

EDIT:
Ich glaub ich hab da schaon was gelesen ich find es blos nicht mehr
Title: Re: Einfaches Beispiel?
Post by: EgonOlsen on March 12, 2011, 10:25:33 pm
Du kannst einfach eine einfarbige Textur erzeugen. Dazu gibt entsprechende Konstruktoren für Texture.
Title: Re: Einfaches Beispiel?
Post by: Empire on March 12, 2011, 10:38:27 pm
Muss ich mir in Paint ein rotes Image erstelen oder gibt es eine
Funktion der ich sagen kann zB: 125 125 255 bzw 7D7DFF?

EDIT: Das ist ja ne hässlich Farbe^^
Title: Re: Einfaches Beispiel?
Post by: EgonOlsen on March 12, 2011, 11:03:37 pm
 ??? Habe ich doch oben beschrieben. Du nimmst das hier: http://www.jpct.net/doc/com/threed/jpct/Texture.html#Texture(int, int, java.awt.Color) (http://www.jpct.net/doc/com/threed/jpct/Texture.html#Texture(int, int, java.awt.Color))
Title: Re: Einfaches Beispiel?
Post by: Empire on March 13, 2011, 09:32:57 am
Sorry völlig verpeilt. Ich hab Konstruckte als
Programme gelesen und war etwas verwirrt.
 :-[
Title: Re: Einfaches Beispiel?
Post by: Empire on March 13, 2011, 01:38:34 pm
Ich hab jetzt etwas mit dem Bsp rumgespielt und bin auf ein paar
Probleme gestosen:
1. Wenn ich versuch dem 3DObjekt ein Dreieck zu zufügen bevor
   der Würfel erstellt wird stürzt das Prog ab.
2. Wenn ich mehr wie ein Dreieck zu einem 3DObjekt dazufüge
   stürzt das prog ab.

Kann mir das jemand erklären?

mfg
Empire
Title: Re: Einfaches Beispiel?
Post by: EgonOlsen on March 13, 2011, 05:52:21 pm
Stacktrace? Fehlermeldung?
Title: Re: Einfaches Beispiel?
Post by: Empire on March 14, 2011, 05:39:46 pm
Manchmal frag ich mich warum ich mir die mühe mache mein hirn
mit mir rumzuschleppen :(

Fehlermeldung zu 1.
Code: [Select]
Exception in thread "main" java.lang.NullPointerException
at klassen.MainKlasse.createJäger(MainKlasse.java:74)
at klassen.MainKlasse.<init>(MainKlasse.java:36)
at klassen.MainKlasse.main(MainKlasse.java:20)
Der Entsprechende Code(letzte Zeile ist Zeile 74)
Code: [Select]
SimpleVector vec1 = new SimpleVector(-1f, -1f, -7f);
SimpleVector vec2 = new SimpleVector(1f, -1f, -7f);
SimpleVector vec3 = new SimpleVector(-1f, 1f, -7f);
box.addTriangle(vec1, 0,0, vec2, 0,0, vec3, 0,0);

Fehlermeldung zu 2.
Code: [Select]
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 17
at com.threed.jpct.Object3D.addTriangle(Unknown Source)
at com.threed.jpct.Object3D.addTriangle(Unknown Source)
at com.threed.jpct.Object3D.addTriangle(Unknown Source)
at com.threed.jpct.Object3D.addTriangle(Unknown Source)
at com.threed.jpct.Object3D.addTriangle(Unknown Source)
at klassen.MainKlasse.createJäger(MainKlasse.java:79)
at klassen.MainKlasse.<init>(MainKlasse.java:36)
at klassen.MainKlasse.main(MainKlasse.java:20)
und der Code(unterste Zeile ist die Zeile 79)
Code: [Select]
vec1 = new SimpleVector(-1f, -3f, -5f);
vec2 = new SimpleVector(-1f, -1f, -5f);
vec3 = new SimpleVector(-3f, -1f, -5f);
box.addTriangle(vec1, 0,0, vec2, 0,0, vec3, 0,0);

mfg
Empire
Title: Re: Einfaches Beispiel?
Post by: EgonOlsen on March 14, 2011, 08:21:32 pm
Das erste Problem muss bei dir liegen. Da kann nur box null sein.

Das zweite liegt daran, dass du nicht beliebig Dreiecke zu Objekten hinzufügen kannst. Die Konstruktoren von Object3D erfordern (sofern sie nicht ein anderes Object3D haben wollen) die Angabe der maximalen Anzahl Dreiecke. Mehr als das kannst du dann auch nicht ergänzen. Die Objekte die von Primitives kommen, sind bereits so gebaut, dass da nichts mehr ergänzt werden kann. Wenn du wirklich mit addTriangle arbeiten willst (der übliche Weg ist eher das Laden von fertigen Objekten, die in einem 3D-Editor erzeugt werden), dann solltest du dir besser ein eigenes, leeres Object3D mit new Object3D(<Dreieckanzahl>); erzeugen und dazu Dreiecke adden.
Ich gebe zu, dass die Fehlermeldung ziemlich unschön ist...es sollte besser irgend "Objekt ist schon voll" oder so heißen statt einfach mit ArrayIndexOutOfBoundsException auszusteigen...
Title: Re: Einfaches Beispiel?
Post by: Empire on March 15, 2011, 10:33:25 am
Quote
Da kann nur box null sein.
Meinst du damit das es noch nicht inizjalisiert wurde?
Wenn ja, vor
Code: [Select]
box = Primitives.getBox(1f, 2f);wird sie es ja auch nicht und da funktioniert es.
Oder muss man das Objekt bei addTriangle()
irgend wie vorbereiten?

Danke werde es ausprobieren.
Warum ich mit addTriangle() arbeite hat einen
einfachen Grund. Ich kann zwar recht gut programmieren,
und neue Programiersprachen schnell lernen, aber
dafür bin ich was Künstlerisches angeht absolut unbegabt.
Zeichenen kann ich blos mit Bleistift und Geodreieck(dafür
kann man meinen Zeichnung als Blaupausen verwenden^^).
Als ich mit C ein 3D Spiel schreiben wollte hab ich die Welt
auf Karopapier gemalt und da die Koordinaten per Hand in
den Code übertragen.
Diesesmal schreib ich mir meinen eigenen Editor aber ich
kann die Koordinaten nur in einem Textfile speichern.
Deshalb muss ich das mit addTriangle() machen.

mfg
Empire

//EDIT:
Kann es sein das nicht nur die zwei Koordinaten-Achsen verdreht sind,
sondern auch die Sichtbarkeit bei Eckpunkten im und gegen den Uhrzeigersinn
verdreht ist?
Title: Re: Einfaches Beispiel?
Post by: EgonOlsen on March 15, 2011, 08:43:23 pm
Naja, irgendwo musst du box doch mal was zuweisen? Ich sehe das zumindest in deinem Codeschnippsel nirgends... ???

Die Koordinateachsen sind nicht "verdreht". Sie mögen ungewöhnlich gewählt sein, aber man kann ein Koordinatensystem definieren wie man will. Es gibt kein richtig oder falsch. Die Frage mit dem Culling verstehe ich nicht. Es ist so, wie es in jPCT eben ist. Wenn es für dein Objekt nicht passt, dreh es einfach um:
Code: [Select]
Object3D.invertCulling(true);
Title: Re: Einfaches Beispiel?
Post by: Empire on March 15, 2011, 09:06:20 pm
Ok jetzt Funktioniert alles danke.

Ja das Achsenkreuz kann man definieren wie man will.
Ich wollte nur sagen das es ungewöhnlich ist(nicht wertend gemeint).
Und beim Culling meinte ich das so das ich bis jetzt es immer so gelesen
habe das ein Dreieck sichtbar ist wenn die Punkte im Uhrzeiger sind sind.
Und ich meinte auch, dass verkehrtherum nicht wertend.
Ich wollte blos wiesen ob es bei jPCT anderst herum ist oder ob ich einen
Fehler gemacht habe.

mfg
Empire

PS: Die Engiene ist echt genieal. großes Lob an alle beteiligten.