# 3D Raum zeichnen



## Guest (21. Jan 2007)

Hallo, ich wollte mit java 3d einen Raum zeichnen. Ich sollte auch die Funktionalität von "auswählen" realisieren. D.h., wenn ich meine Mauspfeil auf irgend eine Position von "Boden" lege, wollte ich den Wert dieser Position  wissen. Wenn ich den ganzen Boden als  ein Shape3D definieren würde, wäre es unmöglich, mir die exakte Position mitzuteilen. Dann habe ich den Boden in kleinere Stückchen zerlegt, jedes Stückchen ist ein Sahpe3D-Objekt. Beim Platzieren wird die Position von allen solchen Stückchen gespeichert. Dann weiss ich auf welches Stückchen ich die Mauspfeil gelegt habe, und auch die Position davon. Aber das Problem ist, dass diese Methode zu viel Speicherplatz verbraucht. Z.B, für einen Raum "15m x15m" muss ich 900 solche Stückchen erzeugen, je von der Grösse "0.5mx0.5m" ist. Hat jemand eine bessere Lösung für das Problem?


----------



## DarkLoG (21. Jan 2007)

Wieso musst du denn so exakt wissen wo die Maus sich aufhält, ich meine du kannst den Raum ja auch nur in 90 Stücke unterteilen - rein theoretisch meine ich jetzt??Und was soll dann passieren wenn die Maus über einem Teil ist?

Gruß

DarkLoG


----------



## Gast (21. Jan 2007)

Danke für deine Antwort. Die Idee ist, dass man nachher auch Möbel in den Raum stellen kann, z.B. Stehlampe. Man kann mit Maus Möbelstücke platzieren. Deshalb muss ich wissen, wo die Mauspfeil sich befindet, in dem  3D Raum, dann kann ich berechnen, ob das Möbelstück dort gelegt werden darf. Wenn ja, dann sollte ich dort ein Möbelstück hinlegen. Das ist die Idee. Ich  habe einen Raum von der Grösse "40mX40m" probiert, aber es scheitert direkt bei der Ausführung, weil dafür zu viel Speicherplatz erforderlich  ist.


----------



## DarkLoG (21. Jan 2007)

Ah ok dachte mir schon sowas ähnliches, daher würde ich es so lösen dass die neuen Gegenstände einfach frei platziert werden können über buttons oder tasteneingabe, mit Maus wüsst ich jetzt nicht wie es lösen würde. Also nach dem Motto der Stuhl taucht in der Mitte des Raumes auf, und kann mit den Buttons links,rechts,drehen links, drehen rechts in die gewünschte Position gebracht werden...

Gruß

DarkLoG

Ps: Mach grad ein Brettspiel in Java3D das aus fast 200 einzelnen Feldern besteht die alle ne 128er Textur haben und bis dato gibts keine Speicherprobleme...


----------



## EgonOlsen (22. Jan 2007)

Ich kenne Java3D jetzt nicht so genau, aber gibt es denn da keine Möglichkeit, einen Strahl in die Szene zu schiessen und seine Länge bis zum nächsten Hindernis sowie der Hindernis selber zu bekommen? Wenn das Hindernis der Boden wäre, dann müsste man, das da was zu platzieren ist und die Position ergibt sich über den normierten Richtungsvektor des Strahls*Länge bis zum Hindernis. Nur eine Idee, wie ich das machen würde. Ich weiß wie gesagt nicht, ob oder wie das in Java3D geht.


----------



## kaie (22. Jan 2007)

Versuch's mal hiermit:

```
public Point3d sucheNächstenPunkt( Canvas3D canvas, BranchGroup scene, MouseEvent mouseEvent )
{
  PickCanvas pickCanvas = new PickCanvas(canvas, scene);
  pickCanvas.setMode(PickTool.GEOMETRY_INTERSECT_INFO); 
  pickCanvas.setTolerance(4.0f);
  pickCanvas.setShapeLocation(mouseEvent);
  PickResult result = pickCanvas.pickClosest();
  PickIntersection intersection = result.getIntersection(0);
  Point3d point = intersection.getPointCoordinates();
  return point;
}
```
Vorher müssen natürlich die entsprechenden Pick-Capabilities gesetzt sein.


----------



## Gast (12. Feb 2007)

Vielen Dank, kaie! Es hat gklappt!


----------



## licht400 (27. Feb 2008)

Hi.
Ich habe einen Würfel auf meinen Canvas erzeugt.
Wie bekomme ich den die Position des Würfel im Koordinatensystem?

Ich möchte, wenn ich mein Objekt anklicke, das mir ausgegeben wird, wo dieser Würfel liegt.

Ich habe es swoeit, das ich das Objekt anklicken kann, aber wie bekomme ich die Position?


```
public void mouseClicked(MouseEvent mousee){
 Node PickedObject;
 PickCanvas MyPick=new PickCanvas(canvas,root);
 PickResult[] MyPickResult;
 int resCtr=0;

 MyPick.setTolerance(0f);
 MyPick.setMode(PickTool.GEOMETRY);
 MyPick.setShapeLocation(mousee);
 MyPickResult=MyPick.pickAllSorted();
 if (MyPickResult==null)
 {
 System.out.println("nichts");
 return;
 }
 while (resCtr<MyPickResult.length)
 {
 PickedObject=MyPickResult[resCtr].getObject();
 System.out.println(PickedObject);
 resCtr++;
 }
}
```


----------

