# Java3D's next TopModel



## Developer_X (15. Mrz 2009)

Hi, ich hab da ein problem. Ich hab eine klasse, mit der man "obj" dateien laden kann, und der die punkte in der datei dann in die figur umwandelt, aber da habe ich ein problem. Wie kann ich über die figur dann eine Textur legen danke im Voraus für eure Hilfe, deVeloper_X

```
import java.io.*;
import java.net.*;

import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.loaders.*;
import com.sun.j3d.loaders.objectfile.*;



public class Model
{
  private static final String MODELS_DIR="F:/Models/";

  private static final double MAX_SIZE = 5.0;   
              // max size of model along any dimension

  private ObjectFile objFileloader;


  public Model()
  {  objFileloader = new ObjectFile(); } 


  public TransformGroup getModel(String fnm)
  {  return getModel(fnm, 0);  }


  public TransformGroup getModel(String fnm, double yMove)
  {
    BranchGroup modelBG = loadModel(fnm);
    if (modelBG == null)
      return null;

    double scaleFactor = getScaling(modelBG);

    Transform3D t3d = new Transform3D();
    t3d.setScale(scaleFactor);
    t3d.setTranslation( new Vector3d(0,yMove,0));

    TransformGroup tg = new TransformGroup(t3d);
    tg.addChild(modelBG); 
    return tg;
  }  


  private BranchGroup loadModel(String modelFnm)
  {
    String fnm = MODELS_DIR + modelFnm;
    System.out.println("Loading OBJ model from " + fnm);

    File file = new java.io.File(fnm);
    if (!file.exists()) {
      System.out.println("Could not find " + fnm);
      return null;
    }

    URL url = null;
    try {
      url = file.toURI().toURL();
    }
    catch(Exception e) {
      System.out.println(e);
      return null;
    }

    Scene scene = null;
    try {
      scene = objFileloader.load(url);
    }
	catch (FileNotFoundException e) {
	  System.out.println("Could not find " + fnm);
	  return null;
	}
	catch (ParsingErrorException e) {
	  System.out.println("Could not parse the contents of " + fnm);
	  System.out.println(e);
	  return null;
	}
	catch (IncorrectFormatException e) {
	  System.out.println("Incorrect format in " + fnm);
	  System.out.println(e);
	  return null;
	}

    if(scene != null)
      return scene.getSceneGroup();
    else
      return null;
  } 


  private double getScaling(BranchGroup modelBG)
  {
    double scaleFactor = 1.0;
    BoundingBox boundBox = new BoundingBox( modelBG.getBounds());

    Point3d lower = new Point3d();
    boundBox.getLower(lower);
    
    Point3d upper = new Point3d();
    boundBox.getUpper(upper);
  
    double maxDim = getMaxDimension(lower, upper);
    if (maxDim > MAX_SIZE) {
      scaleFactor = MAX_SIZE/maxDim;
      System.out.println("Applying scaling factor: " + scaleFactor);
    }

    return scaleFactor;
  } 


  private double getMaxDimension(Point3d lower, Point3d upper)
  {
    double max = 0;
    if ((upper.x - lower.x) > max) 
      max = upper.x - lower.x;
    if ((upper.y - lower.y) > max) 
      max = upper.y - lower.y;
    if ((upper.z - lower.z) > max) 
      max = upper.z - lower.z;
    return max;
  } 


public Scene load(String string) {
	// TODO Auto-generated method stub
	return null;
}

}
```


----------



## tuxedo (17. Mrz 2009)

Google kaputt?

Unter anderem geht's so:
Java 3D Tutorial für Anfänger

Ist jetzt aber kein copy&paste-->working Beispiel. Da muss man noch selbst hand anlegen. Sollte dich auf jeden Fall ermunten google mit weiteren Begriffen aus diesem Tutorial zu füttern.

- Alex


----------



## Developer_X (18. Mrz 2009)

oh man!
Natürlich habe ich eine Ahnung von Appearances!!!
Aber wie kann ich eine funktion in meinen Code einbauen, damit diese Punkte, die von einer ".obj" datei stammen, so gecolort werden, damit sie irgendeine Apperance besitzten.


----------



## Spacerat (18. Mrz 2009)

Unterstützt der WaveFront-Loader in Java3D etwa immer noch keine Meterialien? Das hätten die doch wenigstens schon mal ändern können...
Naja... Ich hab' mir damals zumindest einen eigenen schreiben müssen (eigentlich nur den vorhandenen "stibizt" und die fehlende Funktionalität hinzugefügt). Der Code existiert aber leider nicht mehr. Ich bin durch mit Java3D.
Alternativ kann man auch versuchen, das Modell in ein LightWave-Object umzuwandeln und dan eben den LW-Loader verwenden (soferns den noch gibt).


----------



## Developer_X (19. Mrz 2009)

sagt mir jetzt wenig, ich will nähmlich auf das objekt eine Apperance erzeugen, und habe keine Ahnung, wie ich das objekt das geladen wird, so machen kann, dass es eine Textur auf sich hat


----------



## Developer_X (21. Mrz 2009)

hat keiner eine idee, bitte?


----------



## Marco13 (21. Mrz 2009)

Erstmal müßte man wissen, ob das Ding (in der OBJ-Datei) überhaupt Texturkoordinaten HAT. Und wenn ja ... müßte man mal weitersehen (auswendig weiß ich das auch nicht, aber mehr als eine Websuche nach Tutorials und Beispielen für Texturen in Java3D zu starten, würde ich dann effektiv auch nicht machen...)


----------



## Developer_X (21. Mrz 2009)

enthält sie nicht!


----------



## Marco13 (21. Mrz 2009)

Tja. Und soll der Computer sich welche ausdenken?
for (int i=0; i<vetices; i++) object.setTexCoords(i, Math.random(), Math.random());


----------



## Developer_X (21. Mrz 2009)

wo soll ich die einsetzten, und wie verbinde ich das ganze mit einer Appearance, das wär mir echt ne große Hilfe, wenn dus mir am COde mit Kommentaren erklärst
!


----------



## Marco13 (21. Mrz 2009)

Bißchen viel verlangt  BTW: Die Diskrepanz zwischen der Frage: "Wie kann ich aus einem int einen String machen?" und "Wie kann ich mit Java3D ein aus einer OBJ-Datei geladenes Modell nachtröglich mit Texturkoordinaten versehen um die Textur als Appearance setzen zu können?" finde ich persönlich ... schon SEHR irritierend... Den Tipp, schrittweise vorzugehen, und erstmal zu versuchen (dir ein paar Monate oder Jahre lang die Grundlagen anzueignen und dann)  ein einzelnes Dreieck mit einer Textur zu versehen, um daraus (Er)kenntnisse zu gewinnen, die es dir erlauben, dich unter Zuhilfenahme von API-Doku, Büchern und Tutorials so weit in die Sache reinzufräsen, dass du es selbst hinkriegst, willst du jetzt aber vermutlich garnicht hören...


----------



## Spacerat (21. Mrz 2009)

Vllt. hilft's ja wenn ich meinen Tipp mal in Klartext fasse: Vergiss Java3D! Versuchs mit JOGL und fang mit den NeonHelium-Tutorials an. Vergiss dabei aber nicht, das der Tipp von Marco13, sich zunächst erstmal Grundlagen anzueignen definitiv VORRANG hat. Mir wär's peinlich ständig hier da und dort nach Grundlagen zu fragen und auf der anderen Seite zu behaupten "Ich kenne mich aus!". Ich zumindest stütze mich nicht auf Aussagen irgendwelcher User, sondern eher auf die Anzahl seiner Un- bzw. Selbstbeantworteten Themen... Wieviele kannst du vorweisen? Bei mir sind's zwei...


----------



## hdi (22. Mrz 2009)

Ja der Kerl ist einfach der Forums-Clown. Und immer mal wieder rafft sich jmd auf
und versucht ihm bisschen zu helfen. Also ich hab damit vor ~2 Wochen aufgehört,
nachdem ich ihm 7 mal den JavaInsel Link gegeben ud mir die Finger wund geschrieben
habe, um ihm zu erklären dass er das lesen sollte.

Er ist entweder dumm (sry), oder ein total naives Kind. Ich glaube ja zweiteres
trifft zu, er ist wohl einfach zu jung dafür, als dass er die Komplexität eines 3D-Spiels
verstehen könnte, bzw. einsieht dass es nun mal auch Arbeit ist, Programmieren zu lernen.

Wer zu faul ist, was zu lesen, hat dann halt verloren. Aber eins muss ich ihm lassen:
Es ist krass dass er nicht schon lange aufgegeben hat, aber irgendwo tut's mir Leid
weil er verschwendet wohl noch seine ganze Jugend an dieses bescheuerte Rayman
Projekt, bevor er es geknickt aufgeben muss...

@Developer

Ich hab grad was für dich gefunden, da du ja extrem lesefaul bist, vllt überwindest
du dich zumindest diese Videos anzukucken:

http://www.mobilinga.com/Java_Videos/

Und sag bitte nicht, dass du das schon alles kannst.


----------



## Marco13 (22. Mrz 2009)

@hdi: Im Prinzip gebe ich dir Recht. Allerdings wandert man in solchen Fällen auf dem schmalen Grat zwischen "Auf den Boden der Tatsachen zurückholen" und "Niedermachen" (was schon in der Meta-Semantik sehr ähnlich ist...)


----------



## hdi (22. Mrz 2009)

Ja mir ist bewusst dass ich (inzwischen) "derbe" daherrede wenn es um ihn geht.
Aber du kannst dir ja mal den Spass machen und seine Threads durchsuchen, dann
mal zusammenrechnen was ich ihm schon alles erklärt hab bzw. erklären wollte,
und wie oft ich es immer wieder versucht habe, und zwar auch immer wieder in supernettem
Ton usw.

Und wenn dann jmd so dreist ist, hier Hilfe zu erwarten aber gleichzeitig sich über
die Leute zu stellen und arrogante Sprüche zu klopfen (kann dir einge Bsp geben,
das neueste mit seinem Avatar-Bild, das "er selbst" gemacht hat), und einfach
auf taub zu schalten _wenn_ man ihm dann hilft, dann find ich's einfach assozial
und irgendwo muss man dann auch Klartext reden.

Ich weiss nich, der gehört hier einfach nicht hin. Nicht, weil er keine Ahnung von Java hat,
dafür ist das Forum ja da, und vor nicht mal 2 Jahren hab ich hier auch die bescheuertsten
Fragen gestellt.
Sondern weil er mit seiner Art einfach nicht in dieses, und in dieser Form in _kein_ Forum gehört.

Seine Beiträge sind Spam, denn er fragt eine Sache, bekommt Antworten, und nur
weil er zu faul ist es zu lesen, oder es nicht aktzeptieren will, was man antwortet,
macht er 2 Tage später das Thema unter anderem Thread-Namen wieder auf.


----------



## Spacerat (22. Mrz 2009)

hdi hat gesagt.:


> nachdem ich ihm 7 mal den JavaInsel Link gegeben ud mir die Finger wund geschrieben
> habe, um ihm zu erklären dass er das lesen sollte.


Aber Bananen rauchst du deswegen noch nicht, nein? Wenn ich mich aber an die Story mit Kermit, Krümel und Papa Schlumpf erinnere, frage ich mich: "was denn sonst? Bekomm' ich auch was von dem Zeug"


----------



## hdi (22. Mrz 2009)

Also das ist jetzt unfair, du hast mich ja eig. dazu gezwungen irgendeinen Müll dazu zu schreiben


----------

