Laden...

Lösungsansatz für 3D-Statusmonitor

Erstellt von Floyd vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.284 Views
Floyd Themenstarter:in
85 Beiträge seit 2006
vor 16 Jahren
Lösungsansatz für 3D-Statusmonitor

Hallo,

ich bin auf der Suche nach eine Lösung für die folgende Aufgabenstellung und habe gehoft das einer von euch mir weiterhelfen kann.

Ich beginne mal mit einem Bild und anschließend kommt die Erklärung.

Bild siehe Anhang

Wie man sieht sind auf diesem Bild mehrere "Personen" eingezeichnet. Nun soll jede Person seperat einfärbbar sein. Dh. eine Person grün, die anderen blau, die dritte lila, ...
Leider sind es so viele "Personen" und Farben das man es nicht mehr fertig als Grafik machen kann. Vorallem weil auch die Licht und Schattenefeckte dann verloren gehen.

Die Frage ist nun welche Lösung sollte man wählen? Die Grafik ist übrigens mit 3DMax von einem Kollegen von mir erstellt worde.

  1. Mit Photoshop Alpha-Masken erstellen
  2. Direct3D verwenden
  3. WPF verwenden

Das waren jetzt Lösungsansätze die mir durch den Kopf gegangen sind. Leider hab ich keine Erfahrung mit Maskenoperationen mit System.Drawing, DirectX und WPF.

Ich hoffe das ihr mir helfen könnt einen Lösungsansatz zu finden und ggf. kann ich dann diesen mit euerer Hilfe ausarbeiten.

Die beste Lösung ist übrigens die, die am einfachsten und schnellsten geht. Wobei vorallem letzteres im Vordergrund steht ^^
Auch die Laufzeit der Programms sollte nicht all zu sehr in den Keller gehen da Status (Farb)-Wecksel zügig abgearbeitet werden sollen.

MFG Floyd

"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"

blog.freakfabrik.net

2.921 Beiträge seit 2005
vor 16 Jahren

Was ist denn der Zweck des Programms?

Wenn Du einfach die Personen als Shapes zeichnest (Polygone), dann ist es doch ein leichtes diese einzufärben. Jede ist ein Objekt.

Sollen diese denn mit der Maus eingefärbt werden können?
Per Programm oder wie?

Sonst würdest Du diese ja bloss platzieren....

oder muss die ganze Ansicht drehbar skalierbar usw. sein? also 3-dimensional?

Dann würde ich OpenGL oder DirectX empfehlen.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

H
50 Beiträge seit 2007
vor 16 Jahren

Laß Dir ein Bild rechnen mit den ObjectIDs von MAX als Farben. Hol' Dir daraus die Masken für jede einzelne Figur. Dann rechne ein Bild, in dem die Figuren eine neutrale Farbe haben. Hol Dir daraus den Helligkeitskanal für jede Figur. Jetzt kannst Du indem Du die Helligkeitsbitmap jeder Figur einfärbst und mit der Maske maskierst jede Figur direkt ins Bild blitten, ohne daß andere Figuren beschädigt werden.
Du behältst dann Schatten und Helligkeitsverteilung, nur der Radiosity-Anteil geht Dir natürlich verloren, aber das Bild sieht eh nicht so aus, als wäre da Radiosity drin.

Floyd Themenstarter:in
85 Beiträge seit 2006
vor 16 Jahren

Das ist ein Lageplan für ein Call-Center der den Status einer jeden einzelenen Person anzeigen soll.

z.B.:

  1. Im Kundengespräch
  2. Bearbeitung von WVL
  3. Hat Kunden in Warteschleife
  4. Ist Frei
  5. Macht Pause
  6. Is in Nachbearbeitung
  7. Nicht anwesend
    ....

Jeder dieser Statis hat eine eigene Farbe. Drehbar und skallierbar soll das ganze nicht sein.

Ich hab mich jetzt mal mittels 3DMax und Photoshop Alpha-Masken erstellt doch jetzt stellt sich die Frage wie ich diese Anwende. Hab herrausgefunden das dies mittels

BitBlt() ->Ternary Raster Operations
AlphaBlend() ->BLENDFUNCTION

gehen soll (laut GDI+ Beschreibung) doch wie man ich das in .Net?

"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"

blog.freakfabrik.net

5.658 Beiträge seit 2006
vor 16 Jahren

Hi!

In .NET stehen dir dafür die Methoden des Graphics-Objektes zur Verfügung, z.B. Graphics.DrawImage().

Schöne Grüße,
Christian

Weeks of programming can save you hours of planning

D
500 Beiträge seit 2007
vor 16 Jahren

Hi!

Mal ne Frage, dieses System, welches Du programmierst, soll es irgendwann für einen anderen Kunden wiederverwendet werden? Warum gehst Du denn von so einem starren Plan aus? Wie schaut es denn aus, wenn die Tische in Ihrer Position, die Raumaufteilung oder mal etwas anderes ändert?

Gruß, DaMoe

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Floyd,

  1. Mit Photoshop Alpha-Masken erstellen

ja, das ist m.E. der Weg. Siehe aber auch den letzten Absatz.

Schau mal in den Anhang: Ich habe dein Bild mal durch zwei einfache Operationen bearbeitet.

Beim ersten sind die Farben einfach im Farbkreis rotieren. Das geht, indem man die Pixel in HSL umwandelt, dann auf den H-Wert die gewünschte Verschiebung anwendet und das Ergebnis wieder ins RGB zurückrechnet. Das kannst du dynamisch in dem Programm machen und musst dir für jede gewünschte Farbe nur den Offset für den H-Wert merken. Dazu später mehr.

Das zweite ist der S-Kanal von einer Kanaltrennung in HSL-Kanäle. Wenn du das Bild retuschierst (vorher ggf. mit einem Schwellwert in ein Schwarz-Weiß-Bild umwandeln oder auch nicht) und die überflüssigen weißen Pixel entfernst, dann hast du eine prima Maske für alle Mitarbeiter.

Im Prinzip brauchst du aber je eine Maske pro Mitarbeiter. Dafür gibt es verschiedene Wege. Am einfachsten wird es sein, das (SW-)Bild sooft zu kopieren, wie es Plätze gibt und immer alle weißen Pixel bis auf den gerade gewünschten Mitarbeiter zu entfernen.

Jetzt wendet man jede dieser Masken für jeden einzelnen Mitarbeiter auf das Originalbild an, invertiert sie und füllt die so gewonnen Fläche mit der transparenten Farbe. So bekommt man ein Bild, dass nur die Pixel des jeweiligen Mitarbeiters enthält und ansonsten transparent ist.

Das ist natürlich erstmal viel Speicherplatz. Diesen Grundansatz kann man natürlich deutlich optimieren, indem man diese Bilder zum einen gif-komprimiert und zum anderen immer nur einen kleinen Ausschnitt rund um den Mitarbeiter speichert und sich den Offset dieses Ausschnitts in Bezug auf das Gesamtbild merkt.

Jetzt hast du also Bilder für jeden Mitarbeiter, deren Farben du wie oben beschrieben nach Belieben rotieren kannst. Diese Bilder kannst du jetzt einfach im OnPaint mit DrawImage auf den Schirm zeichnen. Siehe [Tutorial] Zeichnen in Windows-Programmen (Paint/OnPaint, PictureBox).

Natürlich bietet es sich an, den Prozess der Erstellung der Mitarbeiterbilder zu automatisieren, damit es sich nicht negativ bemerkbar macht, wenn der von DaMoe80 genannte Fall eintritt und sich die Raumaufteilung ändert.

herbivore

309 Beiträge seit 2007
vor 16 Jahren

Für welche Telefonanlage ist das Programm gedacht ???

**"Zufall ist das Pseudonym Gottes, wenn er nicht selbst unterschreiben will.” **
Anatole France

Floyd Themenstarter:in
85 Beiträge seit 2006
vor 16 Jahren

Danke für die vielen Antworten,

also zur Frage der Telefonanlage. Ein Kollege von mir schreibt grade eine art Anwahlprogramm was die Kommunikation zwischen den einzelen Client-Rechnern der Mitarbeiter, der TK-Analage und dem StatusMonitor regelt. Die Raumaufteilung ist absolut statisch und wird nicht geändert.

Danke herbivore für die ausführlich Erklärung. Wie es funktionieren soll hab ich nun glaube ich verstanden doch nun hapert es an der Umsetzung ^^

Die Grundlagen des Zeichnens mit .Net und den Paint-Methoden kenne ich bereits und wende ich sehr häufig an.
Leider bin ich mit Grafikbearbeitung im allgemeinen nicht so vertraut so das mit "S-Kanal von einer Kanaltrennung in HSL-Kanäle" oder "Offset für den H-Wert" soziehmlich garnix sagt. 🤔
Die von die verwendete Schwarzweiß-Maske habe ich bereits vorliegen. Im Photoshop funktioniert das ganze ja auch wunderbar doch leider weiß ich nicht wie ich es direkt im Programm umsetzten kann 🙁

Und an der stelle hab ich gehofft das ihr mir weiterhelfen könnt?! =)

MFG Floyd

"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"

blog.freakfabrik.net

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Floyd,

schau dir an, was HSL ist. Dann sollten sich alle noch offenen Fragen beantworten. Wenn nicht kannst du ja nochmal konkret nachfragen.

herbivore

Floyd Themenstarter:in
85 Beiträge seit 2006
vor 16 Jahren

Ok jetzt weiß ich was HSL ist und wie man eine HSL-Farbe in .Net verwendet.
Doch bleibt immernoch das Problem. Wie wende ich diese Farbe nun auf meine Alpha-Maske an? Oder stell ich mich einfach zu blöde an 🤔

Also ich hab mein Bild (in Graustufung) und meine Alphamaske.
Doch wie kombiniere ich jetzt das Bild, die Alphamaske und die HSL-Farbe?

MFG

"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"

blog.freakfabrik.net

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Floyd,

Doch bleibt immernoch das Problem. Wie wende ich diese Farbe nun auf meine Alpha-Maske an?

für die Änderung der Farbe wendest du die oben beschrieben HSL Mimik nicht auf die Alphamaske, sondern auf den fertig ausgeschnittenen Mitarbeiter an. Soweit ich das sehe, muss man das echt pixelweise machen RGB => HSL => H+Offset => HSL => RGB.

Also ich hab mein Bild (in Graustufung) und meine Alphamaske.

Nein, du hast einzelnen echte, farbige (d.h. grüne) Mitarbeiterbilder.

Doch wie kombiniere ich jetzt das Bild, die Alphamaske und die HSL-Farbe?

Wie oben beschrieben. Ich habe das ja nun wirklich ausführlich beschrieben. Lies es am alles in Ruhe nochmal.

herbivore