# Problem beim Zeichnen von LineArrays



## Guest (7. Jan 2008)

Hallo,

Um einige Polygone zu sparen arbeite ich in meiner Java3D Anwendung zusätzlich mit LineArrays. Diese werden genutzt um dünne Verbindungen von Objekten und Selektionsrahmen darzustellen. Die Verbindungslinien werden schwarz gezeichnet, die Selektionsrahmen weiß.
Jetzt hab ich allerdings das Problem, dass im Bild des Canvas schwarze Linien teilweise die weißen Linien überlappen, obwohl sie räumlich gesehen hinter den weißen Linien liegen.
Weiß jemand, woran dieses Problem liegt?


----------



## HaBaLeS (7. Jan 2008)

Vielleicht zeichnest du nicht in der richtigen Reihenfolge. Kann man da nen Z-Index angeben? Die Java3D API kenn ich leider nicht.

Aber nur mal so am rande:
Bist du sicher, das es Sinn manche ein paar Polygone zu sparen ? 
Wie viele willst du denn zeichnen ? 
Also ne total veraltete Gaka (Riva TNT2 ) schafft 6Mio Polygone pro Sekunde. Das wäre bei 50FPS 120000Polygone pro Frame. Bei heutigen Grakas kannste sicher minimum eine extra 0 hinten dranhängen. Also an Polygnen brauchst du sicher nicht sparen.


----------



## Chris82123xyz (8. Jan 2008)

Ist dein Problem jetzt die unterschiedliche Farbe oder das Überlappen?!
Wenn zweiteres, dann hört es sich vielleicht nen bissel einfach an, aber kann es sein, dass du irgendwo nen Farbendreher drin hast, oder irgendwo vergessen hast die Farbe für die "Punkte" zu setzen.


```
lineArray.setColor(position_im_array,new Color3f(0f, 0f, 1f));
```

gruss
chris


----------



## Gast (8. Jan 2008)

Nein. Schwarze Linien werden grundsätzlich über die weißen Linien gezeichnet. 
Beispiel:

eine weiße Linie ist nah an der Kamera und verläuft auf dem Canvas von links nach rechts. Eine zweite schwarze Linie ist sehr viel weiter hinten und verläuft von oben nach unten. An dem Punkt an dem sich die Linien auf dem Bildschirm treffen (im 3D Koordinatensystem treffen sie sich nicht) sollten dann die weiße Linie durchgezogen sein und die schwarze unterbrechen. Es ist aber genau andersrum.


----------



## Chris82123xyz (8. Jan 2008)

Ich hab das gerade mal mit meinem derzeitigem "Projekt" getestet. Da tritt das Problem nicht auf.
Kann dir also auf Anhieb auch nicht weiterhelfen... 
Hast du schonmal testweise die Farben an sich geändert? 
Sonst poste mal deinen Code, vielleicht kann man sich da dann besser reindenken!
gruss
chris


----------



## Guest (8. Jan 2008)

Ok. Ich habe mehrere 3D-Objekte. Alle besitzen einen Rahmen, der durch folgende Methode angelegt wird:


```
private void addSelectionBorder() {
		if (selectionBorder == null) {

			VisuShape3DImpl selectionBorderShape = new VisuShape3DImpl(this);

			Appearance appearSt = new Appearance();
			LineAttributes lineSt = new LineAttributes(3.0f,
					LineAttributes.PATTERN_SOLID, true);
			appearSt.setLineAttributes(lineSt);

			TransparencyAttributes ta = new TransparencyAttributes();
			ta.setTransparencyMode(TransparencyAttributes.BLENDED);
			ta.setTransparency(0.0f);
			appearSt.setTransparencyAttributes(ta);

			LineArray border = new LineArray(48, LineArray.COORDINATES
					| LineArray.COLOR_3);

			Point3d lowerPoint = new Point3d();
			Point3d upperPoint = new Point3d();

			getSelectionBorderBounds().getLower(lowerPoint);
			getSelectionBorderBounds().getUpper(upperPoint);

			border.setCoordinate(0, new Point3d(lowerPoint.x, lowerPoint.y,
					lowerPoint.z));
			border.setCoordinate(1, new Point3d(lowerPoint.x + 0.2,
					lowerPoint.y, lowerPoint.z));

			border.setCoordinate(2, new Point3d(lowerPoint.x, lowerPoint.y,
					lowerPoint.z));
			border.setCoordinate(3, new Point3d(lowerPoint.x,
					lowerPoint.y + 0.2, lowerPoint.z));

			border.setCoordinate(4, new Point3d(lowerPoint.x, lowerPoint.y,
					lowerPoint.z));
			border.setCoordinate(5, new Point3d(lowerPoint.x, lowerPoint.y,
					lowerPoint.z + 0.2));

			border.setCoordinate(6, new Point3d(lowerPoint.x, lowerPoint.y,
					upperPoint.z));
			border.setCoordinate(7, new Point3d(lowerPoint.x + 0.2,
					lowerPoint.y, upperPoint.z));

			border.setCoordinate(8, new Point3d(lowerPoint.x, lowerPoint.y,
					upperPoint.z));
			border.setCoordinate(9, new Point3d(lowerPoint.x,
					lowerPoint.y + 0.2, upperPoint.z));

			border.setCoordinate(10, new Point3d(lowerPoint.x, lowerPoint.y,
					upperPoint.z));
			border.setCoordinate(11, new Point3d(lowerPoint.x, lowerPoint.y,
					upperPoint.z - 0.2));

			border.setCoordinate(12, new Point3d(upperPoint.x, lowerPoint.y,
					lowerPoint.z));
			border.setCoordinate(13, new Point3d(upperPoint.x - 0.2,
					lowerPoint.y, lowerPoint.z));

			border.setCoordinate(14, new Point3d(upperPoint.x, lowerPoint.y,
					lowerPoint.z));
			border.setCoordinate(15, new Point3d(upperPoint.x,
					lowerPoint.y + 0.2, lowerPoint.z));

			border.setCoordinate(16, new Point3d(upperPoint.x, lowerPoint.y,
					lowerPoint.z));
			border.setCoordinate(17, new Point3d(upperPoint.x, lowerPoint.y,
					lowerPoint.z + 0.2));

			border.setCoordinate(18, new Point3d(upperPoint.x, lowerPoint.y,
					upperPoint.z));
			border.setCoordinate(19, new Point3d(upperPoint.x - 0.2,
					lowerPoint.y, upperPoint.z));

			border.setCoordinate(20, new Point3d(upperPoint.x, lowerPoint.y,
					upperPoint.z));
			border.setCoordinate(21, new Point3d(upperPoint.x,
					lowerPoint.y + 0.2, upperPoint.z));

			border.setCoordinate(22, new Point3d(upperPoint.x, lowerPoint.y,
					upperPoint.z));
			border.setCoordinate(23, new Point3d(upperPoint.x, lowerPoint.y,
					upperPoint.z - 0.2));

			border.setCoordinate(24, new Point3d(lowerPoint.x, upperPoint.y,
					lowerPoint.z));
			border.setCoordinate(25, new Point3d(lowerPoint.x + 0.2,
					upperPoint.y, lowerPoint.z));

			border.setCoordinate(26, new Point3d(lowerPoint.x, upperPoint.y,
					lowerPoint.z));
			border.setCoordinate(27, new Point3d(lowerPoint.x,
					upperPoint.y - 0.2, lowerPoint.z));

			border.setCoordinate(28, new Point3d(lowerPoint.x, upperPoint.y,
					lowerPoint.z));
			border.setCoordinate(29, new Point3d(lowerPoint.x, upperPoint.y,
					lowerPoint.z + 0.2));

			border.setCoordinate(30, new Point3d(lowerPoint.x, upperPoint.y,
					upperPoint.z));
			border.setCoordinate(31, new Point3d(lowerPoint.x + 0.2,
					upperPoint.y, upperPoint.z));

			border.setCoordinate(32, new Point3d(lowerPoint.x, upperPoint.y,
					upperPoint.z));
			border.setCoordinate(33, new Point3d(lowerPoint.x,
					upperPoint.y - 0.2, upperPoint.z));

			border.setCoordinate(34, new Point3d(lowerPoint.x, upperPoint.y,
					upperPoint.z));
			border.setCoordinate(35, new Point3d(lowerPoint.x, upperPoint.y,
					upperPoint.z - 0.2));

			border.setCoordinate(36, new Point3d(upperPoint.x, upperPoint.y,
					lowerPoint.z));
			border.setCoordinate(37, new Point3d(upperPoint.x - 0.2,
					upperPoint.y, lowerPoint.z));

			border.setCoordinate(38, new Point3d(upperPoint.x, upperPoint.y,
					lowerPoint.z));
			border.setCoordinate(39, new Point3d(upperPoint.x,
					upperPoint.y - 0.2, lowerPoint.z));

			border.setCoordinate(40, new Point3d(upperPoint.x, upperPoint.y,
					lowerPoint.z));
			border.setCoordinate(41, new Point3d(upperPoint.x, upperPoint.y,
					lowerPoint.z + 0.2));

			border.setCoordinate(42, new Point3d(upperPoint.x, upperPoint.y,
					upperPoint.z));
			border.setCoordinate(43, new Point3d(upperPoint.x - 0.2,
					upperPoint.y, upperPoint.z));

			border.setCoordinate(44, new Point3d(upperPoint.x, upperPoint.y,
					upperPoint.z));
			border.setCoordinate(45, new Point3d(upperPoint.x,
					upperPoint.y - 0.2, upperPoint.z));

			border.setCoordinate(46, new Point3d(upperPoint.x, upperPoint.y,
					upperPoint.z));
			border.setCoordinate(47, new Point3d(upperPoint.x, upperPoint.y,
					upperPoint.z - 0.2));

			border.setColor(0, new Color3f(1f, 1f, 1f));
			border.setColor(1, new Color3f(1f, 1f, 1f));
			border.setColor(2, new Color3f(1f, 1f, 1f));
			border.setColor(3, new Color3f(1f, 1f, 1f));
			border.setColor(4, new Color3f(1f, 1f, 1f));
			border.setColor(5, new Color3f(1f, 1f, 1f));
			border.setColor(6, new Color3f(1f, 1f, 1f));
			border.setColor(7, new Color3f(1f, 1f, 1f));
			border.setColor(8, new Color3f(1f, 1f, 1f));
			border.setColor(9, new Color3f(1f, 1f, 1f));
			border.setColor(10, new Color3f(1f, 1f, 1f));
			border.setColor(11, new Color3f(1f, 1f, 1f));
			border.setColor(12, new Color3f(1f, 1f, 1f));
			border.setColor(13, new Color3f(1f, 1f, 1f));
			border.setColor(14, new Color3f(1f, 1f, 1f));
			border.setColor(15, new Color3f(1f, 1f, 1f));
			border.setColor(16, new Color3f(1f, 1f, 1f));
			border.setColor(17, new Color3f(1f, 1f, 1f));
			border.setColor(18, new Color3f(1f, 1f, 1f));
			border.setColor(19, new Color3f(1f, 1f, 1f));
			border.setColor(20, new Color3f(1f, 1f, 1f));
			border.setColor(21, new Color3f(1f, 1f, 1f));
			border.setColor(22, new Color3f(1f, 1f, 1f));
			border.setColor(23, new Color3f(1f, 1f, 1f));
			border.setColor(24, new Color3f(1f, 1f, 1f));
			border.setColor(25, new Color3f(1f, 1f, 1f));
			border.setColor(26, new Color3f(1f, 1f, 1f));
			border.setColor(27, new Color3f(1f, 1f, 1f));
			border.setColor(28, new Color3f(1f, 1f, 1f));
			border.setColor(29, new Color3f(1f, 1f, 1f));
			border.setColor(30, new Color3f(1f, 1f, 1f));
			border.setColor(31, new Color3f(1f, 1f, 1f));
			border.setColor(32, new Color3f(1f, 1f, 1f));
			border.setColor(33, new Color3f(1f, 1f, 1f));
			border.setColor(34, new Color3f(1f, 1f, 1f));
			border.setColor(35, new Color3f(1f, 1f, 1f));
			border.setColor(36, new Color3f(1f, 1f, 1f));
			border.setColor(37, new Color3f(1f, 1f, 1f));
			border.setColor(38, new Color3f(1f, 1f, 1f));
			border.setColor(39, new Color3f(1f, 1f, 1f));
			border.setColor(40, new Color3f(1f, 1f, 1f));
			border.setColor(41, new Color3f(1f, 1f, 1f));
			border.setColor(42, new Color3f(1f, 1f, 1f));
			border.setColor(43, new Color3f(1f, 1f, 1f));
			border.setColor(44, new Color3f(1f, 1f, 1f));
			border.setColor(45, new Color3f(1f, 1f, 1f));
			border.setColor(46, new Color3f(1f, 1f, 1f));
			border.setColor(47, new Color3f(1f, 1f, 1f));

			selectionBorderShape.setAppearance(appearSt);
			selectionBorderShape.addGeometry(border);

			selectionBorder = new BranchGroup();
			selectionBorder.setCapability(BranchGroup.ALLOW_DETACH);
			selectionBorder.addChild(selectionBorderShape);
		}
		getTransform().addChild(selectionBorder);
	}
```

Dann haben einige Objekte neben Polygonen noch zusätzlich Linien. Ein Beispiel hier:


```
public void createRahmen() {
		Appearance appearSt = new Appearance();
		LineAttributes lineSt = new LineAttributes(3.0f,
				LineAttributes.PATTERN_SOLID, true);
		appearSt.setLineAttributes(lineSt);

		VisuShape3DImpl shape = new VisuShape3DImpl(this);

		shape.setName(getName());
		LineArray border = new LineArray(24, LineArray.COORDINATES
				| LineArray.COLOR_3);
		border.setCoordinate(0, new Point3d(l / 2, -w / 2, h + 0.001));
		border.setCoordinate(1, new Point3d(l / 2, w / 2, h + 0.001));

		border.setCoordinate(2, new Point3d(l / 2, w / 2, h + 0.001));
		border.setCoordinate(3, new Point3d(-l / 2, w / 2, h + 0.001));

		border.setCoordinate(4, new Point3d(-l / 2, w / 2, h + 0.001));
		border.setCoordinate(5, new Point3d(-l / 2, -w / 2, h + 0.001));

		border.setCoordinate(6, new Point3d(-l / 2, -w / 2, h + 0.001));
		border.setCoordinate(7, new Point3d(l / 2, -w / 2, h + 0.001));

		border.setCoordinate(0, new Point3d(l / 2, -w / 2, 1));
		border.setCoordinate(1, new Point3d(l / 2, w / 2, 1));

		border.setCoordinate(2, new Point3d(l / 2, w / 2, 1));
		border.setCoordinate(3, new Point3d(-l / 2, w / 2, 1));

		border.setCoordinate(4, new Point3d(-l / 2, w / 2, 1));
		border.setCoordinate(5, new Point3d(-l / 2, -w / 2, 1));

		border.setCoordinate(6, new Point3d(-l / 2, -w / 2, 1));
		border.setCoordinate(7, new Point3d(l / 2, -w / 2, 1));

		border.setCoordinate(8, new Point3d(l / 2, w / 2, 0));
		border.setCoordinate(9, new Point3d(l / 2, w / 2, 1));

		border.setCoordinate(10, new Point3d(l / 2, -w / 2, 0));
		border.setCoordinate(11, new Point3d(l / 2, -w / 2, 1));

		border.setCoordinate(12, new Point3d(-l / 2, w / 2, 0));
		border.setCoordinate(13, new Point3d(-l / 2, w / 2, 1));

		border.setCoordinate(14, new Point3d(-l / 2, -w / 2, 0));
		border.setCoordinate(15, new Point3d(-l / 2, -w / 2, 1));

		border.setCoordinate(16, new Point3d(l / 2, -w / 2, 0 + 0.01));
		border.setCoordinate(17, new Point3d(l / 2, w / 2, 0 + 0.01));

		border.setCoordinate(18, new Point3d(l / 2, w / 2, 0 + 0.01));
		border.setCoordinate(19, new Point3d(-l / 2, w / 2, 0 + 0.01));

		border.setCoordinate(20, new Point3d(-l / 2, w / 2, 0 + 0.01));
		border.setCoordinate(21, new Point3d(-l / 2, -w / 2, 0 + 0.01));

		border.setCoordinate(22, new Point3d(-l / 2, -w / 2, 0 + 0.01));
		border.setCoordinate(23, new Point3d(l / 2, -w / 2, 0 + 0.01));

		border.setColor(0, new Color3f(0f, 0f, 0f));
		border.setColor(1, new Color3f(0f, 0f, 0f));
		border.setColor(2, new Color3f(0f, 0f, 0f));
		border.setColor(3, new Color3f(0f, 0f, 0f));
		border.setColor(4, new Color3f(0f, 0f, 0f));
		border.setColor(5, new Color3f(0f, 0f, 0f));
		border.setColor(6, new Color3f(0f, 0f, 0f));
		border.setColor(7, new Color3f(0f, 0f, 0f));
		border.setColor(8, new Color3f(0f, 0f, 0f));
		border.setColor(9, new Color3f(0f, 0f, 0f));
		border.setColor(10, new Color3f(0f, 0f, 0f));
		border.setColor(11, new Color3f(0f, 0f, 0f));
		border.setColor(12, new Color3f(0f, 0f, 0f));
		border.setColor(13, new Color3f(0f, 0f, 0f));
		border.setColor(14, new Color3f(0f, 0f, 0f));
		border.setColor(15, new Color3f(0f, 0f, 0f));
		border.setColor(16, new Color3f(0f, 0f, 0f));
		border.setColor(17, new Color3f(0f, 0f, 0f));
		border.setColor(18, new Color3f(0f, 0f, 0f));
		border.setColor(19, new Color3f(0f, 0f, 0f));
		border.setColor(20, new Color3f(0f, 0f, 0f));
		border.setColor(21, new Color3f(0f, 0f, 0f));
		border.setColor(22, new Color3f(0f, 0f, 0f));
		border.setColor(23, new Color3f(0f, 0f, 0f));
		shape.setAppearance(appearSt);
		shape.addGeometry(border);
		getTransform().addChild(shape);
	}
```

Im ersten Beispiel werden weiße, im zweiten schwarze Linien erzeugt.[/img]


----------



## Guest (8. Jan 2008)

Hier mal drei Beispielbilder:

















Alle drei Bilder zeigen das selbe 3D-Objekt, das mit schwarzen Linien versehen ist. Die weißen Linien (siehe roten Pfeil) sind die Selektion. wenn man sich alle drei Bilder ansieht, kann man erkennen, dass manche Linien Falsch überlappen.


----------



## Marco13 (8. Jan 2008)

Schau mal hier
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4487706

Vielleicht hilft das ja schon. Evtl. ist das Problem mit
view.setTransparencySortingPolicy(View.TRANSPARENCY_SORT_GEOMETRY);
schon behoben... Andernfalls ... die Linien sind ja sowieso nicht transparent, da kannst du die Transparenz auch ganz ausschalten, was das Problem auf jeden Fall lösen sollte.....


----------



## Gast (8. Jan 2008)

Transparenz hab ich komplett rausgenommen und view.setTransparencySortingPolicy(View.TRANSPARENCY_SORT_GEOMETRY);  gesetzt. Das Problem ist allerdings immer noch da. Wenn ich Antialising bei der weißen Linie deaktiviere wird alles richtig angezeigt.


----------



## Gast (8. Jan 2008)

View.setDepthBufferFreezeTransparent(false); hat das Problem offenbar behoben. Danke für die Hilfe.


----------

