Normalenvektor berechnen (Fläche nicht sichtbar)

licht400

Mitglied
Guten Tag Experte :D,

ich habe mal eine Frage. Ich lese Daten ein. Die Daten bekomme ich
von einer .*iges Datei. Von dieser bekomme ich Punkte im R^3 Raum.
In dieser Datei, wird bespielsweise ein Würfel beschrieben.
Punkte einlesen kein Thema. Ausgeben auch. Problem ist bei Java3d,
dass ich die Seitenfläche teilweise nur innen sehe, bzw wenn ich sie
nicht innen sehe, sehe ich diese außen. Das heißt, habe ich
nachgelesen, das der Normalenvektor einer Dreicksfläche nach innen
zeigt(heißt, nur innen angezeigt werden) aber der Normalenvektor soll
nach aussen gerichtet sein.

Im Code ist es soweit, das die Punkte alle in eine Array eingelesen
werden und dann nacheinander in ein TriangleArray, damit der Würfel
mittels der Dreiecke dargstellt werden kann. Wie bekomme ich jetzt
nun die richtig Richtung oder Orientierung des Normalenvektors, so das ich die Außenflächen sehe


Code:

/
Code:
/mein Netz, was mit punkten gefüllt werden soll
TriangleArray netz=new
TriangleArray(points.size(),TriangleArray.COORDINATES |
TriangleArray.COLOR_3 | TriangleArray.NORMALS);
netz.setCapability(TriangleArray.ALLOW_COUNT_READ);
netz.setCapability(TriangleArray.ALLOW_COLOR_WRITE);

int i;
//points ist die arrayliste, wo die punkte drin liegen
// und die Punkte werden dann nacheinander ins
//triangleArray netz gespeichert -->hier dürfte wohl
//ein denk fehler sein, warum ich manche flächen
//nur von außen sehe bzw nur von innen ^^
for (i = 0; i <points.size(); i+=3) {
Point3d temp1= (Point3d) points.get(i);
Point3d temp2= (Point3d) points.get(i+1);
Point3d temp3= (Point3d) points.get(i+2);
Vector3f normale = null;
if ((temp1 != null) && (temp2 != null) & (temp3 != null) ){
netz.setCoordinate(i,temp1);
netz.setCoordinate(i+1,temp2);
netz.setCoordinate(i+2,temp3);
if (normale!=null){
//methode berechneNormale() ist unten zufinden
normale.berechneNormale();
}

Code:
private Vector3f berechneNormale(Point3d p1,Point3d p2, Point3d p3){
Vector3f normale = null;

// Ein Dreieck hat im Raum 3 Punkte p1, p2, p3 davon wird die Normale
//berechnet
Point3f v2 = new
Point3f((float)p2.x-(float)p1.x,(float)p2.y-(float)p1.y,(float)p2.z-(float)p1.z);

Point3f v3 = new
Point3f((float)p3.x-(float)p1.x,(float)p3.y-(float)p1.y,(float)p3.z-(float)p1.z);

//Kreuzprodukt
float xWert =v2.y*v3.zv2.z*v3.y;
float yWert = v2.z*v3.x-v2.x*v3.z;
float zWert = v2.x*v3.y-v2.y*v3.x;

//normale
normale = new Vector3f(xWert,yWert,zWert);
normale.normalize();
// }
return normale;
}
So, und wie sage ich jetz, das die Normale, nach außen gerichtet ist,
damit die Seitefläche des Dreieckes gesehen wird?
 
Hey!

Hundertpro ist es das gleiche wie in OpenGL. Leider kann ich nur da sagen dass es was mit der Reihenfolge zu tun hat mit der du die Dreiecke, bzw Punkte zum Rendern gibst. Drehe mal die Reihenfolge um und schreib dann mal obs das war.

cu
 
Mhh sicher, aber die Reihenfolge lege ich nicht fest. BEkomme diese einfach übergeben. Außerdem sehe ich ja alles, nur halt einmal die innen Seite, und wenn ich die Innenseite sehe, sehe ich von außen durch. das möcht ich ja vermeiden. habe wie gesagt mich belesen, das die normalen die richtung geben, von wo die fläche gesehen wird.
 
Zurück