# Java 3 D - Transparenz einzelner Punkte



## Luz (26. Jul 2008)

Hi ihr.

Ich schlage mich nun schon seit 18 uhr mit dem Problem rum ich hoffe ihr könnt mir helfen :s danke schonmal

zum Problem:
Ich habe ein Objekt mit einer vielzahl von Punkten. Ich möchte aber nur bestimmte Punkte transparent machen. Das Objekt kann nicht in mehrere Teilobjekte aufgeteilt werden, sonst schießt der Speicherverbrauch zu hoch.

Hier ein Ausschnitt am Beispiel von nur einem Punkt:


```
PointArray pa = new PointArray( anz , 
                        PointArray.COORDINATES | 
                        PointArray.COLOR_4  );

                pa.setCoordinate(0,new Point3f(1.0f,1.0f,1.0f));
                pa.setColor(0,new Color4f(1.0f,1.0f,1.0f,0.5f)); //?!?!?
                Shape3D shape = new Shape3D(pa);
                BranchGroup innode = new BranchGroup();
                innode.addChild(shape);
//innode wird dann weiter zur anzeige gegeben
```

Eigentlich sollte in dem kleinen Beispiel nur ein einzelner Punkt erstellt werden, der leicht Transparent ist (0.5f). Der Punkt ist zu sehen aber kein hauch von Transparenz. Auch nach 7 stunden belesen und probieren habe ich es nicht geschafft. Ein Objekt als ganzes transparent zu machen hat übrigens funktioniert. Hilft mir leider nicht weiter :s


----------



## Luz (26. Jul 2008)

ok ohne den folgenden Code ignoriert er die Alphawerte vollkommen:


```
Appearance ap = new Appearance();
                TransparencyAttributes tp = new TransparencyAttributes(
                        TransparencyAttributes.BLENDED,
                        0.0f
                        );
                ap.setTransparencyAttributes(tp);
                shape.setAppearance(ap);
```

 ... dummerweise sorgt die Funkion setTransparencyAttributes(tp); dafür das von allen Farbwerten und Alphawerten eine kopie erstellt wird. Und nur diese Kopie wird angezeigt. 
Alle farblichen Änderungen die ich danach am Shape vornehme werden somit ignoriert und der Speicherverbrauch steigt auch um einiges :s

irgendwie blick nich da nich durch  :bahnhof:


----------



## Luz (27. Jul 2008)

ok das PointArray muss anscheinend nach jeder Änderung mittels Funktion updateData geupdatet werden. aber nur wenn setTransparencyAttributes() beim Appearance  genutzt wurde ...

jetzt geht alles. Tschüss liebes Tagebuch^^


----------



## Marco13 (27. Jul 2008)

Naja, Java3D ist jetzt nicht gerade was, was jeder jeden Tag verwendet, und bei so einer speziellen Frage ist die Wahrscheinlichkeit, dass jemand die Antwort einfach so aus dem Ärmel schüttelt (oder sich die Arbeit macht, das gepostete in ein Compilierbares Beispiel einzubauen (*zaunpfahl*), und die Lösung zu _suchen_) leider sehr gering. Aber vielleicht ja bei zukünftigen Fragen


----------



## Luz (9. Aug 2008)

soo ich hab den Harken mal wieder weg genommen ...
Mein Objekt ist ja nun transparent nur leider löst das schon wieder ein Problem aus.

Wenn mein Objekt um mehr als 90° gedreht wird, dann gibt es einen Anzeigefehler der wohl durch die falsche reihenfolge beim Rendern ausgelöst wird. ( hab ich mir bisher so zusammen gereimt )

Hier erstmal Beispiel zum selber angucken:
http://derluzi.de.funpic.de/transp/

Hier der Quellcode ( nur schnell als Beispiel zusammengebaut):

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

public class transp extends Applet{

    public transp()
    {
        
    }
    
    @Override
    public void init()
    {
        this.setSize(300,300);    
        Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
        canvas3D.setSize(300, 300);
        this.add(canvas3D);
        
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
        simpleU.getViewingPlatform().setNominalViewingTransform();
        BranchGroup scene = createSceneGraph();       
        simpleU.addBranchGraph(scene);        
    }
    

  private BranchGroup createSceneGraph()
  {

    QuadArray pointar = new QuadArray(8, PointArray.COORDINATES |
                                        PointArray.COLOR_4);

    pointar.setCoordinate(0, new Point3f(0.5f, 0.5f, 0.5f));
    pointar.setColor(0, new Color4f(1,1,1,1));
        
    pointar.setCoordinate(1, new Point3f(0.5f, 0.5f, -0.5f));
    pointar.setColor(1, new Color4f(1,1,0.5f,1));

    pointar.setCoordinate(2, new Point3f(0.5f, -0.5f, -0.5f));
    pointar.setColor(2, new Color4f(1,0.5f,1,1));
    
    pointar.setCoordinate(3, new Point3f(0.5f, -0.5f, 0.5f));
    pointar.setColor(3, new Color4f(1,0.5f,0.5f,1));
    
    pointar.setCoordinate(4, new Point3f(-0.5f, 0.5f, 0.5f));
    pointar.setColor(4, new Color4f(0.5f,1,1,1));
    
    pointar.setCoordinate(5, new Point3f(-0.5f, 0.5f, -0.5f));
    pointar.setColor(5, new Color4f(0.5f,1,0.5f,1));
    
    pointar.setCoordinate(6, new Point3f(-0.5f, -0.5f, -0.5f));
    pointar.setColor(6, new Color4f(0.5f,0.5f,1,1));
    
    pointar.setCoordinate(7, new Point3f(-0.5f, -0.5f, 0.5f));
    pointar.setColor(7, new Color4f(0.5f,0.5f,0.5f,1));
    
    
    
    Appearance ap = new Appearance();
    
    PolygonAttributes poly = new PolygonAttributes();
    poly.setCullFace(PolygonAttributes.CULL_NONE);
    
    ap.setPolygonAttributes(poly);
    
    ap.setTransparencyAttributes(new TransparencyAttributes(
            TransparencyAttributes.BLENDED,
            0.0f));
    

    Shape3D shape = new Shape3D(pointar,ap);


    MouseRotate behavior = new MouseRotate();
    TransformGroup tg = new TransformGroup();
    tg.setCapability(tg.ALLOW_TRANSFORM_WRITE);
    behavior.setTransformGroup(tg);
    tg.addChild(behavior);

    behavior.setSchedulingBounds(shape.getBounds());
   

    tg.addChild(shape);

    
    Transform3D trans = new Transform3D();
    trans.setTranslation(new Vector3f(0,0,-5));
    tg.setTransform(trans);
    BranchGroup bg = new BranchGroup();
    bg.addChild(tg);

    return bg;
  }
}
```

Die einzige Lösung die ich bisher gefunden hab ( mit OrderedGroup arbeiten) ist leider bei mir nicht möglich, weil sich alles in einem einzigen großen Shape befindet.


----------



## Siassei (9. Aug 2008)

Hinweis: Deine Applets sollten den gesamt verwendeten Code laden, der nicht in der SE enthalten ist :wink: Ansonsten bekommen die meisten Benutzer eine ClassNotFoundException.


----------



## Luz (13. Aug 2008)

java3d hat ja nicht nur zusätzlichen Javacode sondern auch systemabhängige teile. Glaub das geht mit Applets nicht nachzuladen. Hab jedenfalls bisher nur bei JNLP einen Weg dazu gefunden.

zum Thema: Ich sortiere jetzt die Punkte im GeometryArray so, dass immer die Punkte die nah am Viewer sind zurletzt gezeichnet werden. 
Es ist alles andere als eine gute Lösung. Ich hoffe immernoch das jemand einen tipp hat


----------

