Halbdurchsichtige Objekte

Status
Nicht offen für weitere Antworten.

Dibo

Mitglied
Hallo,

ich habe eine Aufgabe bekommen wo ich Fehler bei einem 3D-Programm finden soll. Es sind leider 50k LOC's und weiss nicht weiter wo ich suchen soll. Das Problem ist, dass viele Objekte unfertig bzw halbdurchsichtig angezeigt werden (siehe bild unten rechts).
object.png


Links ist wie es seien soll.

Könnte jemand ein Tipp geben, wo nach ich suchen soll?

Haber zuerst an
Java:
		PolygonAttributes polyAttr = new PolygonAttributes();
		polyAttr.setCapability(PolygonAttributes.ALLOW_MODE_READ);
		polyAttr.setCapability(PolygonAttributes.ALLOW_MODE_WRITE);
		polyAttr.setCullFace(PolygonAttributes.CULL_BACK);

gedacht doch wenn ich CULL_BACK auf CULL_FRONT ändere wird das ganze Objekt total schwarz.

Kann mir mal jemand helfen? Bzw einen kleinen Tipp geben, was seien könnte?

MfG

Dibo
 

Developer_X

Top Contributor
mit appearances geht das so:
Java:
Appearance a = new Appearance();
a.setTransparencyAttributes(new TransparencyAttributes(TransparencyAttributes.NICEST,0.6f));
 

Dibo

Mitglied
Hallo,

erstmal danke für die schnelle Antwort. Das Problem ist, dass das Objekt garnicht Tranparent seien soll.

Das mit Transparency habe ich auch so stehen.

Java:
		TransparencyAttributes ta = new TransparencyAttributes();
		ta.setTransparencyMode(TransparencyAttributes.NICEST);

		MaterialNode materialNode = node.getMaterialNodes();
		ta.setTransparency(materialNode.getTransparency());
		setTransparencyAttributes(ta);

Das Problem ist,dass er es Transparent macht, wo er es ganicht machen soll
 

Developer_X

Top Contributor
Hallo,

erstmal danke für die schnelle Antwort. Das Problem ist, dass das Objekt garnicht Tranparent seien soll.

Das mit Transparency habe ich auch so stehen.

Java:
		TransparencyAttributes ta = new TransparencyAttributes();
		ta.setTransparencyMode(TransparencyAttributes.NICEST);

		MaterialNode materialNode = node.getMaterialNodes();
		ta.setTransparency(materialNode.getTransparency());
		setTransparencyAttributes(ta);

Das Problem ist,dass er es Transparent macht, wo er es ganicht machen soll


aaa
ich habe trotzdem eine antwort an dich
mach mal zum spaß eine Box
und gebe als attribute folgendes ein (-1,1,1)
weißt du was dann passiert? das falsche

also probier dein Objekt, egal wie es auch heißen mag,
bei Spehere zum Beispiel gibts es in der Parameter so was:
new Sphere(radius,Sphere.GENERATE_NORMALS,Appearance);
Schau dir das fettgedruckte an, wenn es sowas irgendwo bei dir auch gibt,
dann ersetzte es durch:
,Sphere.GENERATE_NORMALS_INWARD/B],
und auch umgekehrt, vielleicht geht es dann, weil deins ist nicht transparent, sondern die punkte sind in einer der drei Raumdimensionen falsch gesetzt, entweder, setzt mal alle +werte negativ, und alle -werte positiv, aber nur bei einer dimension!

Melde dich bitte wieder wenn du das problem immer noch nicht gelöst hast, aber diesmal mit code,
bis dann Developer_X
 

Illuvatar

Top Contributor
Developer_X... wie wärs du machst erstmal mit den Grundlagen weiter?
Dann könntest du lernen, dich verständlich auszudrücken, und dann kannst du langsam anfangen anderen Leuten zu antworten.
*genervt*

Dibo: Wie werden die Models denn erzeugt? Mir fällt grad nichts ein was solche Effekte erzeugen kann... Dev_X könnte in sofern Recht haben dass da was grundsätzlich mit den Models nicht in Ordnung ist ;) Ob das was mit den Normalen zu tun haben kann, weiß ich nicht.
 

Dibo

Mitglied
@Illuvatar: Bin leider erst seit 2 Monaten mit Java3d dabei. Sag mal ein paar Begriffe, nachden ich suchen kann. Es sind leider 330 Klassen :(

@Developer_X: new Sphere(radius,Sphere.GENERATE_NORMALS,Appearance) habe ich bei mir garnicht gefunden.
 

0x7F800000

Top Contributor
So nach 3 sekunden hinguggen würd ich mal spontan sagen: Sieht so aus, als wäre der Z-Buffer falschherum eingestellt. Bei Direct3D würde man sowas durch "Vergelichsfunktion" festlegen, in deinem Fall sieht es so aus, als ob da grad D3DCMP_GREATER als vergleichsfunktion verwendet werden würde. Bei OGL würde das wohl glDepthFunc(GL_GREATER) heißen. Wie das bei Java3D heißt: keine Ahnung, habe hier nur gefunden, wie man den Z-Buffer ein und ausschaltet. (Sicher dass der eingeschaltet ist?). Was meine Vermutung angeht, bin ich mir inzwischen auch nicht so sicher, da müsste man schon bisschen dran drehen...:bahnhof:

Aber beim umgekehrten z-buffer sieht es so aus, als ob die hintersten flächen der objekte ganz vorne gezeichnet werden würden, das gibt dann beim drehen so einen äußerst befremdenden anti-3D-effekt. :eek: Trifft diese Beschreibung ungefähr zu, wenn man an den Sachen dreht?
 

Developer_X

Top Contributor
So nach 3 sekunden hinguggen würd ich mal spontan sagen: Sieht so aus, als wäre der Z-Buffer falschherum eingestellt. Bei Direct3D würde man sowas durch "Vergelichsfunktion" festlegen, in deinem Fall sieht es so aus, als ob da grad D3DCMP_GREATER als vergleichsfunktion verwendet werden würde. Bei OGL würde das wohl glDepthFunc(GL_GREATER) heißen. Wie das bei Java3D heißt: keine Ahnung, habe hier nur gefunden, wie man den Z-Buffer ein und ausschaltet. (Sicher dass der eingeschaltet ist?). Was meine Vermutung angeht, bin ich mir inzwischen auch nicht so sicher, da müsste man schon bisschen dran drehen...:bahnhof:

Aber beim umgekehrten z-buffer sieht es so aus, als ob die hintersten flächen der objekte ganz vorne gezeichnet werden würden, das gibt dann beim drehen so einen äußerst befremdenden anti-3D-effekt. :eek: Trifft diese Beschreibung ungefähr zu, wenn man an den Sachen dreht?

das habe ich bereits schon erwähnt!
 

Dibo

Mitglied
Hallo,

als erstes bin ich allen sehr dankbar für die Tipps!

Folgende Konfiguration war die Lösung!
Java:
		PolygonAttributes polyAttr = new PolygonAttributes();
		polyAttr.setCapability(PolygonAttributes.ALLOW_MODE_READ);
		polyAttr.setCapability(PolygonAttributes.ALLOW_MODE_WRITE);
		polyAttr.setCullFace(PolygonAttributes.CULL_FRONT);
		polyAttr.setBackFaceNormalFlip(true);
		setPolygonAttributes(polyAttr);
		TransparencyAttributes ta = new TransparencyAttributes();
		ta.setTransparencyMode(TransparencyAttributes.SCREEN_DOOR);

		MaterialNode materialNode = node.getMaterialNodes();
		ta.setTransparency(materialNode.getTransparency());
		setTransparencyAttributes(ta);

		RenderingAttributes ra = new RenderingAttributes();
		ra.setDepthBufferEnable(true);
		setRenderingAttributes(ra);

Danke Danke Danke!!!
 

0x7F800000

Top Contributor
das habe ich bereits schon erwähnt!
Ähm...? Meinst du das da?
die punkte sind in einer der drei Raumdimensionen falsch gesetzt, entweder, setzt mal alle +werte negativ, und alle -werte positiv
Bei gutwilliger Interpretation könnte man sich da schon zusammenreimen, dass du die Vergleichsfunktion des z-Buffers meinst, aber dazu müsste man erstmal wissen, dass es überhaupt eine gibt^^ Hat ja anscheinend nicht geschadet nochml etwas expliziter drauf hinzuweisen.

Java:
		PolygonAttributes polyAttr = new PolygonAttributes();
		polyAttr.setCapability(PolygonAttributes.ALLOW_MODE_READ);
		polyAttr.setCapability(PolygonAttributes.ALLOW_MODE_WRITE);
		polyAttr.setCullFace(PolygonAttributes.CULL_FRONT);   //  <---- (1)
		polyAttr.setBackFaceNormalFlip(true);
		setPolygonAttributes(polyAttr);
		TransparencyAttributes ta = new TransparencyAttributes();
		ta.setTransparencyMode(TransparencyAttributes.SCREEN_DOOR);

		MaterialNode materialNode = node.getMaterialNodes();
		ta.setTransparency(materialNode.getTransparency());
		setTransparencyAttributes(ta);

		RenderingAttributes ra = new RenderingAttributes();
		ra.setDepthBufferEnable(true);  // <----  (2)
		setRenderingAttributes(ra);
(1) diese und die nächste zeilen sehen sehr widersprüchlich aus. Alle Normalen umzudrehen, und dann ausgerechnet die richtigherum gedrehten dreiecke wegzucullen ergibt imho keinen besonderen Sinn. Man kann genausogut die Normalen lassen wie sie sind, und die falschrum gedrehten dreiecke wegcullen. Bei soliden Objekten ist dieses NormalFlip dingens afaik nicht zu gebrauchen, das braucht man nur wenn man irgendwelche platten Sachen wie Segel oder Mäntel oder Pappkartons rendern will.

(2) genau das meinte ich... war das teil davor abgeschaltet?
 

Dibo

Mitglied
@0x7F800000

Java:
		RenderingAttributes ra = new RenderingAttributes();
		ra.setDepthBufferEnable(true);
		setRenderingAttributes(ra);

war nicht eingeschaltet bzw habe im Code nix gefunden.

Und zum (1) wie wäre dein Vorschlag es richtig zu machen?

MfG
 

0x7F800000

Top Contributor
Und zum (1) wie wäre dein Vorschlag es richtig zu machen?

Java:
polyAttr.setCullFace(PolygonAttributes.CULL_BACK); //oder so ähnlich sollte die option heißen
polyAttr.setBackFaceNormalFlip(false); //braucht man bei soliden metallteilen nicht
Man kann imho diese zwei zeilen genausogut komplett rauslöschen, weil es die default-einstellungen sein sollten.
 

Developer_X

Top Contributor
Ähm...? Meinst du das da?

Bei gutwilliger Interpretation könnte man sich da schon zusammenreimen, dass du die Vergleichsfunktion des z-Buffers meinst, aber dazu müsste man erstmal wissen, dass es überhaupt eine gibt^^ Hat ja anscheinend nicht geschadet nochml etwas expliziter drauf hinzuweisen.


(1) diese und die nächste zeilen sehen sehr widersprüchlich aus. Alle Normalen umzudrehen, und dann ausgerechnet die richtigherum gedrehten dreiecke wegzucullen ergibt imho keinen besonderen Sinn. Man kann genausogut die Normalen lassen wie sie sind, und die falschrum gedrehten dreiecke wegcullen. Bei soliden Objekten ist dieses NormalFlip dingens afaik nicht zu gebrauchen, das braucht man nur wenn man irgendwelche platten Sachen wie Segel oder Mäntel oder Pappkartons rendern will.

(2) genau das meinte ich... war das teil davor abgeschaltet?

okay
 

Dibo

Mitglied
Hi,

sry fürs nicht Antworten. Habe bei mir rausgefunden, dass ich die Punkte verkehrt einlese. Deshalb wurde bei mir anstatt der Vorderseite die Rückseite angezeigt. Da ich jetzt das Verbessert habe brauche ich diese Einstellungen nicht mehr!


Danke für die Mühe!

MfG
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Wie bekomme ich eine Transition für alle Objekte zum stoppen? Spiele- und Multimedia-Programmierung 1
Kim_Dotcom Objekte synchronisieren Variablen Spiele- und Multimedia-Programmierung 19
K Bewegte Objekte per Mausklick entfernen Spiele- und Multimedia-Programmierung 3
N Helden: Verschiedene Objekte oder konkrete Unterklassen Spiele- und Multimedia-Programmierung 1
gamebreiti Wie Objekte versenden und empfangen Spiele- und Multimedia-Programmierung 4
J Objekte übereinander lagern Spiele- und Multimedia-Programmierung 1
L JavaFX Objekte bewegen Spiele- und Multimedia-Programmierung 3
Q Mehr objekte darstellen als Pixel vorhanden Spiele- und Multimedia-Programmierung 6
lord239123 Minecraft Nur sichtbare Objekte rendern Spiele- und Multimedia-Programmierung 5
Z Objekte animieren mit Threads Spiele- und Multimedia-Programmierung 4
M Objekte verschwinden durch Explosion Spiele- und Multimedia-Programmierung 2
E [LWJGL] Karusell, mehrere Objekte drehen sich um einen Mittelpunkt Spiele- und Multimedia-Programmierung 31
A LWJGL 3D Objekte Kollision Spiele- und Multimedia-Programmierung 3
A JME3 will Blender/j3o Objekte nicht einladen Spiele- und Multimedia-Programmierung 3
B LWJGL/OpenGL rendert manche Objekte nicht Spiele- und Multimedia-Programmierung 6
T JOGL 2D Objekte drehen rotate Spiele- und Multimedia-Programmierung 4
D Objekte in weiter Entfernung flimmern / flackern Spiele- und Multimedia-Programmierung 2
G 3D-Objekte / Grafiken gesucht Spiele- und Multimedia-Programmierung 6
S Klickbare Objekte im Spiel Spiele- und Multimedia-Programmierung 8
T Java3D: Objekte platzieren und entfernen? Spiele- und Multimedia-Programmierung 7
W Rotation aller Objekte einer 3D-Szene Spiele- und Multimedia-Programmierung 8
L 3D Objekte in Java importieren Spiele- und Multimedia-Programmierung 2
M Java3D Picking - falsche Objekte werden gepickt Spiele- und Multimedia-Programmierung 3
P Erkennen auf welche Objekte gezeigt wird in JoGL Spiele- und Multimedia-Programmierung 6
T Selbst-handelnde Objekte im Client-Server Betrieb Spiele- und Multimedia-Programmierung 9
M Java3D Objekte entfernen und hinzufügen Spiele- und Multimedia-Programmierung 10
aze Java 3d Objekte überdecken 2d Komponenten Spiele- und Multimedia-Programmierung 7
aze Java 3D : 3D Objekte speichern und später wieder einlesen Spiele- und Multimedia-Programmierung 9
F zu viele Objekte, Problem mit neuzeichnen. Spiele- und Multimedia-Programmierung 5
M Alle Objekte aus der SimpleUniverse entfernen Spiele- und Multimedia-Programmierung 2
A Mehrere geometrische Objekte in JPanel zeichnen Spiele- und Multimedia-Programmierung 4
B Position der ViewingPlatform und Visueller Objekte setzen Spiele- und Multimedia-Programmierung 3
B Isometrischer KartenEditor mit Animierten Objekte Spiele- und Multimedia-Programmierung 3
J 1x Punktlicht auf 5 Objekte benutzen Spiele- und Multimedia-Programmierung 17
F Maussteuerung-gezeichnete Objekte Spiele- und Multimedia-Programmierung 4
B Objekte zur Laufzeit verändern Spiele- und Multimedia-Programmierung 3
A durch Objekte hindurchzoomen Spiele- und Multimedia-Programmierung 2
S 3D Objekte ohne Java3D darstellen? Spiele- und Multimedia-Programmierung 10
J Zu viele Objekte - OutOfMemoryError Spiele- und Multimedia-Programmierung 3
L Objekte zentrieren Spiele- und Multimedia-Programmierung 2
G zur laufzeit objekte einfügen Spiele- und Multimedia-Programmierung 3
G 2D-Objekte werden nicht vollständig gezeichnet Spiele- und Multimedia-Programmierung 4
conan2 Objekte in richtiger Z-Reihenfolge zeichnen Spiele- und Multimedia-Programmierung 2
A Objekte nacheinander zeitgesteuert rotieren lassen Spiele- und Multimedia-Programmierung 4
H 3D Objekte ausfüllen Spiele- und Multimedia-Programmierung 3
T 3D-Objekte Laden Spiele- und Multimedia-Programmierung 3
D 2D Graphic Objekte in ein JPanel einfügen Spiele- und Multimedia-Programmierung 2
G Zugriff auf einzelne Objekte Spiele- und Multimedia-Programmierung 12

Ähnliche Java Themen

Neue Themen


Oben