Jump to content
Unity Insider Forum

Mesh - Punkte skalieren und an äußere Form anpassen


RLe

Recommended Posts

Hallo, liebe Community,

erst mal wollte ich sagen, schön, dass die Community wieder da ist, als ich die letzten Male hier war, war die Community offline. Wobei ich sagen muss, dass ich über einen längeren Zeitraum hinweg im Urlaub war, daher weiß ich nicht, wie lange die Community schon wieder online ist. Aber jedenfalls schön, wieder hier posten zu  können. Nun, folgendes Problem: Ich habe ein Programm erstellt, mit welchem man über den LineRenderer Linien erstellen kann. Außerdem kann man die Linien miteinander verknüpfen und mit einem Klick ein Mesh daraus erstellen. Hier ein Beispiel für ein erstelltes Mesh:

 ForumFrage.PNG.9bc6ab8ee6b7999571ed49dced3b533e.PNG

Nun sieht aber nicht jedes Mesh so schön aus, hier ein Beispiel für ein nicht gelungenes Mesh:

 ForumFrage2.PNG.421156f2c07d3f91827034a10e327afd.PNG

Ich würde das gerne ändern, nur will mir einfach kein Algorythmus einfallen, der die Punkte in die richtige Form bringt. Wie kann ich dem Programm mitteilen, wie die die Punkte liegen sollen?

 

LG Raja

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Stunden schrieb Sascha:

Was ist denn eine "richtige" Form? Wenn du das einmal richtig durchdefiniert hast, ist die Hälfte des Problems schon gelöst, da die Implementation dann nur noch Fleißarbeit ist.

Ich bin mir nicht sicher, was du meinst. In Bild1 sind alle Vertices richtig, in Bild sind sie irgendwie. Die dunkle Linie auf dem Bild zeigt, wie die Form eigentlich sein sollte.

Korrektur: Die dunkle Linie stellt die Form dar, die ich mit dem LineRenderer gezeichnet habe. Nun sollte das System die Form erkennen und das Mesh entsprechend anpassen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Stunden schrieb RLe:

Ich bin mir nicht sicher, was du meinst. In Bild1 sind alle Vertices richtig, in Bild sind sie irgendwie. Die dunkle Linie auf dem Bild zeigt, wie die Form eigentlich sein sollte.

Korrektur: Die dunkle Linie stellt die Form dar, die ich mit dem LineRenderer gezeichnet habe. Nun sollte das System die Form erkennen und das Mesh entsprechend anpassen.

Ich bin verwirrt 😕 Die schwarze linie in bild 1 und 2 ist korrekt und du fragst dich wieso dein mesh (blau) so seltsam erzeugt wird ? Ich schätze das dein Algorithmus einfach so arbeitet.. alle vertices im mittelpunkt zusammen zu führen und dann linear triangulieren. Was willst du denn erreichen ? Das dein mesh (blau) auch im zweiten Bild eine schöne geschwungene fläche bildet ? Das ist auf jedenfall kein triviales problem. Ich kann mir eine reihe von komplexen formen ausdenken, die es jedem Algorithmus extrem schwer machen würden diese Aufgabe zu erfüllen und wenn ich deinen Ansatz richtig deute wirst du es damit auch nicht schaffen konkave formen darzustellen. Mir fällt jetzt aber auf anhieb auch kein Algorithmus ein den ich dir zur Lösung präsentieren könnte aer vielleicht hilft dir das ja weiter https://en.wikipedia.org/wiki/Non-uniform_rational_B-spline

Link zu diesem Kommentar
Auf anderen Seiten teilen

Für mich sehen beide Bilder halt genau richtig aus. Dein Code baut ganz eindeutig (wie @Cxyda83 schreibt) Verbindungen von Punkten entlang der schwarzen Linie zum Mittelpunkt. Wenn du deine schwarze Linie hinreichend verdrehst, und du evtl. sogar eine konkave Form erstellst, ist doch klar, dass das dann so aussieht wie auf dem zweiten Bild.

Deshalb mein Vorschlag: Mal einfach mal auf, wie du dir vorstellst, dass es stattdessen aussehen soll. Und arbeite dich von da aus Richtung Implementation.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, erstens sehe ich da etwas anderes:

grafik.png

Die Kanten sind ja nicht einfach nur versetzt oder so, es wird halt von jedem Punkt der Außenkante ein Strich Richtung Mitte gezogen.

Aber zweitens ist das nicht, was ich meinte. Dein Mesh ist ja wesentlich komplexer als die Außenkante. Mal mal ein Bild, wo du (wenn auch evtl. in verringerter Anzahl) jedes Vertex und jede Kante einzeichnest, die das Mesh haben soll.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Stunden schrieb Cxyda83:

Ich bin verwirrt 😕 Die schwarze linie in bild 1 und 2 ist korrekt und du fragst dich wieso dein mesh (blau) so seltsam erzeugt wird ? Ich schätze das dein Algorithmus einfach so arbeitet.. alle vertices im mittelpunkt zusammen zu führen und dann linear triangulieren. Was willst du denn erreichen ? Das dein mesh (blau) auch im zweiten Bild eine schöne geschwungene fläche bildet ? Das ist auf jedenfall kein triviales problem. Ich kann mir eine reihe von komplexen formen ausdenken, die es jedem Algorithmus extrem schwer machen würden diese Aufgabe zu erfüllen und wenn ich deinen Ansatz richtig deute wirst du es damit auch nicht schaffen konkave formen darzustellen. Mir fällt jetzt aber auf anhieb auch kein Algorithmus ein den ich dir zur Lösung präsentieren könnte aer vielleicht hilft dir das ja weiter https://en.wikipedia.org/wiki/Non-uniform_rational_B-spline

Danke für den Tipp, hab's zwar noch nicht probiert, aber werde es mir mal angucken. Ein kleiner Hinweis: Dein Link führt nicht dahin, wo er soll. Aber wenn man die Textstelle kopiert, kommt man dahin. Trotzdem danke.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 25 Minuten schrieb Sascha:

Also, erstens sehe ich da etwas anderes:

grafik.png

Die Kanten sind ja nicht einfach nur versetzt oder so, es wird halt von jedem Punkt der Außenkante ein Strich Richtung Mitte gezogen.

Aber zweitens ist das nicht, was ich meinte. Dein Mesh ist ja wesentlich komplexer als die Außenkante. Mal mal ein Bild, wo du (wenn auch evtl. in verringerter Anzahl) jedes Vertex und jede Kante einzeichnest, die das Mesh haben soll.

Ja, aber die Vertices liegen so. Das Mesh setzt sich aus verschiedenen Reihen zusammen, jede Reihe ist ein bisschen näher am Mittelpunkt. Funktioniert wunderbar bei Kreisen und änlichen Formen. Nur ist es nicht ganz das, was sein soll.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Sascha:

Eben - und deswegen sollst du einfach mal ein Konzept entwickeln und aufmalen, wie die Vertices in so einem Fall liegen sollen. Das Konzept "von lauter Punkten auf der Außenkante mit dem Mittelpunkt verbunden" funktioniert halt nur bei konvexen Formen.

Korrekt sähe es wohl so 

ForumFrage.PNG.ac6b31d6d4e533978ad0949008c8ba21.PNG

oder so

ForumFrage2.PNG.82247382d732a17b4fbf6a76c4f1d391.PNG

aus. Aber kann das ein Computer überhaupt? Ich denke, ich werde es wahrscheinlich so machen, dass halt diese eine Linie in der Mitte von Hand vorgeben muss, und dann kann es dazu die einzelnen Vertices erstellen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 32 Minuten schrieb RLe:

aus. Aber kann das ein Computer überhaupt? Ich denke, ich werde es wahrscheinlich so machen, dass halt diese eine Linie in der Mitte von Hand vorgeben muss, und dann kann es dazu die einzelnen Vertices erstellen.

Sicher kann er das ;) Sofern du nen Algorithmus schreiben kannst, der genau das tut. Dein Ansatz das der user die mittellinie definieren muss wird dich denke ich nicht weiter bringen da dir immer 1 Dimension fehlen wird .. du versuchst hier eine Fläche (3D) zu beschreiben, gibst dem Anwender aber nur ein2D tool (linie als mittelachse) um dieses problem zu lösen. Das wird wohl in einigen anwendungsfällen klappen aber gerade bei konkaven flächen auch wieder nicht ausreichend sein ... mit dem Ansatz noch zusätzlich Kontrollpunkte angeben zu lassen kommst du den NURBs die ich dir oben gepostet habe schon ziemlich nahe. Du bist jedenfalls auf dem richtigen weg ! Du hast es immerhin schon von einer 1D lösung (Punkt) zu einer (zumindest theoretischen) 2.5D Lösung (Linie+ kontrollpunkte) geschafft 👍

Übrigens ist deine 'seiten' ansicht deiner oben gezeigten form zwar in etwa richtig, jedoch wirst du ziemlich sicher dein Mesh nicht so gebaut haben wollen .. So wie du es gezeichnet hast macht der stern (vertex oben rechts) zwar sinn aber bedenke das es sich um eine 3Dimensionale form handelt die von der anderen seite keine spitze bildet sondern einfach eine fläche ist der deine edges folgen sollten... andernfalls hast du wieder das problem das du eingangs beschrieben hast .. ¯\_(ツ)_/¯

 

Viel Glück ! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

du versuchst hier eine Fläche (3D) zu beschreiben, gibst dem Anwender aber nur ein2D tool (linie als mittelachse) um dieses problem zu lösen.

Ich verstehe nicht, was du meinst. Es geht nicht um 2D oder 3D. Das Mesh ist erst mal in 2D, habe schon eine Klasse für die Umwandlung in 3D. Jetzt geht es aber darum, aus der äußeren Form immer kleiner werdende innere Formen zu generieren, den Rest habe ich bereits geschafft.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Stunden schrieb RLe:

Aber kann das ein Computer überhaupt?

Es wurde schon richtig gesagt: Klar geht das. Computer können algorithmisch alles, was Menschen können, sofern man es schafft, ihnen das beizubringen. Und mit der Zeichnung, die übrigens genau das ist, was ich sehen wollte, kannst du das auch machen. Man kann da jetzt schön ablesen, wie das funktionieren würde.

  1. Zwischen den beiden Außenlinien wird eine weitere Linie gezogen, indem der Mittelpunkt jedes Punktepaars errechnet wird.
    grafik.png
  2. Wenn du willst, kannst du jetzt noch weitere Linien ziehen, indem du wiederum den Mittelpunkt zwischen zwei Punkten mit demselben Index von einer Kante und der neuen Mittellinie ziehst.
    grafik.png
  3. Anschließend hast du an den Endpunkten lauter Dreiecke und in allen anderen Segmenten Vierecke, die gefüllt werden wollen.
    grafik.png

Mit dieser Technik, die du ja selber auf dem Papier entwickelt hast, sind auch konkave Formen möglich. Sollte also gut funktionieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Offenbar wurde mein hinweis nicht deutlich.. oder ich liege falsch.. glaube ich aber an der stelle nicht ;)

 

Ich hab euch hier mal die "front" und die "Seitenansicht" dargestellt mit markierten punkten zum besseren Verständnis. Ich habe auch eine Mittelachse entlang der größeren ausdehnung eingezeichnet (macht vermutlich am meisten Sinn M1). Sashas blaue linie würde anders herum verlaufen... kann man auch machen aber dann stimmen leider die eingezeichneten triangles nicht. Das macht zwar in der Ansicht sinn, würde aber zu ziemlich verzogenen faces in der anderen ansicht führen ( siehe meine obere darstellung der Fläche )

Hoffe das wurde nun deutlicher :)

mesh-punkte-skalieren.jpg

 

Mir wird grade was klar (denke ich) vielleicht kann @Sascha mich da erleuchten 🤔 ist nicht jede 3-dimensionale Fläche eine konkave fläche? Ich meine das kann doch garnicht gehen eine konvexe fläche zu erzeugen oder ? :mindblown: ... Volumenkörper hingegen sind Konvex.. dann hat das was mit der richtung der normalen zutun ? 🤔 ... ich bin verwirrt ^^'

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Edit: Uff, jetzt merke ich, dass ich euch beide kurz verwechselt habe :P

Jetzt ist das Konzept ja wieder ein anderes. Wenn du die Form in kleiner in die Urprungsform hineinkopieren willst, dann geht das sicherlich auch, wird aber direkt extrem viel komplizierter. Ich will da ganz ehrlich sein: Da fällt mir kein Ansatz ein, wie man das implementieren kann. Von daher würde ich empfehlen, das so zu machen wie in meinem Post, was ich ja aus deinem Post extrapoliert habe. Eine Fläche erhältst du da am Ende auch.

vor 47 Minuten schrieb Cxyda83:

ist nicht jede 3-dimensionale Fläche eine konkave fläche?

Nö. Konkav bedeutet quasi "eingedellt". Ich beziehe das hier aber auch auf die 2D-Fläche. Der eine Teil deines Beispiel-"Tropfens" ist konkav, sodass du eine Linie Finden kannst, die die Fläche zwei- oder mehrmal schneidet. Das ist halt die Eigenschaft, die deine aktuelle Herangehensweise nicht abdeckt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 11 Stunden schrieb RLe:

ForumFrage2.PNG.82247382d732a17b4fbf6a76c4f1d391.PNG

 

Okay dann haben wir aneinander vorbei geredet... ich habe mich auf diesen Ansatz bezogen und ihn so verstanden das hier die äußere form nach innen fortgesetzt werden soll. Wenn du Sascha dich auf die erste herangehensweise beziehst hast du natürlich recht :) Deine "begründung" zu meiner Frage muss ich mir in einer Stillen Stunde nochmal durchlesen... das habe ich grade nicht verstanden ;)

 

Allerdings habe ich vielleicht grade eine Lösung für das problem gefunden 🤔 In meinem kopf macht das grade jedenfalls sinn und klingt vielversprechend ^^'

1205781640_mesh-punkte-skalieren-losungsansatz.thumb.jpg.decf3b90247c364a9eb03eeaa9431c5f.jpg

Also im prinzip wie zu anfang nen mittelpunkt finden und in der ersten iteration alle außenpunkte verbinden.

In jeder weiteren iteration alle edges teilen und die position aller punkte angleichen

Was denkt ihr ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde mal eingie Voraussetzungen für den Algorithmus definieren (sofern ich es bisher verstanden habe):
- alle Punkte müssen auf einer Ebene liegen
- die Fläche sollte geschlossen sein
- es sollen keine überlappenden Triangles (Dreiecke) erzeugt werden

Das Problem ist jedenfalls equivalent dazu aus einer 2D-Punktwolke einen Mesh zu erstellen, dafür gibt es bestimmt schon einige existierende Algorithmen. Man kann sich natürlich auch selbst einen Algorithmus ausdenken, dass kann aber sehr aufwendig werden,  da dieser auch für jeden Fall fehlerfrei funktionieren sollte.
Ich würde bei einem eigenen Algorithmus etwas in der Art machen, zuerst den Rand der Punktwolke zu ermitteln (die Punkte die den Rand bilden sollen) und dann über den Rand beginnend Dreiecke zu erzeugen. Dabei werden die Punkte in der näheren Umgebung des Randes gesucht und miteinander entsprechend verbunden, dabei muss man immer darauf achten das die Dreiecke sich nicht überlappen dürfen. Die Fläche wächst dabei quasi von außen nach innen zu (wie bei einem Zellwachstum). Am Ende bleibt vermutlich ein Loch im Inneren ( = der innere Rand), dieses muss man dann am Ende nochmal mit Dreiecken füllen. Leider ist das hier nur eine sehr grobe Beschreibung des Algorithmus, es gibt bestimmt noch etliche Stolperfallen und Probleme dabei zu lösen,

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die vielen Tipps und die Hilfe. Ich hab es mir überlegt und denke, dass es vielleicht doch einfacher ist, wenn der Nutzer eben ein paar grobe Vorgaben machen muss. Dabei wird das Mesh wahrscheinlich auch gleich "retopolisiert", was andernfalls bei einer rein algorythmischen Lösung vielleicht nicht der Fall wäre.

Edit: Ich hab's immer noch nicht ganz raus. Zum allgemeinen Verständnis, meine Formen setzen sich aus Funktionen zusammen, die mittels Bezierkurve ermittelt wurden. Die Funktionen werden durch Start- und Endpunkte getrennt, und die Punkte bleiben auch nach der Erstellung weiterhin bekannt. Hier ist mal ein genaues Bild von meinem Programm mit einer erstellten Form:

ForumFrage.PNG.84b0dae662c608db4c75d767359f30b9.PNG

Die Quadrate an den Linie sind Punkte, also die Start- und Endpunkte einer jeweiligen Funktion, links sind die verschiedenen Tools, also Pen, Select und Circle. Oben sind das Startmenü und die verschiedenen 3D-Ansichten, also Front, Back, usw.  Das rosa-farbene neben einer der Linien ist der Mauszeiger des Pen-Tools, der die Form eines Fillers hat. Ach ja, und die Punkte, die nicht direkt an zwei Linien angrenzen sind Bezierkurvenpunkte, die nur den Verlauf einer Kurve vorgeben. Es können aber auch Punkte durch das Anklicken von Linien hinzugefügt werden. Kann man das irgendwie berechnen? Sonst mache ich es so, dass wenn der User auf "Erstellen" klickt, dann ein zweiter Mode aufgeht, sozusagen ein "Retopo-Mode", in dem durch Anklicken und Verbinden neue Linien erstellt werden, die dann rot wären, und die den Verlauf der Vertices vorgeben würden, und das Programm würde sich dann um die Einzelheiten kümmern.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...