# Kompliziertes 3D-Objekt



## Heiko444 (21. Dez 2005)

Hallo,


ich habe ein Programm für eine Holzfraesmaschine geschrieben. Jetzt möchte ich zusätzlich eine Grafiksimulation einbinden. Das heisst das ich anhand der programmierten Daten für die Fraesmaschine das Werkstück zeichnen möchte, so wie es laut der Programmierung aussehen soll.

Die Programmierung der Maschine läuft so ab,  ich teile dem Fraeser Koordinaten mit, zu denen er fahren soll.
Diese Koordinaten sind dann die Grundlage für die Zeichnung.

Ich weiss ehrlich gesagt nicht genau wo ich anfangen soll, ich habe schon mehrere Ideen gehabt.

Ist es möglich zB als erstes das Rohmaterial zu definieren zB 100*50*30 dieses dann als Box zu zeichnen
und dann den Fraeser zu zeichnen und diesen die Programmierten Wege abfahren lassen. Dort wo der Fraeser die Box beruehrt soll sie transparent werden. Jetzt ist aber das Problem das die Box nur aus Seiten besteht und nicht vollständig "gefüllt ist".
Wie kann ich das am besten lösen, oder hat jemand einen anderen Ansatz?

Bin für jede Hilfe dankbar


MfG  Heiko


----------



## MPW (31. Dez 2005)

Also, das was du da vorhast ist nicht ganz trivial, aber wir kriegen das hin:

1. Willst du zeigen(im Sinne von Animation), wie der Fräser dein 3DTeil erstellt, oder willst du nur das fertige Teil haben?

2. In welchem Format werden die Koordinaten gespeichert, ich würde mir einen Loader suchen oder einen schreiben, der daraus ein Sharp3D Objekt macht. Das kannst du dann mit Farbe etc. füllen.
(Wenn 1 zutrifft, würde ich es trotzdem so machen, und die Teile die dann wegfallen, von vorneherein getrennt machen, sodass diese dann einfach ausgeblendet werden können)

Vollständige Boxen, weiß ich garnicht ob's sowas gibt, aber man kann irgendwie das so machen, dass die von innen und von außen gezeichnet werden, das müsste dann gehen.


----------



## Guest (31. Dez 2005)

HAllo,

ich habe vor nur das fertige Teil zu zeichnen.

Die Daten liegen in Form eines Programmtextes vor.

Beispiel:

G1 X20 Y-5 Z10  (fahre nach Punkt P(20, -5, 10))
G1 x30               (fahre nach P2(30, -5, 10))
G1 Z0
.
.
.


ich hab jetzt schon versucht diese Daten zu verarbeiten, da aber beim Fräsen nicht direkt dieendgültige Form gefräst wird, sondern immer Schritt fürSchritt einzelne Schichten abgetragen werden ist mir kein sinnvoller Algorithmus eingefallen, der diese Daten sinnvoll verarbeitet um das fertige Stück zu zeichnen!?


Schon mal vielen Dank für deine Mühe.

MfG Heiko


----------



## MPW (31. Dez 2005)

Also das wird wohl auch nicht ganz einfach,

hat das programm vllt. noch einen anderen Exportmodus, also bei uns an der Schule wird das so gemacht, dsa das in AutoCAD gezeichnet wird und diese Formen kann man sehr gut mit Java3D einlesen.

Mit deinen Koordinaten da wird's schwer, da man das ganze erst komplex simulieren müsste.


----------



## Heiko444 (1. Jan 2006)

Hallo,

das Programm hat leider keinen anderen Exportmodus, es steht lediglich als Programmtext zur Verfügung.

Das Problem ist ja die Koordinaten bzw Vektoren des fertigen Teils zu ermitteln.


MfG  Heiko444


----------



## MPW (1. Jan 2006)

Genau, das hätte ich ja umgehen wollen durch einen anderen Exportmodus^^

Kannst du mal einen kompletten Satz eines leichten(Quader oder so) und eines mittelkomplexen Models posten, wenn man konkrete Werte hat lässt sich's leichter über einen Algorithmus nachdenken.

Wie genau funktioniert diese Fräse eigentlich, ich meine welche dicke fräst die, weil deine Koordinaten stellen ja nur Striche ohne dicke dar, das ist ja in Reality nicht umsetzbar.

Also die einzige Variante die mir einfallen würde:

Mach einen digitalen Klotz aus 1000(0) * 1000(0) * 1000(0) Würfelchen mit den längen 1x1x1
() je nach Rechenleistung
Nun lässt du stück für stück deine Fräse da durchfahren und löscht alles Würfelchen, die berührt werden.


----------



## Heiko444 (2. Jan 2006)

Hallo,

die Idee mit dem digitalen Klotz hatte ich auch schon, ich habe mir eine Klasse geschrieben, die einen Würfel erzeugt.
Von dieser Klasse habe ich dan aus einer anderen Klasse heraus in einer Schleife versucht ca 1Millionen Würfel zu erzeugen und diese mit Hilfe von geeigneten Transformationen zu einem größeren Klotz zusammenzusetzen.
Allerdings kann ich nichtmal hunderttausend Würfel erzeugen, da dann irgend ein virtueller Speicher voll ist???


Nun mal zu dem Fräsprogramm:



Als erstes stehen einige Definitionen, z.B. welcher Fräser soll genommen werden, welche Drehzahl welcher Vorschub usw.
Dann , wird der weg programmiert den der Fräser abfahren soll


G0 x0 y0 z0     (G0 heißt fahre mit maximalem Vorschub zu Punkt P(0,0,0))
G1 x10 y0 z0            (G1 heißt fahre in zuvor angegebenen Arbeitsvorschub zu Punkt  P(10,0,0))
G1 z-10
G1 x0
G1 z-20

 //Bis hierhin wurde praktische das Rohmaterial überfraest. Bei den Maschinen ist es so geregelt, das man in einer Zeile nur Koordinaten angeben muss die sich geändert haben die andern werden dann beibehalten.
Ausserdem ist das Koordinatensystem so geregelt, das X und Z die Horizontalen Ebenen darstellen (X rechts links, Z vor zurück)  und Y ist für die Tiefe zuständig) .
Da ich ja bis jetz nur das Rohmaterial oben drauf abgefraest habe um eine ebene Oberfläche zu erhalten,
programmiere ich im Folgenden mal ein einfaches werkstück. (Eine Box mit 1mm Fase an den Seiten)


G0 Y20      (Im EIlgang 20mm hoch um beim Positionieren nicht mit dem Werkstück zu kollidieren)
G0 x-10 y-20 z0 (An die Stelle X-10 und Z0 fahren und 20mm nach unten eintauchen)
G1 x0 
G1 z-19
G1 X1 Z-20
G1 x9
G1 x10 z-19
g1 z-1
g1 x9 z0
g1 x1
g1 x0 z-1
g0 y20


//Das wars!!

Dadurch das der Fraeser auf eine bestimmte Tiefe fährt und die daraufvolgenden Lienien abfährt,
ergibt sich dann das fertige Werkstück.
Mit hilfe der Funktionen G2 und G3 können außerdem Radien bzw Kreisausschnitte gefraest werden. Außerdem gibt es noch Funktionen für Kreistaschen und Nuten usw. 
 Die schwierigkeit betseht ja darin zu erkennen wie das Endstück aussieht.
In dem Beispiel bin ich ja direkt auf Tiefe -20 gefahren, ich hätte aber auch erst auf -10 dann die Koordinaten abfahren dann auf -20 und nochmal abfahren.


Die beste Lösung wäre ja wirklich mit den einzelnen Würfeln, aber wie umgehe ich den Speicherüberlauf??
Ich meine das Größte Rohmaterial was bearbeitet werden kann ist
600*400*200 und da ich auch Radien darstellen muss sollten die Würfel nicht zu Groß sein um eine einigermassen erkennbare Grafik zu erzeugen also höchstens eine Kantenlänge von 1mm haben.


Nochmal vielen Dank für deine Mühe

MfG  Heiko444


----------



## MPW (2. Jan 2006)

wooosa, das wird ja immer schwieriger....

Also, hast du 3D Kuben gemacht? Das geht garnicht, der Speicherbedarf ist unberechenbar. Wenn überhaupt musst du dir eine eigene kleine 3DMatrix schreiben, die aber nur virtuell und nicht sichtbar ist, das kann schon eher klappen.
Vllt alla:

```
class Cube {
public Cube(int x, int y, int z) {
//x, y, z können z.B. die linke obere Ecke definieren.
}
}
```

Dann brauchst du noch Methoden zu Kollisonsdetektion, würde ich aber außerhalb machen.
Mir fällt gerde ein, dass Objekte vllt. doch keine so gute Idee sind, da sie mehr speicher fressen. Vielleicht machst du's einfach in riesige arrays? Weil diei Objekte müsstest du selber sowieso wieder in Arrays speichern, da sie einem BrenchGraph zu adden sowieso nicht klappt. Die Performence kann höchstens ein Großcomputer bringen.

Ich stimme dir zu, dass der Würfel nicht zu groß sein sollte, sind 600x400x200 cm? Dann hätte man 48 Milliarden Objekte, das klappt nie. Wenn überhaupt geht das mit Arrays. Und dann machst du das am Besten in einem boolean[600][400][200] 
Die setzt du auf true und wenn sie berührt werden auf false.
Die Arrayindices sind dann automatisch die Positionen.

Ich kann mir aber immer noch nicht vorstellen, dass das klappen soll.


----------



## MPW (2. Jan 2006)

Also, selbst mit boolean[][][] klappt es nicht.
600x400x200 geht noch, aber selbst mal 5 und nicht mal 10 funktioniert nicht mehr.

Weiß jemannd wie man den Speicherbedarf erhöhen kann? Ich fürchte aber soviel wird man nie zusammenbekommen, da ein Hauptspeicher von 512 das garnicht zu verfügung stellen kann, selbst wenn nur 0 und 1 vergeben würden.

Du könntest jetzt höchstens mal an der 600x400x200 Implementierung arbeiten.


```
class Cubes {
	public static void main(String args[]) {
		boolean b[][][] = new boolean[600][400][200];
		for (int i = 0; i < b.length; i++) {
			for (int p = 0; p < b[i].length; p++) {
				for (int q = 0; q < b[i][p].length; q++) {
					b[i][p][q] = true;
				}
			}
		}
	}
}
```


Also, ich würde vorschlagen, du versuchst dich mal daran, und wenn du nachher wirklich das ganze noch erhöhren willst, musst du das in 8 abläufen machen, dann hast du die doppelte Genauigkeit(0,5 cm). Wenn du wirklich 1 mm haben willst, musst du 1000 abläufe machen.

Und noch was:

Du brauchst sowieso nachdem du deine virtuelle Fräse drüber gejagt hast noch einen Algorithmus, wie man daraus einen Shape3D machen könnte.
Ich empfehle vielleicht Triangles zu machen, mehr fällt mir nicht ein;-) und dann daraus einen Shape3D.


----------



## Heiko444 (2. Jan 2006)

Hallo,

600*400*200 sind mm Angaben.

Also nicht ganz so riesig.

Ich werd mich jetzt wohl mal an einen Versuch begeben.


MfG Heiko444


----------



## MPW (2. Jan 2006)

Heiko444 hat gesagt.:
			
		

> Hallo,
> 
> 600*400*200 sind mm Angaben.
> 
> ...



*Das ist mir, als ich nochmal so drüber nachdachte auch eingefallen, denn das andere wären ja 6x4x2 m gewesen;-)*

Ich bin auf noch eine Schwierigkeit gestoßen:
Sägst du jedes einzeln weg, oder kann es auch passieren, dass mal ganze Blöcke wegfallen, die von der Säge aber garnicht behandelt wurden?

Wenn ja, musst du das Shape3D Objekt rekursiv von der Mitte aus aufbauen und nur alles was Kontakt zu Mitte hat mit einbeziehen, dann bleiben die Randbezirke übrig.


----------



## Beni (2. Jan 2006)

Beim Start des Programmes "java -Xmx512M dasProgramm" schreiben, und schon hat man 512 MB Speicher anstelle der üblichen 64 zur Verfügung :wink:


----------



## Heiko444 (2. Jan 2006)

Hallo

ich muss immer alle Blöcke wegfraesen,  alles was der Fraeser nicht beruehrt bleibt also stehen, da das Werkstück in einem Schraubstock eingespannt ist und erst in einer zweiten Aufspannung  evt überflüssige Teile wegfallen würden, 
da der Teil der im Schraubstock ist ja nicht bearbeitet werden kann. 


Mfg Heiko444


----------



## Bleiglanz (2. Jan 2006)

ich würds mal anders rum versuchen

du zerlegst deinen Quader in Schichten, d.h einzelne Ebenen

interessant sind ja nur die "Tiefen" Y, zu denen deine Fräse überhaupt eintaucht - lassen wir mal "Schrägen", bei denen das Werkzeug oder das Werkstück um 45Grad gedreht wird lieber weg

das könnte man dann über einfache Polygonzüge in einer 2D Ebene festhalten (mal vom innen-aussen-Problem) abgesehen; diese einzelnen Ebenen für die vorhandenen Tiefen könnte man dann "irgendwie" auch wieder mit einem komplizierten Algorithmus wieder zu einem 3D Modell zusammensetzen

würde wohl weniger Speicher verbraten 


vielleicht hilft dir auch

http://www.geocities.com/danbalby/

oder google mal nach Java3D und "boolean operations", da gibts schon einige, die aus einem Quader z.B. einen Würfel ausschneiden können


----------



## MPW (2. Jan 2006)

^^das sieht Vielversprechend aus.

Die 2D goes 3D Variante in Schichten finde ich persönlich nicht so toll, da das Kanten geben wird.

ein anderes Problem ist noch, wenn man mehrere Male hintereinander den Quader bearbeiten will, also ich glaube sowas fertiges zu nehmen, ist da doch eine sehr gute Idee!


----------



## Guest (4. Jan 2006)

Hallo,

nach zwei Tagen harter Arbeit habe ich das Problem so gut wie gelöst, also der Tipp mit den boolean Operations
war der Durchbruch.

Jetzt gilt es nur noch eins zu tuen, wie kann ich das Universum neu zeichnen lassen bzw updaten.

Ich habe einen Butten über den ich die Simulation schrittweise durchführen lassen kann, allerdings muss ich ja jedes mal neu zeichnen lassen, aber wie??


MfG Heiko444


Und nochmal vielen Dank für eure Hilfe


----------



## MPW (5. Jan 2006)

Cool,

also das Java3D Universum zeichnet sich normalerweise selbst neu, du koenntest hoechstens versuchen die Canvas3D neuzuzeichnen.

Kannst du mal eine Version veroeffentlichen, vllt. mit einem Koordinatensatz zum Testen, das hoert sich alles sehr interessant an.


----------

