Ray-tracing-box Kreuzungen
So, ich bin zurück mit einem anderen ray-tracing-Frage. Mein code macht Sphären alles schön und gut, aber die Würfel sind nicht wirklich arbeiten. Ich verwende diesen code zum testen für Kreuzungen: http://pastebin.com/qgm6vpdx (Es ist eine rekursive Funktion, t ist der Abstand zum Schnittpunkt)
Die bounding box ist definiert als:
Cube* c1 = new Cube;
c1->Corner1 = Vec3(100, 100, 100);
c1->Corner2 = Vec3(200, 200, 200);
Habe ich bestätigt, dass die Kamera nicht im inneren des Würfels.
Nun, das problem ist nur, dass der gesamte Bildschirm angezeigt wird, als grün (die Farbe bezeichnet, um den cube)
Glaube ich nicht, ich mache das cube Kreuzungen Recht, kann jemand, der Beweis Lesen mein code?
- Hi Chris, ich will nicht entmutigen Sie von der Buchung und Hilfe zu bekommen, aber ich denke, Sie sollten einige sanity checks, um Ihren code, bevor Sie Fragen stellen. Zum Beispiel, wenn Sie Ihre box Kreuzung nicht funktioniert, testen Sie Situationen, in denen Sie wissen, was die richtige Antwort sein. also box mit Ecken in (0,0,0) Größe (1,1,1) sich kreuzender, mit einem Strahl (-1,0.5,0.5) entlang bewegt (1,0,0) wird der hit bei (0,0.5,0.5), diese Art der Sache. Dann, wenn Sie hierher kommen, Sie können sich Rat zu Holen und nicht einfach nur wie ein proof reading service.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du könntest den code viel kürzer und besser lesbar. Ändern Sie beispielsweise
int tNear = -2147000000
zuint tNear = INT_MIN
und ändernzu
oder besser
und ändern
zu
Dann einen Abschnitt des Codes wird:
Und dies offenbart ein problem.
tNear
undtFar
definieren ein Intervall vont
Werte innerhalb der die Linie schneidet den Würfel. Jede Koordinate, die Sie test (x, y und z) weitere Einschränkungen des Intervalls. Aber der codetFar = max(tFar, t1)
erweitert das Intervall. Ändern Sie es zutFar = min(tFar, t1)
.Mehr grundlegend, diese Grenzen, die Sie auf Achsen ausgerichtete quader, obwohl dieser code kann später nützlich sein, als eine kurze hit-test für komplexere Formen. Sowieso, sobald diese arbeitet, möchten Sie vielleicht, um es mehr allgemein.
Können Sie eine beliebige konvexe polygon als eine Reihe von unendlichen Ebenen mit den normalenvektoren nach außen. Ein Punkt innerhalb des Polygons, wenn es "im inneren" alle Flugzeuge.
Einer Ebene teilt den Raum in zwei Hälften. Definieren Sie die Hälfte an dem die normalen Punkte als "außen" und die andere Hälfte als "Insider". Dann wird ein Punkt außerhalb einer Ebene, wenn die Ebene die Gleichung an dieser Stelle ist positiv, in der Ebene, wenn der Wert negativ ist und auf der Ebene, wenn der Wert null ist.
Ray-trace-dies bestimmen Sie die ray - /Flugzeug Kreuzungen und wählen Sie den nächsten ein. Um festzustellen, ob dieser Punkt innerhalb der Fläche aus (denken Sie daran, die Ebene ist unendlich) Sie überprüfen, ob der Punkt in alle anderen Ebenen. Wenn nicht, testen Sie die nächste Kreuzung, und so weiter.
Sobald das funktioniert ist es ganz einfach zu verlängern, um die Allgemeinen Schnittpunkte und Unterschiede von Formen (z.B. einen Würfel mit einer halbkugelförmigen Einzug in eines der Gesichter).
Einer der besten algorithmen für die Berechnung von ray-box Kreuzungen ist die slab-Methode. Ich schilderte meine optimierte Umsetzung von it -hier, wie gut.