# Java3d Linie mit Antialiasing geht nicht ???



## mattn (2. Aug 2010)

hi, wie ihr schon seht geht bei mir das antialiasing nicht 
ich komme nur leider nicht drauf wieso , da ich laut api eigentlich alles richtig gemacht habe(denk ich zumindest)


```
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;

import javax.media.j3d.Appearance;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.ColoringAttributes;
import javax.media.j3d.LineArray;
import javax.media.j3d.LineAttributes;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Color3f;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.universe.SimpleUniverse;


public class antiAliasing extends Applet{
	
	Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
	
	public void init(){
		System.out.println("init");
		setLayout(new BorderLayout());
		GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
		Canvas3D c= new Canvas3D(config);
		add("Center", c);
		SimpleUniverse u = new SimpleUniverse(c);	
		
		// verschiebe ViewingPlatform:
		TransformGroup vpTG = null;
		Transform3D vpT3D = new Transform3D();
		vpTG = u.getViewingPlatform().getViewPlatformTransform();
		vpT3D.set(new Vector3f(0.0f, 0.0f, 10.0f));
		vpTG.setTransform(vpT3D);

//		u.getViewingPlatform().setNominalViewingTransform();
		u.addBranchGraph(createSceneGraph());
	}

	private BranchGroup createSceneGraph() {
		// TODO Auto-generated method stub
		BranchGroup rootBG = new BranchGroup();

		Appearance app = new Appearance();
	    //app.setLineAttributes(new LineAttributes(1, LineAttributes.PATTERN_SOLID, true));
	    ColoringAttributes ca = new ColoringAttributes(white,ColoringAttributes.SHADE_FLAT);
	    LineAttributes la = new LineAttributes(2, LineAttributes.PATTERN_SOLID, true);
	    app.setColoringAttributes(ca);
	    app.setLineAttributes(la);
		
		// Plain line
	    Point3f[] plaPts = new Point3f[2];
	    plaPts[0] = new Point3f(-0.9f, -0.7f, 0.0f);
	    plaPts[1] = new Point3f(-0.5f, 0.7f, 0.0f);
	    LineArray pla = new LineArray(2, LineArray.COORDINATES);
	    pla.setCoordinates(0, plaPts);
	    Shape3D plShape = new Shape3D(pla, app);
	    rootBG.addChild(plShape);
		
		return rootBG;
	}
}
```

in den bildern seht ihr bei "aufzeichnen" meine linie ohne line Attributes...bei "Aufzeichnen2" mit LineAtributes+AntiAliasinf = true (wieso ist das nun dunkel??) .. und bei "anti", wie der effekt eigentlich sein sollte

könnt ihr mir helfen?

EDIT: 
ok ich bin mal mit dem orbitbehav. "näher ran gegangen"
es scheint mir so das der das aliasing macht... 
aber das neue "layout" der linie führt immernoch zur Annahme, das es pixlig ist...

wieso bleibt die linie nicht einfach weiß, so wie es angegeben wurde....
und wie bekomm ich das hin ???:L



wieder EDIT:

ok ich hab jetzt rumprobiert und getestet.. da noch keiner was geschrieben hat(post ist zugegenermaßen nicht lang her ^^) schreib ich einfach mal meine vermutung ... und hoff, das mir diese jemand bestätigt oder um die ohren haut  

ich denk mir mal das die linie zu "dünn" ist, und aus irgendwelchen gründen die "hauptlinie"(oder besser der "linienstamm") bei einer solchen breite nicht weiß bleibt- oder man sieht es nicht, da die ränder ja durch das  amti-aliasing interpoliert werden...und somit "schwammiger" sind

so das ist meine vermutung ... lieg ich da richtig


----------



## mattn (2. Aug 2010)

Edit geht grad nicht ... naja dann schonmal sry für den doppelpost...
___________________________________________________________


kan man für das primitive objekt "box" *und *für text2d bze 3d antialiasing benutzen
ich hab es über point und line Attributes versucht aber der erfolg = 0

einzig über canvas.getView().setSceneAntialiasingEnable (true);
ging es .. aber da ruckelt die komplette szene, obwohl nur ein würfel ausgegeben wurde...


----------



## truesoul (3. Aug 2010)

Hallo mattn,

das Problem ist das Canvas3D (AWT) halt schon in die Jahre gekommen ist, und es gibt keine möglichkeit Antialiasing gewissermaßen einzustellen.
JCanvas3D ( Swing ) ist da ein wenig besser geeignet bzw  GraphicsConfigTemplate3D bietet meines wissens ein besseres Antialiasing.

Entweder umstellen auf JCanvas3D oder hoffen das bei Grafikkarte Antialiasing aktiviert ist  

P.S JCanvas3D finde ich ein wenig unausgereift, aber das sind nur meine Erfahrung bisher mit JCanvas3D.

Mfg


----------



## mattn (3. Aug 2010)

moin moin 

so wie ich das verstanden habe braucht java3d (leider) explizit das canvas3d
das ist ja das problem...
wenn ich falsch lieg bin ich für verbesserungen offen


----------



## truesoul (3. Aug 2010)

Ja das stimmt , java3d braucht Canvas3D auch mit JCanvas3D, deswegen ein wenig unausgereift finde ich.
Aber bei Antialiasing spielt dann GraphicsConfigTemplate3D eine Rolle , genauso wie bei Canvas3D GraphicsConfiguration eine Rolle spielt.

Java3D ist, wenn es um Antialiasing geht, nicht besondern dolle.


----------



## mattn (3. Aug 2010)

naja zumindestends bekomm ich die linien zum verbinden von objekten schonmal glatt...
aber ich kann mir einfach nicht vorstellen das die es nicht geschafft haben den text2d - bzw den 3dtext und die primitiven objekte halbwegs vernünftig darzustellen... also geklättet....
ist ja nicht wirklich anders als das mit den line bzw pointattributes zu machen -.-


----------



## truesoul (3. Aug 2010)

Naja "glätten" tut er ja, nur das Ergebnis lässt halt zu wünschen übrig.


----------



## mattn (3. Aug 2010)

wenn man das als "geglättet" bezeichnen kann... naja ich weiß ja nciht ... zumindest gehen die linien schonmal in ordnung, das ist aber das einzigste;(

soo ich hab mal bisschen mit den Plygonattributes rumgespielt, besser gesagt mit den polygonMode
wie man unten sieht kommen die pixligen kanten erst beim mode fill .... wenn ich nur die linien ausgeben werden die wie von mir befohlen "schön" gemacht... 
mhh kann ich aus testzwecken mal eine seite "von hand" - manuell füllen


----------



## truesoul (6. Aug 2010)

Beantworte deine Fragen an zwei Fronten 
Habe eine möglichkeit gefunden wie man Kantenglättung perfekt verwenden kann, siehe hier:


```
GraphicsConfigTemplate3D template  = new GraphicsConfigTemplate3D();
        //canves3D = new Canvas3D(config);
template.setSceneAntialiasing(1);
canves3D = new Canvas3D(GraphicsEnvironment.
                                getLocalGraphicsEnvironment().
                                getDefaultScreenDevice().
                                getBestConfiguration(template));
```

java3D APi sagt dazu 



> An Integer indicating the number of passes scene antialiasing requires to render a single frame for this Canvas3D. If this value is zero, scene antialiasing is not supported. If this value is one, multisampling antialiasing is used. Otherwise, the number indicates the number of rendering passes needed.


----------



## truesoul (6. Aug 2010)

truesoul hat gesagt.:


> Hallo mattn,
> 
> das Problem ist das Canvas3D (AWT) halt schon in die Jahre gekommen ist, und es gibt keine möglichkeit Antialiasing gewissermaßen einzustellen.
> JCanvas3D ( Swing ) ist da ein wenig besser geeignet bzw  GraphicsConfigTemplate3D bietet meines wissens ein besseres Antialiasing.
> ...



Achja ^^ das direkt ausm Gedächnis streichen, da ich dir eben die Einstellungsmöglichkeiten aufgezeigt habe


----------



## mattn (6. Aug 2010)

dann lad ich dich aufn bier ein  

naja ich kann die ganze szene mit aliasing ausstatten...

```
c.getView().setSceneAntialiasingEnable(true);
```
_
(ach is ja das selbe wie du geschrieben hast...mist habs vergessen zu posten ...schande über mich :autsch:  )_
nur hat das stark geruckelt.. bis ich mir die rückseite des rechners angesehen habe... onBoard Grafik
dann bin ich an nen rechner mit Grafikkarte gegang... dann ging es ... ... trotzdem schade, das man einzelne Objekte nicht aliasen kann ... egal, geht ja nun ^^


----------



## mattn (18. Aug 2010)

mhh wenn ich mehrere objekte habe... ca 300 und alles aliase. ruckelt der mist trotz gafikkarte....
is doch ein fuck...gibts da nicht noch sachen wo man performance rausholen kann


----------



## truesoul (19. Aug 2010)

Für Perfomance gibt es ein paar Dinge die man machen könnte.
z.B Backface Culling oder LOD.

Ich denke mal , ganze Objekte z.B zu Rendern ist nicht unbedingt von nöten da man die Objekte sowieso nur von einer Seite zu sehen bekommt.(Backface Culling) 
Die Anzahl der Polygone aus die ein Objekt besteht könnte man auch verringern und trotzdem hat man noch ein annehmbare Objekt die man zu sehen bekommt.(Level of Detail)

Dies ist auch mit Java3D möglich 

Mfg


----------



## mattn (19. Aug 2010)

BackfaceCulling ist schon aktiv- bringt ein performance vorteil

zum thema LOD....ich teste noch mit würfeln.. die bestehen nunmal aus 12 p. weniger ist da nicht drin

wenn ich folgendes applet laufen lasse und antialiasing anknips läuft das teil(auch mit Spheres) 1000 mal flüssiger als meins

Applet demo 
______________________________________________
meins

File-Upload.net - demo.zip

______________________________________________
das ruckelt sogar wenn ich nur die eckpunkte ausgeb.... und das dann drehe...muss noch ne andere möglichkeit(statt c.getView().setSceneAntialiasingEnable) geben aliasing einzubauen (line und point aa gehen bei objekten nicht wenn das material auf die Polygone kommt)


----------



## truesoul (19. Aug 2010)

Ja gut antialiasing ist schon sehr Hardwarehungrig.

Es gibt halt noch die möglichkeiten wie DistanceLoD einzusetzen (was bei deinem Code aber unnötig zu sein scheint), ist eine "Unterklasse" von Behavior.
Bei dem Applet demo ist zu sehen , wenn man z.B Spheres oder Surface nimmt , geht selbst meine GraKa auf der Arbeit in die Knie und das ist eine Geforce 260GTX :lol:


Natürlich darf nicht bei einen Würfel es schon ruckeln. Bei mir hats nicht geruckelt übrigens 
Bin übrigens nur mal so rübergeflogen über dein Code, werde es mir morgen nochmals anschauen , da der Feierabend jetzt ruft  

Mfg


----------



## mattn (19. Aug 2010)

mein rechner hier ist ohne graka.. also die is onboard....-da ruckelt mein würfel es wie sau...
bei der demo hat es erst angefangen stark zu ruckeln, wenn ich den schatten mit rein setze...
vorher lief es nicht 100% flüssig aber war absolut akzepabel ---- MIT antialiasing...

wenn ich es mit der großen scene teste geh ich natürlich zu dem rechner mit graka... und da ruckelt es stark (bei 300 würfel mit anialiasing)

also geh ich mal davon aus, das der progger von der demo... das antialiasing anders umgesetzt hat....wenn das bei mir kaum ruckelt und wärend ich mit einem würfel(sogar mir den eckpunkten) probleme habe

schau mal wie flüssig die szene bei dir läuft(die dient bei mir als performance test)

File-Upload.net - gro-.zip


----------

