# Halbdurchsichtige Objekte



## Dibo (8. Aug 2009)

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).






Links ist wie es seien soll.

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

Haber zuerst an

```
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 (8. Aug 2009)

mit appearances geht das so:

```
Appearance a = new Appearance();
a.setTransparencyAttributes(new TransparencyAttributes(TransparencyAttributes.NICEST,0.6f));
```


----------



## Illuvatar (8. Aug 2009)

Du könntest mal CULL_NONE probieren.


----------



## Dibo (8. Aug 2009)

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.


```
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


----------



## Dibo (8. Aug 2009)

@Illuvatar dann sieht es aus.






Mfg


----------



## Developer_X (8. Aug 2009)

Dibo hat gesagt.:


> Hallo,
> 
> erstmal danke für die schnelle Antwort. Das Problem ist, dass das Objekt garnicht Tranparent seien 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 (8. Aug 2009)

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 (8. Aug 2009)

@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 (10. Aug 2009)

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.  Trifft diese Beschreibung ungefähr zu, wenn man an den Sachen dreht?


----------



## Developer_X (10. Aug 2009)

0x7F800000 hat gesagt.:


> 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.  Trifft diese Beschreibung ungefähr zu, wenn man an den Sachen dreht?



das habe ich bereits schon erwähnt!


----------



## Dibo (10. Aug 2009)

Hallo,

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

Folgende Konfiguration war die Lösung!

```
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 (10. Aug 2009)

Developer_X hat gesagt.:


> 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.



Dibo hat gesagt.:


> ```
> PolygonAttributes polyAttr = new PolygonAttributes();
> polyAttr.setCapability(PolygonAttributes.ALLOW_MODE_READ);
> polyAttr.setCapability(PolygonAttributes.ALLOW_MODE_WRITE);
> ...


(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 (10. Aug 2009)

@0x7F800000


```
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 (10. Aug 2009)

Dibo hat gesagt.:


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




```
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.


----------



## Dibo (10. Aug 2009)

Das problem ist, dass wenn ich die lösche, ich das selbe Problem habe wie davor.


----------



## Developer_X (10. Aug 2009)

0x7F800000 hat gesagt.:


> Ä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.
> 
> ...



okay


----------



## 0x7F800000 (10. Aug 2009)

Dibo hat gesagt.:


> Das problem ist, dass wenn ich die lösche, ich das selbe Problem habe wie davor.


das ist ziemlich schräg ???:L
Und was, wenn du die Einstellungen auf CULL_BACK und normalFlip(false) setzst? :rtfm:


----------



## Dibo (16. Aug 2009)

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


----------

