Frage

Ich schreibe einen Ray-Tracer (unter Verwendung von Linkshänder-Koordinaten, wenn das einen Unterschied macht). Es dient dem willen, mir die Prinzipien zu unterrichten, daher verwende ich keine OpenGL- oder komplexen Funktionen wie Tiefe des Feldes (noch). Meine Kamera kann eine willkürliche Position und Ausrichtung haben; Ich geben sie mit drei Vektoren an, location, look_at, und sky, die sich wie das verhalten Äquivalente POV-Ray-Vektoren. Sein "Film" hat auch eine width und height. (Das focal Die Länge wird durch den Abstand von position zu look_at.)

Mein Problem ist, dass nicht weiß, wie man die Strahlen wirft. Ich habe zwei Mengen, vx und vy, das zeigt an, wo der Strahl enden soll. Beide variieren von -1 bis 1. Wenn sie beide -1 sind, werfe ich den Strahl von der Position der Kamera in die obere linke Ecke des "Films". Wenn sie beide 1 sind, ist der untere Recht; Wenn sie beide 0 sind, das Zentrum; Und der Rest ist offensichtlich.

Ich bin mit der Vektorarithmetik nicht vertraut, um eine Gleichung für den Strahl abzuleiten. Ich würde mich über eine Erklärung freuen, wie dies zu tun ist.

War es hilfreich?

Lösung

Sie haben beschrieben, was schon ziemlich gut gemacht werden muss. Ihr Sichtfeld wird durch die Entfernung zwischen Ihrer Kamera und Ihrem "Film" bestimmt, durch die Sie Ihre Strahlen durchsetzen werden. Je weiter die Kamera aus dem Film stammt, desto schmaler ist Ihr Sichtfeld.

Stellen Sie sich den Film als Bitmap -Bild vor, auf das die Kamera zeigt. Sagen Sie, wir positionieren die Kamera ein Gerät von der Bitmap. Wir müssen dann einen Strahl durch jede der Bitmap -Pixel werfen.

Der Vektor ist extrem einfach. Wenn wir die Kamera -Position auf (0,0,0) und den Bitmap -Film direkt davor mit seiner Mitte unter (0,0,1) setzen, ist der Strahl nach unten - tada - (1,. 1,1) und der eine nach unten links ist (-1,1,1).

Das bedeutet, dass der Unterschied zwischen unten rechts und unten links (2,0,0) beträgt.

Angenommen, Ihre horizontale Bitmap -Auflösung sollte 1000 betragen, dann können Sie wie folgt durch die unteren Pixel itererieren:

width = 1000;
cameraToBottomLeft = (-1,1,1);
bottomLeftToBottomRight = (2,0,0);

for (x = 0; x < width; x++) {
    ray = cameraToBottomLeft + (x/width) * bottomLeftToBottomRight;
    ...
}

Wenn das klar ist, fügen Sie einfach eine äquivalente äußere Schleife für Ihre Zeilen hinzu und haben alle Strahlen, die Sie benötigen.

Sie können dann den Film und die horizontale und vertikale Auflösung geeignete Variablen für die Entfernung der Kamera hinzufügen. Wenn dies erledigt ist, können Sie Ihren Look -Vektor und Ihren UP -Vektor mit Matrix -Transformationen ändern.

Wenn Sie Ihren Kopf um Computergrafiken wickeln möchten, ist eine Einführendes Lehrbuch Könnte große Hilfe sein. ich benutzte Dieses hier Im College, und ich glaube, es hat mir gefallen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top