3-Dimensionalität

  • C#

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    3-Dimensionalität

    Hi, hätte mal eine Frage.

    Wie genau implementiert man Drei Dimensionalität?
    Also die X-Achse verläuft von links nach rechts
    Die Y-Achse von oben nach unten
    und die Z-Achse?
    Um welchen bspweise X und Y Wert verschiebt sich eine Zeichnung wenn Z = 1?
    Oder ist das Konzept bei 3d anders als bei 2d?

    Wäre nett wenn einer da was zu sagen könnte,
    Hatte nämlich vor mal so ein 3D Koordinatensystem zu entwerfen
    (Mit 2D hats ganz gut geklappt)
    @RushDen Eigentlich kein Akt, Du hast für jeden Koordinatenpunkt ein Zahlentripel für (x, y, z).
    Was Du brauchst, ist eine ordentliche Vektor-Klasse, in der die 3D-Methoden der üblichen Vektoroperationen implementiert sind, dann musst Du mit Geraden hantieren können, Translation und Drehung um jede der 3 Raumachsen usw.
    Besonders beachten musst Du, dass Du ein Rechtssystem verwendest, dazu musst Du Dich bei jeder implementierten Operation überzeugen, dass es so ist. Wenn Du das versäumst und eine einzige Operation stellt ein Linkssystem dar, suchst Du Dich dumm und dämlich.
    Zur Darstellung brauchst Du geeignete Projektionen in beliebige Ebenen. Für die einfachsten setze x, y bzw. z einfach konstant (z.B. 0).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ah
    Also beim rechtssystem ist die z achse von oben nach unten (die höhe) und die y achse dann die tiefe?
    Wenn man das jetzt (testweise) mit GDI verwirklichen will (wo man 2D Punkte zum zeichnen übergibt) und dann die Tiefe eines Vektors (also Y) verändert, wie soll man das nun als 2D Punkt übergeben (weil es da ja nur die höhe und breite gibt), also gibts da keine formel zum berechnen?

    RushDen schrieb:

    Also beim rechtssystem
    Ein Rechtssystem sieht so aus:
    Daumen, Zeigefinger und Mittelfinger der rechten Hand, der Daumen dreht in Richtung Zeigefinger, da bewegt sich der Mittelfinger im Sinne einer Rechtsschraube vorwärts.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    wie gesagt: mathematisch gesehen ist die Bezeichnung der Achsen ja völlig beliebig.
    Nur halte ich "meine" Bezeichnung für die gängigste, weils einfach die gängigen 2D-Koordinaten (x,y) sind, zuzüglich z, und für z bleibt dann nur die Tiefen-Dimension.

    Aber es gibt keinen Standard, auch nicht für 2D:
    Etwa bei Bildschirm-Koordinaten geht y von oben nach unten :(

    RushDen schrieb:

    also gibts da keine formel zum berechnen?
    Natürlich gibt es die, nennt sich Projektion und wird mit einer Matrix durchgeführt. Ist schon ein fortgeschrittenes Thema der Mathematik, ich glaube 12 Klasse.
    Ich hab schonmal sowas implementiert, da kannst du dir vielleicht was abschauen:
    [OpenSource] MathUtils 2.4.3 - erweiterte Mathematikbibliothek
    Hallo miteinander,

    Ich misch' mich da mal auch mit rein :saint: Ich bin mir auch das System von @ErfinderDesRades gewöhnt, da das auch im Maschinenbau gängig ist(bis auf einzelne verschiedene Maschinen, die ein anderes Koordinatensystem bevorzugen). Auch macht es mehr Sinn, wenn X- und Y-Achse wie bei 2D beibehalten werden und dann die Z-Achse in die Tiefe geht, da das schlicht einfacher ist. Möchte man beispielsweise einen Z-Plotter entwickeln, der die Menge durch die Funktion abbildet, würde uns das auch erlauben, imaginäre () und komplexe () Ergebnisse zu plotten, indem man die Z-Achse für den Imaginärteil und die Y-Achse für den Realteil reserviert, womit dann auch folgende Funktion geplottet werden kann:

    Deshalb ist das Hinzufügen der Z-Achse als Tiefe meiner Meinung nach am sinnvollsten.

    Grüsse,

    Higlav
    Es ist vollkommen egal. Und auch überhaupt nicht logischer auf die eine oder andere Art zu machen. Denn ob x,y oder z ist nunmal egal. Es gibt da einfach gewisse Standards, welchen man nun nimmt ist völlig egal, man muss nur diesem Treu bleiben. Blender z.B. verwendet Z nach oben(und machen auch viele Games so)...
    Edit: Ich mag das Wort egal :D
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hi
    für 3D werden im Normalfall, wie bereits gesagt wurde, Matrizen verwendet, allerdings keine 3x3-Matrizen, sondern tendenziell eher 4x4-Matrizen (siehe Homogene Koordinaten auf Wikipedia), um Translationen zu ermöglichen (die 4-te Koordinate des Vektors wird auf 1 gesetzt).
    Im Allgemeinen sieht man als Mensch (im Normalfall) eine 2-dimensionale Projektion eines scheinbar dreidimensionalen Raumes (auch engstirnige Personen können das, glaube ich), daher gilt es, eine Projektion durchzuführen. Es gibt hierbei zwei gängige Möglichkeiten: Orthogonale Projektion und Perspektivische Projektion (siehe wieder Wikipedia, Homogene Koordinaten). Beide werden dazu verwendet, um eben die Projektion auf die Ebene durchzuführen, die normal zur Blickrichtung liegt und durch das "Sichtfenster" geht, also deinen Bildschirm. Insofern ist alles stupide Mathematik. Mathematik ist abstrakt: Erst durch die Definition von x-,y- und z-Achse wird deren Zugehörigkeit festgelegt. Muss ja nicht mal unbedingt sein, dass x in {(0, 0, 1), (0, 1, 0), (1, 0, 0)} liegt. Raum sei btw. in diesem Beitrag ein Vektorraum, das würde nur für zusätzliche Komplexität sorgen. Und der Vektorraum müsste theoretisch auch nicht durch reelle Zahlen beschrieben werden - reicht ja, solange er der Definition genügt...

    Gruß
    ~blaze~

    RushDen schrieb:

    Wobei genau?
    Das ist dynamisch, die nach positiv zeigende x-Axhse wird in Richtung der positiv zeigenden y-Achse gedreht, dann bewegt sich die z-Achse im Sinne einer Rechtsschraube positiv.

    ErfinderDesRades schrieb:

    Etwa bei Bildschirm-Koordinaten geht y von oben nach unten
    Für ein Rechtssystem bedarf es einer dritten Achse.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ist unterschiedlich, es gibt verschiedene Eulersche Winkel, bei OpenGl ist 0 die Mitte, von oben und unten. -1 ist Links, 1 ist rechts, -1 sollte unten sein 1 sollte oben sein.

    @Trade: bei der Rotierung brauchst du Angle, X,Y und Z

    Andy16823 schrieb:

    Das ist unterschiedlich
    Was?
    Die Achsen bilden ein Rechtssystem.
    Die Eulerschen Winkel beschreiben die Rotation eines Festkörpers um 3 Raumachsen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ja, aber es gibt verschiedene zuordungen. Wie gesagt, bei OpenGL beginnt mit null mittig, nach links ist negativ, nach rechts positiv. Ich arbeite zur zeit mit opengl. Für SharpGL habe ich mal ein Tut gemacht.

    dotnet-forum.org/showthread.php?tid=19

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Andy16823“ ()

    Andy16823 schrieb:

    null mittig, nach links ist negativ, nach rechts positiv
    Ja und? Das ist genau eine Achse. Ein Rechtssystem definiert die Lage 3er Achsen zueinander.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Andy16823 schrieb:


    Wie gesagt, bei OpenGL beginnt mit null mittig, nach links ist negativ, nach rechts positiv. Ich arbeite zur zeit mit opengl. Für SharpGL habe ich mal ein Tut gemacht.

    dotnet-forum.org/showthread.php?tid=19