Java3d Linie mit Antialiasing geht nicht ???

mattn

Aktives Mitglied
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)

Java:
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 :D

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
 

Anhänge

  • Aufzeichnen.JPG
    Aufzeichnen.JPG
    8,8 KB · Aufrufe: 39
  • anti.jpg
    anti.jpg
    23,3 KB · Aufrufe: 44
  • Aufzeichnen2.JPG
    Aufzeichnen2.JPG
    9,2 KB · Aufrufe: 41
Zuletzt bearbeitet:

mattn

Aktives Mitglied
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...
 
Zuletzt bearbeitet:

truesoul

Top Contributor
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

Aktives Mitglied
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

Top Contributor
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

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

mattn

Aktives Mitglied
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
 

Anhänge

  • Aufzeichnen.JPG
    Aufzeichnen.JPG
    15,4 KB · Aufrufe: 38
  • 1.JPG
    1.JPG
    27,9 KB · Aufrufe: 38
  • 2.JPG
    2.JPG
    14,4 KB · Aufrufe: 42
Zuletzt bearbeitet:

truesoul

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

Java:
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

Top Contributor
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

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

mattn

Aktives Mitglied
dann lad ich dich aufn bier ein ;)

naja ich kann die ganze szene mit aliasing ausstatten...
Java:
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

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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)
 
Zuletzt bearbeitet:

truesoul

Top Contributor
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

Aktives Mitglied
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
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben