PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java3d: Verständnisproblem Vector4d


Fettkopp
2008-02-21, 21:09:05
Ich hab grad ein Problem mit dem Vector4d in Java3d. Ich sitz derzeit an einer Aufgabe, bei der ich ein Würfel erstellen soll und mithilfe der ModelClip Methode soll ich ein Dreieck in den Cube reinschneiden. Mit Vector4d setz ich die Clipping Ebenen. Nur kann ich gerade nichts damit anfangen was mir die 4 Werte sagen

Vector4d(x,y,z,w) Wie definiert sich aus diesen 4 Werten eine Ebene? Ein 3d Vector gibt ja sozusagen durch x,y,z einen Punkt im Raum an? Aber wie wird denn jetzt bei 4d eine ganze Ebene dargestellt?

Hier mal der Code... (der auch funktioniert, die jeweiligen Vector4d Werte habe ich aus einer Musterlösung)

import java.awt.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.vp.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.applet.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.*;
import java.applet.*;
import com.sun.j3d.utils.geometry.*;
import java.applet.Applet;

public class aufgabe61 extends Applet{

public BranchGroup createSceneGraph()
{

ColorCube cube = new ColorCube();
ColorCube cube2 = new ColorCube();
ColorCube cube3 = new ColorCube();

Appearance app = new Appearance();
PolygonAttributes poly = new PolygonAttributes();
poly.setCullFace(PolygonAttributes.CULL_NONE);
app.setPolygonAttributes(poly);

cube.setAppearance(app);
cube2.setAppearance(app);
cube3.setAppearance(app);

// Eigene BranchGroups für den Cube
BranchGroup myGroup = new BranchGroup();
BranchGroup myGroup2 = new BranchGroup();
BranchGroup myGroup3 = new BranchGroup();

myGroup.addChild(cube);
myGroup2.addChild(cube2);
myGroup3.addChild(cube3);


// Schneidung des 1. Würfels
// ModelClip erzeugen
ModelClip dreieck = new ModelClip();
//3 ebenen werden benötigt (dreieck)
boolean enables[] =
{ true, false, false, false, false, false };
// zuweisen
dreieck.setEnables(enables);
// Clipping Ebene setzen
dreieck.setPlane(0, new Vector4d(2,-1,0,0.8));
//Gültigkeitsbereich definieren
dreieck.addScope(myGroup);

// Schneidung des 2. Würfels
// ModelClip erzeugen
ModelClip dreieck2 = new ModelClip();
dreieck2.setEnables(enables);
// Clipping Ebene setzen
dreieck2.setPlane(0, new Vector4d(-2,-1,0,0.8));
//Gültigkeitsbereich definieren
dreieck2.addScope(myGroup2);

// Schneidung des 3. Würfels
// ModelClip erzeugen
ModelClip dreieck3 = new ModelClip();
dreieck3.setEnables(enables);
// Clipping Ebene setzen
dreieck3.setPlane(0, new Vector4d(0,1,0,0.8));
//Gültigkeitsbereich definieren
dreieck3.addScope(myGroup3);

//Begrenzung für Clipping Objekt bestimmen
//1.Versuch: Standardkugel
// Bounds bounds = new BoundingSphere();
//2. Versuch: Box
Bounds bounds = new BoundingBox(new Point3d(-3.5f, -0.5f, -1.0f),
new Point3d(3.5f, 0.5f, 1.0f));

dreieck.setInfluencingBounds(bounds);
dreieck2.setInfluencingBounds(bounds);
dreieck3.setInfluencingBounds(bounds);



BranchGroup root = new BranchGroup();

root.addChild(myGroup);
root.addChild(myGroup2);
root.addChild(myGroup3);

root.addChild(dreieck);
root.addChild(dreieck2);
root.addChild(dreieck3);

root.addChild(Utils.createAxis(7f));

return root;
}


public void init(){

SimpleUniverse universe = Utils.createUniverse(this);

universe.addBranchGraph(createSceneGraph());
}

/** Creates a new instance of Action */
public aufgabe61() {}
public static void main(String[] args){

new MainFrame(new aufgabe61(), 800, 600);
}
}

del_4901
2008-02-21, 21:26:09
Wie kann man denn im 3D-Raum noch eine Ebene beschreiben?
http://de.wikipedia.org/wiki/Hyperebene
http://de.wikipedia.org/wiki/Homogene_Koordinaten
Und eigendlich muss man von den beiden Sachen gar nicht so viel wissen, um das Problem zu lösen.

Fettkopp
2008-03-03, 15:27:27
Wie kann man denn im 3D-Raum noch eine Ebene beschreiben?


genau das ist ja mein Problem^^ ... ich checks einfach nicht... mit den Wikipedialinnks komm ich nicht weiter. Die Hypereben hab ich wohl verstanden. Aber wie kann ich jetzt mit 4 Werten eine Ebene darstellen. Mit Definitionen komm ich da anscheinend nicht weiter

del_4901
2008-03-03, 16:50:24
Naja 3 Werte reichen nicht, da gibs nen Sonderfall wo die Ebene undefiniert ist/wird. Der da währe? Und den schägt man nun tot indem man...?

Neomi
2008-03-03, 17:14:14
Die drei ersten Werte bilden die Richtung der Ebene (in der Regel mit der Länge 1, also eine Normale). Bildet man einen Vektor zwischen zwei beliebigen Punkten auf einer beliebigen Ebene, dann ist der Vektor orthogonal zur Normale der Ebene (Skalarprodukt = 0). Bildet man einen Vektor von einem beliebigen Punkt auf der Ebene zu einem beliebigen anderen Punkt und errechnet das Skalarprodukt mit der Normale der Ebene, bekommt man entsprechend die Entfernung des anderen Punktes zur Ebene.

Wenn man jetzt eine Ebene heranzieht, die parallel zur gewünschten Ebene ist und durch den Nullpunkt geht, bilden alle Punkte der gewünschten Ebene bereits Vektoren ausgehend vom Nullpunkt. Und sie alle haben eins gemeinsam: berechnet man das Skalarprodukt zwischen diesem Punkt/Vektor und der Normale (die für beide Ebenen identisch ist), bekommt man die Entfernung zwischen den Ebenen. Du brauchst also, um eine Ebene zu definieren, die Richtung (Vektor) und die Entfernung (Skalar) zum Nullpunkt.

Fettkopp
2008-03-04, 19:32:46
Dankeschön, ich denke ich hab es jetzt verstanden! Habe nur noch ein Problem...

Bei ModelClip erstell ich mit dem Vector4d eine Ebene, die Objekte abschneidet. Nur woher weiß ich, in welche Richtung geschnitten wird?
Eine Ebene die parrallel zur X achse liegt. Woher weiß ich, dass diese alles oberhalb der X Achse schneidet, oder unterhalb?

Xmas
2008-03-04, 19:47:39
Die Normale zeigt nach "außen", also alles was auf der Seite liegt in deren Richtung die Normale zeigt wird abgeschnitten.