Algorithmus zum Rendern von 3D - Objekten?
-
Hallo zusammen,
es würde mich interessieren, wie 3D - Objekte mathematisch gesehen gerendert werden, also auf den Bildschirm gebracht werden, - ich meine hiermit nur einzelne Punkte und ohne Lichteffekte.
Ich habe es mit der FormelX(neu) = X(alt) / Z Y(neu) = Y(alt) / Z
Das Problem liegt darin, dass daraus einige komische Verzerrungen bei Würfeln und Quadern resultieren.
Was ist das Problem und wie machen es die "Profis" von DirectX und OpenGL???
Wenn jemand weiß, wie das Problem zu lösen ist, wäre ich für eine Antwort sehr dankbar!
Gruß paulrei
-
Das habe ich mich auch schon gefragt. Was ich mich dabei auch frage ist, was passiert, wenn Z = 0 ist.
-
Vielleicht taugt das hier als Einstieg.
http://wiki.delphigl.com/index.php/Tutorial_Raytracing_-_Grundlagen_I
-
Stichwort: Projektionsmatrix
-
z. B. mit Rasterisierung - etwa so:
// modelview and projection transform v1.position = m_Projection * m_Modelview * v1.position; v2.position = m_Projection * m_Modelview * v2.position; v3.position = m_Projection * m_Modelview * v3.position; v1.rhw = 1.0f / v1.position.w; // in w Steht die Tiefe v2.rhw = 1.0f / v2.position.w; v3.rhw = 1.0f / v3.position.w; // Clippen mit Homogenen Koordinaten... (Tipp: erst ohne Clipping versuchen) v1.position = Dehomogenize(v1.position); // die Perspektivische Teilung v2.position = Dehomogenize(v2.position); v3.position = Dehomogenize(v3.position); // apply viewport transformation - calculate viewport coordinates v1.position = viewport * v1.position; v2.position = viewport * v2.position; v3.position = viewport * v3.position; // Rasterisierung output_fragment.textureCoordinates.x = v1.textureCoordinates.x * v1.rhw * alpha1 + v2.textureCoordinates.x * v2.rhw * alpha2 + v3.textureCoordinates.x * v3.rhw * alpha3; output_fragment.textureCoordinates.x /= (v1.rhw * alpha1 + v2.rhw * alpha2 + v3.rhw * alpha3);
wenn du dir den Code ansiehst musst du zunächst wissen was eine Modelview Matrix ist und dann was eine Projektionsmatrix ist - zu beiden sollten man bei google etwas Literatur finden können - bzw. such mal in alten Beiträgen hier im Forum
-
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.docReal-Time Rendering Second Editon
Thomas Akenine-Möller, Eric HainesDeriving 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 nachX' = 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