# Shape Geometry, wird nicht angezeigt



## ameisengehirn (4. Sep 2011)

Hallo nochmal 

Ich habe nun folgendes Problem beim auslesen der Geometry aus der Datenbank:

Die Geometry Attribute speichere ich als Text in der Datenbank, da es sich um ein TriangleStripArray handelt welches beliebig lang sein kann.

der String der Geomtry entspricht genau dem gleichen String wie beim Auslesen vor dem Speichern in der Datenbank. Den Text der aus der Datenbank geholt wird speichere ich so in der Shape:


```
if (shapeBean.getGeometryType().equals("TriangleStripArray")) {
			GeometryBean geometryBean = ModelRetrieveDAO.getGeometry(shapeBean.getShapeID());
			String coordinates = geometryBean.getCoordinates();
			System.out.println("gelesen: " + coordinates);
			double[] coordinatesArray = getCoordinates(coordinates);
			int vertexCount = coordinatesArray.length;
			
			TriangleStripArray quadArray = null;
			if (vertexCount > 2) {
				quadArray = new TriangleStripArray(vertexCount, TriangleStripArray.COORDINATES, new int[] { vertexCount });
				for (int i = 0; i < vertexCount; i++) {
					quadArray.setCoordinate(i, coordinatesArray);
				}
			}
			if (quadArray != null) {
				shape.setGeometry(quadArray);

//das benutze ich um die Geometry zu vergleichen, bzw diese Methode dient zum auslesen der Geometry beim Parsen des universums um die Geometry in die Datanbank speichern zu können
				Geometry geometry = (Geometry) shape.getAllGeometries().nextElement();
				GeometryArray geometryArray = (GeometryArray) geometry;
				StringBuilder geometryStringBuilder = new StringBuilder();
				int arrayLength = geometryArray.getValidVertexCount();
				double[] coordinatesArray2 = new double[arrayLength];

				for (int i = 0; i < arrayLength; i++) {
					geometryArray.getCoordinate(i, coordinatesArray2);
					double coordinateDouble = coordinatesArray2[i];
					String coordinateString = Double.toString(coordinateDouble);
					geometryStringBuilder.append(coordinateString + " ");
				}

				String geometryCoordinates = geometryStringBuilder.toString();
				System.out.println("eingegeben: " + geometryCoordinates);	
			}
```

Wenn ich nun die Shapes in einen SceneGraph stecke wird absolut nichts angezeigt...

Danke für eure Tipps!


----------



## Marco13 (4. Sep 2011)

Zu wenig code, zu wenig Deug-Ausgaben. Wenn du GENAU an der gleichen Stelle einen ColorCube oder s anhängst, siehst du den dann? Gibt's ein KSKB und ggf. Eingabedaten?


----------



## ameisengehirn (5. Sep 2011)

Hallo,

Ja, wenn ich einen colorcube mit reinhänge ist dieser zu sehen.
Ich speichere die geometry in einer Datenbank. Nach dem lesen aus der DB und dem erzeugen des triangleStripArray steht in der shape die gleiche geometry wie beim Auslesen vor dem Speichern (also beim initialen Lesen vor der Transferierung in die DB) 

Generell ist die Frage ob ich jeden Punkt einzeln in der DB speichern müsste, was bei meinen Modellen sehr schlecht wäre (Dauer: > 10 Minuten)

Ich verstehe nur nicht warum die shape nicht angezeigt wird wenn doch die gleiche Geo Information vorhanden ist wie beim Lesen ohne Datenbank.

Ich habe die shapes auch schon durch harte Codierung rot gefärbt, es liegt also auch nicht an fehlenden Texturen.

Danke für deine Antwort!


----------



## Marco13 (5. Sep 2011)

Viel mehr als dass du irgendwas in eine Datenbank schreibst und liest und dass etwas nicht angezeigt wird, ist bisher nicht klar geworden. Ich kann dir da nicht helfen. (Wenn du den Fehler gefunden hast, schau' dir diesen Thread nochmal an....)


----------



## ameisengehirn (5. Sep 2011)

So, vielleicht nochmal etwas mehr Informationen, im Parser iteriere ich über den SceneGraph, sobald eine Shape gefunden wurde:



```
Geometry geometry = (Geometry) shape.getAllGeometries().nextElement();
				GeometryArray geometryArray = (GeometryArray) geometry;
		StringBuilder geometryStringBuilder = new StringBuilder();
		int arrayLength = geometryArray .getValidVertexCount();
		double[] coordinatesArray = new double[arrayLength];

		for (int i = 0; i < arrayLength; i++) {
			geometryArray .getCoordinate(i, coordinatesArray);
			double coordinateDouble = coordinatesArray[i];
			String coordinateString = Double.toString(coordinateDouble);
			geometryStringBuilder.append(coordinateString + " ");
		}

		String geometryCoordinates = geometryStringBuilder.toString(); //(**)
```

Dieser (**) String wird dann in der Datenbank gespeichert, er hat zB die Form:


```
-70.76227569580078 59.15898132324219 487.2047119140625 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
```

Diese String hole ich dann aus der Datenbank wenn nötig und erstelle das TriangleStripArray wie oben beschrieben. Lese ich nach dem erstellen die Shape testweise gleich wieder aus, steht eben genau dieser String wieder in der Geometry.


----------



## ameisengehirn (5. Sep 2011)

ich habe nun die Taktik geändert und das TriangleStripArray direkt ausgelesen. (Ein String für Normals und ein String für Points)


```
GeometryBean geometryBean = new GeometryBean();
		StringBuilder pointStringBuilder = new StringBuilder();
		StringBuilder vectorStringBuilder = new StringBuilder();
		StringBuilder stripStringBuilder = new StringBuilder();
		StringBuilder textureStringBuilder = new StringBuilder();
		
		if (geometryToSplit instanceof TriangleStripArray) {

			TriangleStripArray triangleStripArray = (TriangleStripArray) geometryToSplit;
			int vertexCount = triangleStripArray.getValidVertexCount();
				
			int[] texCoordSet = new int[triangleStripArray.getTexCoordSetMapLength()]; 
			triangleStripArray.getTexCoordSetMap(texCoordSet);
			
			for (int i = 0; i < texCoordSet.length; i++) {
				System.out.println(texCoordSet[i]);
			}
			
			Point3f point = new Point3f();

			for (int i = 0; i < vertexCount; i++) {
				triangleStripArray.getCoordinate(i, point);
				float[] pointValues = new float[3];
				point.get(pointValues);
				pointStringBuilder.append(replace(point.toString() + " "));
			}
			
			Vector3f vector = new Vector3f();

			for (int i = 0; i < vertexCount; i++) {
				triangleStripArray.getNormal(i, vector);
				float[] normalValues = new float[3];
				vector.get(normalValues);
				vectorStringBuilder.append(replace(vector.toString() + " "));
			}
			
			int stripCount = triangleStripArray.getNumStrips();
			int[] stripVertexCounts = new int[stripCount];

			for (int i = 0; i < stripCount; i++) {
				triangleStripArray.getStripVertexCounts(stripVertexCounts);
			}

			for (int i = 0; i < stripVertexCounts.length; i++) {
				stripStringBuilder.append(stripVertexCounts[i] + " ");
			}
			
			String points = pointStringBuilder.toString();
			String normals = vectorStringBuilder.toString();
			String strips = stripStringBuilder.toString();
			String textures = textureStringBuilder.toString();
			
			System.out.println("tex " + textures);
			
			geometryBean.setPoints(points);
			geometryBean.setNormals(normals);
```

Beim wieder zusammensetzen mache ich das ganze so:


```
Shape3D shape = new Shape3D();
		GeometryBean geometryBean = ModelRetrieveDAO.getGeometry(shapeBean.getShapeID());

		String points = geometryBean.getPoints();
		String normals = geometryBean.getNormals();
		String strips = geometryBean.getStrips();
		String[] pointsArray = null;

		if (points != null) {

                        // String auf richtiges Format bringen
			pointsArray = getStringArray(points);

			String[] normalsArray = getStringArray(normals);
			int[] stripsArray = intArray(strips);
			List<Point3f> pointList = new ArrayList<Point3f>();
			List<Vector3f> normalList = new ArrayList<Vector3f>();

			for (int i = 0; i < pointsArray.length; i++) {
				pointsArray[i] = replace(pointsArray[i]);
				String[] token = pointsArray[i].split(":");
				for (int j = 0; j < token.length; j++) {
					float[] pointValues = new float[3];
					pointValues[j] = Float.valueOf(token[j]);
					Point3f point = new Point3f(pointValues);
					pointList.add(point);
				}
			}

			for (int i = 0; i < normalsArray.length; i++) {
				normalsArray[i] = replace(normalsArray[i]);
				String[] token = pointsArray[i].split(":");
				for (int j = 0; j < token.length; j++) {
					float[] normalValues = new float[3];
					normalValues[j] = Float.valueOf(token[j]);
					Vector3f point = new Vector3f(normalValues);
					normalList.add(point);
				}
			}

			Point3f[] pointArray = new Point3f[pointList.size()];
			for (int i = 0; i < pointList.size(); i++) {
				pointArray[i] = pointList.get(i);
			}

			Vector3f[] normalArray = new Vector3f[normalList.size()];
			for (int i = 0; i < normalList.size(); i++) {
				normalArray[i] = normalList.get(i);
			}

			TriangleStripArray triangleStripArray = new TriangleStripArray(pointList.size(), TriangleStripArray.COORDINATES | TriangleStripArray.NORMALS, stripsArray);
			triangleStripArray.setCoordinates(0, pointArray);
			triangleStripArray.setNormals(0, normalArray);
			shape.setGeometry(triangleStripArray);
```

Hierbei wird mir jetzt allerdings JEDES Model angezeigt wie auf dem folgenden Screenshot:







und hier so wie es sein sollte (Texturen sind ja einstweilen egal)






Ich habe keine Ahnung warum das so ist... ;(


----------



## Marco13 (5. Sep 2011)

Ohne ein compilierbares Beispiel mit Testdaten wird da kaum einer was dazu sagen können. Selbst MIT könnte der Aufwand noch so hoch sein, dass keiner sich das antut (das Forum ist kein Remote-Debugger). Aber vielleicht ist ja jemandem sehr, sehr langweilig.


----------

