Algorithmus zum Rendern von 3D - Objekten?



  • Ich weiß zwar, was eine Projektionsmatrix ist, aber das beantwortet meine Frage nicht. Im Scherfgen dividiert der X und Y einfach durch Z.



  • dann weißt du anscheinend nicht was eine Projektionsmatrix ist - wüßtest du das wüßtest du das in der 4 Kompontent die Tiefe landet und beim Dehomogenisieren durch diese geteilt wird was genau x/z bzw. y/z entspricht



  • 314159265358979 schrieb:

    Ich weiß zwar, was eine Projektionsmatrix ist, aber das beantwortet meine Frage nicht. Im Scherfgen dividiert der X und Y einfach durch Z.

    Hast du den Thread gestartet? Und OpenGL und Direct3D arbeiten mit Projektionsmatrizen und dividieren nicht einfach durch Z.



  • paulrei schrieb:

    Das Problem liegt darin, dass daraus einige komische Verzerrungen bei Würfeln und Quadern resultieren.

    Was für "Verzerrungen" meinst du da genau?

    paulrei schrieb:

    [...] wie machen es die "Profis" von DirectX und OpenGL???

    Genau so...



  • Ich habe mich schon mehrfach im Internet über Projektionsmatritzen informiert, aber irgendwie verstehe ich das nicht... es würde mir schon reichen, einfach "von vorne" auf das Objekt zu schauen...
    Zu dem code: was sind v1,v2 und v3?



  • Zu den Verzerrungen:
    Wenn ich einen Würfel habe und die Koordinaten durch Z teile, sieht der Würfel nach hinten (Z) immer ewig lang aus.



  • Du kannst das auch ohne Matritzen machen, Matritzen sind nur eine allgemeine Form um lineare Transformationen zu repräsentieren. Die perspektivische Projektion ist zwar nicht direkt eine lineare Transformation aber durch den Trick mit den homogenen Koordinaten lässt sich auch sowas, wie Vertexwahn schon gesagt hat, dank der anschließenden Homogenisierung über Matritzen darstellen.



  • paulrei schrieb:

    Zu den Verzerrungen:
    Wenn ich einen Würfel habe und die Koordinaten durch Z teile, sieht der Würfel nach hinten (Z) immer ewig lang aus.

    Komisch, wie und was genau machst du da?



  • Ich meine damit, dass es nicht wie ein Würfel aussieht, sondern eher wie ein Tunnel, der weit nach hinten reicht. 😮



  • Ich habe mich schon mehrfach im Internet über Projektionsmatritzen informiert, aber irgendwie verstehe ich das nicht

    wo liegt das Problem?

    Perspektivische Projektion von Sebastian Steppeler
    Sebis DirectX Forum
    http://sebastian.g3th.net/files/papers/projektion.doc

    Real-Time Rendering Second Editon
    Thomas Akenine-Möller, Eric Haines

    Deriving Projection Matrices - Joe Farrell <- eine super Erklärung
    http://www.codeguru.com/cpp/misc/misc/math/article.php/c10123__3/



  • paulrei schrieb:

    Ich meine damit, dass es nicht wie ein Würfel aussieht, sondern eher wie ein Tunnel, der weit nach hinten reicht. 😮

    Mir ist schon klar was du meinst, nur bedeutet das eben dass du was falsch machst. Was genau das ist kann ich dir so allerdings leider nicht verraten, dazu müsstest du schon zeigen was genau du machst...



  • Ich weiss nicht warum immer alles so kompliziert geredet werden muss.

    Die ganze Fummelei mit der Projektionsmatrix ändert nichts daran, dass man einen Wert aus Z ableitet, und alle Koordinaten dann durch diesen Wert dividiert.
    Vom Prinzip her ist das genau das selbe was der OP macht.
    Aussagen wie "OpenGL und D3D dividieren nicht durch Z, die verwenden ne Projektionsmatrix" sind also a) wenig hilfreich und b) mMn. sogar falsch.

    paulrei schrieb:

    Ich habe es mit der Formel

    X(neu) = X(alt) / Z
    Y(neu) = Y(alt) / Z
    

    Das Problem liegt darin, dass daraus einige komische Verzerrungen bei Würfeln und Quadern resultieren.

    Das passt schon. Vermutlich führt einfach die Position deiner Geometrie dazu dass sie komisch verzerrt aussieht, weil sie zu nah an der Kamera klebt. Versuch mal alles etwas weiter nach hinten zu verschieben:

    X(neu) = X(alt) / (Z + offset)
    Y(neu) = Y(alt) / (Z + offset)
    

    Was ist das Problem und wie machen es die "Profis" von DirectX und OpenGL???

    Im Prinzip genau so.
    Dort werden zwar die schon erwähnten Matritzen verwendet. Die Division durch Z ist aber ebenso vorhanden (wenn auch auf Umwegen, aber das ist ja egal).

    ----

    Was den Fall Z <= 0 angeht: die Kamera hat Z = 0 (Brennpunkt), daher kann es keine Punkte geben die Z = 0 haben (sie würden dann ja mitten in der Kamera liegen). Und alles was Z < 0 hat ist hinter der Kamera und daher nicht sichtbar. Man sucht sich also eine Mindestdistanz zur Kamera in Z-Richtung aus, und alles was näher ist wird einfach nicht gezeichnet. ( if (Z < minZ) -> nicht zeichnen )

    Bei OpenGL/D3D wäre das die "near Z clipping plane".



  • 314159265358979 schrieb:

    Das habe ich mich auch schon gefragt. Was ich mich dabei auch frage ist, was passiert, wenn Z = 0 ist.

    Das sind ganz spezielle Punkte, die allerdings nicht darstellbar sind. Das sind die sogenannten "Punkte im Unendlichen" und der Grund, weshalb man so gerne im Projektionsraum arbeitet.
    Eine Interpretation der Punkte ist, dass sie Richtungsvektoren sind, und keine Raumkoordinaten.
    Eine andere Interpretation ist: wenn man eine lange Strasse bis zum Horizont hinterherschaut, treffen sich die Strassenraender merkwuerdigerweise an einem Punkt. Tun sie natuerlich nicht, sieht aber so aus. Und genau das sind die Punkte im Unendlichen.
    Verwendet werden sie, wenn man eine perspektivische Transformation aus einem Bild wieder rausrechnen will.



  • @otze:
    Ich glaub du hast die Frage falsch verstanden.
    Z = 0 sind Punkte die auf gleicher Höhe liegen wie die Kamera.
    Und die Frage war (denke ich), wie man die Projektion nach

    X' = X/Z
    Y' = Y/Z
    

    durchführen soll wenn Z = 0.



  • Danke, das mit dem offset muss ich mal ausprobieren - das kann gut sein!
    Gruß paulrei 😃 😉


Anmelden zum Antworten