Modellbildung (Aufgabe zu 3D --> 2D Projektion)

Neue Frage »

InSaNo Auf diesen Beitrag antworten »
Modellbildung (Aufgabe zu 3D --> 2D Projektion)
Hallo zusammen,

Momentan bin ich dabei, ein Objekt aus der 3D Welt projektiv in 2D umzuwandeln, ohne dafür einen Z_Buffer zu verwenden.
Ich will kein perspektivisches Bild des Objekts, entscheidend sind nur die Anteile von verschiedenen Farben, die bei einem speziellen Blickwinkel zu sehen sind.
Ich habe das ganze bereits für einen Zylinder versucht zu impementieren und das Algorithmus sieht vollgendermaßen aus:

%INPUT
%D = Diameter of the cone in m
%L = Length of the cone in m

D = 0.6;
L = 3.5;

vorne = [(D/2)^2*pi,0];
hinten = [0,(D/2)^2*pi];
seite = [D*L/2,D*L/2];

viewdirection = a = [1,0,0];
objectdirection = b = [0,1,0];
alpha = acos(a*b'/(norm(a)*norm(b)));
g = (cos(2*alpha-pi)+1)/2;
if alpha > pi/2
surface = vorne * (1-g) + seite * g;
else
surface = hinten * (1-g) + seite * g;
end

Bei meinem Beispiel stehen bei den Vektoren vorne,hinten,seite jeweils der erste Eintrag für die blaue Farbe und der 2te Eintrag für die rote Farbe. Die Zahl die dort steht der Die Oberfläche in m^2 die genau diese Farbe hat.
Mein Zylinder ist vorne Blau, am Körper längs Blau/Rot gestreift und hinten Rot.
Als Beobachter bin ich weit entfernt vom Zylinder, sehe ihn also immer komplett und meine einfache Berechnung gibt mir einen Schätzwert der 2D Oberfläche die ich von der jeweiligen Farbe in m^2 sehe.

Soweit so gut.
Nun würde ich aber gerne Objekte Betrachten, die nicht so symmetisch sind wie ein Zylinder.
Als Angaben zum Objekt habe ich 6 Seiten, also quasi ein Quader. Und zu jeder Seite habe ich die Angabe in m^2 wieviel von jeder Farbe darauf ist.
Als weitere Information habe ich noch neben dem objectdirection Vektor auch einen objectundersurface der mit angibt wo die Unterseite des Objekts ist.
Aus diesen Informationen sollte es möglich sein, einen einfachen Schätzer zu bauen, der Näherungswerte für die perspektivisch gesehenen Farbflächen angibt.

Mein erster Gedanke wäre ein doppeltes implementieren des bereits Gemachten für die Drehungen um die eigene Achse, und für die links-rechts Drehungen aber ggf. gibt es für alles eine deutlich bessere Umsetzung, daher wollte ich euch mal fragen.
Vielen Dank schonmal im voraus,
lG
Franz
Mazze Auf diesen Beitrag antworten »

Ich habe mir den Code jetzt nicht angeschaut, hast Du die Informationen der Körper als 3-Dimensionale Vekltoren? Wenn ja , schau dir mal die orthogonalen Projektionen an, dann musst Du die Punkte der Körper nur mit der entsprechenden Projektionsmatrix multiplizieren und hast das Ergebnis.
InSaNo Auf diesen Beitrag antworten »

Zitat:
Ich habe mir den Code jetzt nicht angeschaut, hast Du die Informationen der Körper als 3-Dimensionale Vekltoren? Wenn ja , schau dir mal die orthogonalen Projektionen an, dann musst Du die Punkte der Körper nur mit der entsprechenden Projektionsmatrix multiplizieren und hast das Ergebnis.


Leider habe ich diese Informationen nicht, das ist ja genau mein Problem. Ich habe quasi "nur" Fotos aus den verschiedenen Richtungen. Oder sogar noch schlimmer: ich habe nur Angaben darüber vieviele cm^2 Fläche welche Farbe enthält (auf jedem Foto). Bei meinem angeführen Beispiel habe ich nur 3 Bilder betrachtet. es gibt nur "vorne", "seite" und "hinten".
Dazu habe ich einfach eine Gewichtung eingeführt je nachdem wie meine Blickrichtung zur Blickrichtung des Objektes steht, gewichte ich das richtige Foto.
Bei 180 Grad z.B ist mein g = 0. -> ich sehe nur die Fläche "vorne" die zu 100% gewichted wird, während die "seite" mit 0 gewichted wird.
Bei 90 Grad sehe ich nur die "seite", bei 0 Grad nur hinten.
Das sind quasi die Fotos auf die ich mich stütze.
Alles dazwischen wird je nach Winkel gewichted, z.B bei 45 Grad 0,5 * hinten + 0,5 * vorne. Das das nicht genau stimmt ist mir klar, jedoch ist aus so wenigen Informationen nur schwer mehr zu machen und für meine Zwecke sollte das reichen. Sofern du eine bessere Idee hast, freu mich mich sie zu durchdenken.
Ich würde eben gerne diesen Gewichtungsanstatz auf 6 Seiten erweitern. dazu hätte ich schon eine Idee aber ich bin mir nicht sicher obs da nicht bessere Möglichkeiten gibt.

In meiner Idee mache ich zu Beginn das gleiche wie beim 3-Fotos Ansatz. Mit dem daraus gewonnen Bild mache ich dann nochmal einen 3-Fotos Ansatz der eben in die andere Richtung dreht.
Beispiel
--> Ich sehe auf mein Objekt von links unten und das Objekt ist in meine Richtung gedreht..
Es müssen also die Seiten: A,B und C in in die Gewichtung mit einfließen.
Also mache ich erst eine angemessene Gewichtung zwischen A und B (siehe 3_Fotos Ansatz) und anschließend mit dem neugewonnen Bild D eine Gewichtung zwischen D und C. Was natürlich zur Folge hat, dass C deutlich stärker ins Gewicht fällt, als die Seiten A und B.
Um dies auszugleichen, mache ich das gleiche noch zweimal, und zwar beginnend mit den jeweils anderen beiden Seiten. Aus den 3 Ergebnissen nehme ich den Mittelwert und viola ich habe ein Ergebnis.

Auch wenn ich glaube das könnte hinhauen, sollte es doch einen einfacheren Ansatz geben, anhand von 2 Winkeln (Drehwinkel oben/unten, und Drehwinkel links/rechts) eine angemessene Gewichtung für die 3 involvierten Seiten zu finden.
Nur ich weiss leider nicht wie!
Mazze Auf diesen Beitrag antworten »

Wie gut sind die Kanten der Objekte zu sehen? Wenn Du Fotos bzw. Bilder hast dann reicht nämlich ein einzgies schon aus. Hierzu solltest Du dich über gängie Kantendetektoren mal informeiren. Ansich steckt da einiges an Theorie dahinter aber einen naiven Sobelfilter kann man leicht implementieren. Man bekommt dein ein Kantenbild heraus, das muss aber dann noch nachbearbeitet werden.
InSaNo Auf diesen Beitrag antworten »

Leider habe ich mich mit den Fotos etwas falsch ausgedrückt, sorry.
Mein Modell hat mit Optic zu tun, d.h. ich habe verschiedene Quantendetektoren die bei verschiedenen Wellenlängen empfindlich sind.
Daher habe ich eigentlich keine Fotos sondern nur Richtwerte die mir sagen wieviel blau, rot oder gelb zu erkennen ist bei den von mir fälschlich als Fotos deklarierten Positionen.
Wenn ich diese 6 Richtwerte als Referenz habe, und ich scanne ne Runde, empfange dann Daten die mir sagen wieviel blau,rot und gelb an dem Objekt ist, kann ich dann anhand meiner Referenzdaten abschätzen wie das Objekt gedreht sein muss? Und wenn ja wie?
Deshalb versuche ich die ganze Zeit mit Gewichten zu arbeiten.
Klar bekomme ich kein genaues Ergebnis (habe Dämpfungseffekte, Spiegelungen, etc.), jedoch kann ich dann ja einfach optimieren und die wahrscheinlichste Position bestimmen die dem gemutmaßten Wert am nächsten kommt.
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »