Kompliziertes 3D-Objekt

Status
Nicht offen für weitere Antworten.

Heiko444

Mitglied
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

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

Guest

Gast
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

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

Mitglied
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

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

Mitglied
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

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

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

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

Mitglied
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

Top Contributor
Heiko444 hat gesagt.:
Hallo,

600*400*200 sind mm Angaben.

Also nicht ganz so riesig.

Ich werd mich jetzt wohl mal an einen Versuch begeben.


MfG Heiko444

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.
 
B

Beni

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

Heiko444

Mitglied
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

Gesperrter Benutzer
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

Top Contributor
^^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!
 
G

Guest

Gast
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

Top Contributor
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Kompliziertes Problem! Spiele- und Multimedia-Programmierung 8
pcfreak9000 Objekt-Vorlagen Spiele- und Multimedia-Programmierung 0
Arif Maus-Objekt im Player Klasse implementieren !? Spiele- und Multimedia-Programmierung 2
H Objekt der Klasse A in der Klasse B verwenden und manipulieren Spiele- und Multimedia-Programmierung 6
M [JOGL] Maus über einem gezeichnetem Objekt abfragen? Spiele- und Multimedia-Programmierung 5
U Kann nur ein Objekt mit LWJGL rendern Spiele- und Multimedia-Programmierung 2
kaoZ Graphics Objekt liefert null Spiele- und Multimedia-Programmierung 14
E Java3D Objekt skalieren per JSlider/JButton Spiele- und Multimedia-Programmierung 10
D Probleme mit objekt initializirung mit Mouselistener Spiele- und Multimedia-Programmierung 10
S Java3D: Primitives zu einem Objekt kombinieren Spiele- und Multimedia-Programmierung 7
T LWJGL 3D Objekt Collision: Wie? Spiele- und Multimedia-Programmierung 11
S Wie erkennt ein Objekt ein anderes? Spiele- und Multimedia-Programmierung 7
B j3d mehr als ein Objekt rotieren Spiele- und Multimedia-Programmierung 18
G Hindernis vor Objekt erkennen Spiele- und Multimedia-Programmierung 6
W Java3D: Kanten die hinter einem Objekt liegen werden gezeigt Spiele- und Multimedia-Programmierung 2
S Graphics Objekt weiterreichen? Spiele- und Multimedia-Programmierung 4
H Eigenes 3D Objekt Spiele- und Multimedia-Programmierung 20
D 2D Objekt fragmentieren Spiele- und Multimedia-Programmierung 3
V Jogl: Objekt trotz Rotation immer in gleiche Richtung bewegen Spiele- und Multimedia-Programmierung 5
M [J3D]Dynamische Erzeugung vom Objekt Box Spiele- und Multimedia-Programmierung 5
Kr0e OpenGL .. Pixel Buffer Objekt oder Frame Buffer Object? Spiele- und Multimedia-Programmierung 2
B String zu Objekt einer eigenen Klasse casten Spiele- und Multimedia-Programmierung 13
N Objekt entgegengesetzt bewegen Spiele- und Multimedia-Programmierung 8
M BoundingBox ist nicht bündig am Objekt Spiele- und Multimedia-Programmierung 5
K Kanten anzeigen lassen in einem Shape3D-Objekt Spiele- und Multimedia-Programmierung 4
S geladenes Objekt -> Material Zuweisen. Spiele- und Multimedia-Programmierung 4
J Picking Selection auf ein Objekt begrenzen ! Spiele- und Multimedia-Programmierung 6
C Objekt bei Buttonklick zeichnen Spiele- und Multimedia-Programmierung 16
G JOGL: per Mausbewegung Objekt verschieben Spiele- und Multimedia-Programmierung 2
C Objekt zwischen 2 Geraden? Spiele- und Multimedia-Programmierung 3
D 3D Objekt entlang Geraden Spiele- und Multimedia-Programmierung 4
Quaxli Picking: Vom Shape3D zum eigentlichen Objekt Spiele- und Multimedia-Programmierung 2
G Objekt nicht ins negative oder null skalieren Spiele- und Multimedia-Programmierung 2
G Objekt verschieben Spiele- und Multimedia-Programmierung 6
G Textur laden auf ein eingelesenes 3D Objekt Spiele- und Multimedia-Programmierung 4
I ScaleInterpolator verschiebt Objekt immer in den Ursprung. Spiele- und Multimedia-Programmierung 2
V Objekt per Tastendruck anzeigen/verschwinden lassen? Spiele- und Multimedia-Programmierung 4
R Objekt mit cos/sin verschieben Spiele- und Multimedia-Programmierung 27
G Kein Licht in Box-Objekt Spiele- und Multimedia-Programmierung 2
K Ein 3D-Objekt mit Maus auswählen Spiele- und Multimedia-Programmierung 5
D Alpha Objekt Spiele- und Multimedia-Programmierung 8
G Einen gif oder jpg Datei aus einem Graphics Objekt o. JFrame Spiele- und Multimedia-Programmierung 2
C Wie kann ich ein Objekt auf Tastendruck vor & zurück bew Spiele- und Multimedia-Programmierung 3
M Position der ViewingPlatform als Point3d-Objekt? Spiele- und Multimedia-Programmierung 12
S 3D Objekt erstellen und darstellen Spiele- und Multimedia-Programmierung 4
G RotationInterp. setzt Objekt an Ursprungsposition zurück Spiele- und Multimedia-Programmierung 2
N Shape3D Objekt auf dem Bildschirm zentrieren Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben