Ray-Generation Inkonsistenz
-
22-09-2019 - |
Frage
Ich habe Code geschrieben, der einen Strahl aus dem „Auge“ der Kamera auf die Betrachtungsebene weg Auge von der Kamera in einige Entfernung erzeugt:
R3Ray ConstructRayThroughPixel(...)
{
R3Point p;
double increments_x = (lr.X() - ul.X())/(double)width;
double increments_y = (ul.Y() - lr.Y())/(double)height;
p.SetX( ul.X() + ((double)i_pos+0.5)*increments_x );
p.SetY( lr.Y() + ((double)j_pos+0.5)*increments_y );
p.SetZ( lr.Z() );
R3Vector v = p-camera_pos;
R3Ray new_ray(camera_pos,v);
return new_ray;
}
ul
ist die linke obere Ecke der Betrachtungsebene und lr
ist die linke untere Ecke der Betrachtungsebene. Sie sind wie folgt definiert:
R3Point org = scene->camera.eye + scene->camera.towards * radius;
R3Vector dx = scene->camera.right * radius * tan(scene->camera.xfov);
R3Vector dy = scene->camera.up * radius * tan(scene->camera.yfov);
R3Point lr = org + dx - dy;
R3Point ul = org - dx + dy;
Hier org
ist das Zentrum der Betrachtungsebene mit radius
der Abstand zwischen der Betrachtungsebene ist und das Kameraauge, dx
und dy
werden die Verschiebungen in der x- und y-Richtung von der Mitte von der Betrachtungsebene.
Die ConstructRayThroughPixel(...)
Funktion funktioniert perfekt für eine Kamera, deren Auge ist (0,0,0). Wenn jedoch die Kamera an einem bestimmten anderen Position ist, nicht alle benötigten Strahlen für das Bild erzeugt wird.
Irgendwelche Vorschläge, was könnte schief gehen werden? Vielleicht etwas falsch mit meinen Gleichungen?
Danke für die Hilfe.
Lösung 2
Der Grund, warum mein Code nicht funktioniert war, weil ich x, y, z-Werte getrennt zu behandeln. Das ist falsch, da die Kamera in jede Richtung gerichtet werden kann und somit, wenn sie die x-Achse nach unten gerichtet wurde, wäre die X-Koordinaten die gleichen sind, produzieren increments
von 0 (was nicht korrekt ist). Stattdessen sollte, was getan werden soll, eine Interpolation von Eckpunkten (wo Punkten x, y, z-Koordinaten). Bitte siehe Antwort in verwandtem Beitrag: 3D-Darstellung von 2D-Koordinatenpunkt gegeben Kamera und Sichtebene
Andere Tipps
Hier ist eine Spitzfindigkeit, die nichts mit Ihnen haben Problem zu tun:
Wenn Sie dies tun:
R3Vector dx = scene->camera.right * radius * tan(scene->camera.xfov);
R3Vector dy = scene->camera.up * radius * tan(scene->camera.yfov);
Ich gehe davon aus, dass der right
und up
Vektoren normalisiert werden, nicht wahr? In diesem Fall möchten Sie sin
nicht tan
. Natürlich wird es, wenn die fov
Winkel klein sind nicht viel Unterschied machen.