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.

War es hilfreich?

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.

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