/ / Ustawianie wektora w ustawieniach kamery w ray tracerze - kamera, raytracing

Ustawianie wektora w ustawieniach kamery w ray tracer - kamera, raytracing

Czytam podstawy grafiki komputerowej ipróbuję założyć własny ray tracer. książka mówi: „Najczęstszym sposobem konstruowania ramki kamery jest z punktu widzenia, który staje się e, kierunek widoku, który wynosi − w, i wektor w górę, który jest używany do konstruowania podstawy, która ma v i w płaszczyzna określona przez kierunek widoku i kierunek do góry ”

ale potem natknąłem się Jak poruszać kamerą za pomocą ray tracera? co mówi, że musimy poprawić wektor w górę dla (nachylenia?), wykonując iloczyn krzyżowy z kierunkiem kamery (w). Dlaczego?

Dzwonię do konfiguracji aparatu z lookAt (0,0,0) i wyżej (0,1,0)

// a camera can be constructed using a position, direction and an up vector
Camera::Camera(Vector position, Vector lookAt, Vector up) {
this->position = position;
this->lookAt = lookAt;

// the difference between camera position and where we want
// to look at is the direction of the camera
Vector direction = lookAt.diff(position);

// camera frame
w = direction.normalize();
v = up.cross(w).normalize(); // right vector


// which is the correct up?
u = up.normalize();
printf("%.2f %.2f %.2fn", u.getX(), u.getY(), u.getZ()); // prints 0 1 0

u = v.cross(w).normalize(); // the up vector
printf("%.2f %.2f %.2fn", u.getX(), u.getY(), u.getZ()); // prints 0.31 -0.86 -0.41
}

Odpowiedzi:

1 dla odpowiedzi № 1

Na koniec potrzebujesz pary wektorówktóry tworzy ortonormalną podstawę płaszczyzny obrazu. Jeden z nich będzie wskazywał w prawo w stosunku do orientacji aparatu. Drugi będzie skierowany w górę w stosunku do orientacji aparatu.

Jeśli wektor do góry jest ogólnym „to niebosposób ”, a jeśli kamera nie jest wypoziomowana, wektor w górę i wektor w górę kamery będą się nieco różnić. Wektor w górę jest wskazówką co do pożądanej orientacji, ale nie jest to właściwy wektor. W tym przypadku możesz przekroczyć prawy wektor z wektorem kierunku, a to „da ci wektor, który leży w płaszczyźnie obrazu i jest prostopadły do ​​prawego wektora. To jest to, czego chcesz.

Jeśli w górę wektor jest ogólny, „niebo jest w ten sposób”, a jeśli twój aparat jest poziom, a następnie wektor w górę i camera_upwektor będzie dokładnie taki sam. Dodatkowy produkt krzyżowy byłby niepotrzebny, ale nie ma w nim szkody, jeśli chcesz, aby kod był wystarczająco ogólny, aby obsłużyć pierwszą sprawę.

Być może niektóre dzieła ASCII mogą pomóc wyjaśnić ...

^                                        * look-at point
| "up"        "camera up"
|                  
|       image plane 

"camera down"

Wektor w górę jest prosto w górę. Punkt patrzenia jest wyższy niż aparat, więc aparat musi się nieco przechylić do tyłu. Na schemacie widzimy krawędź płaszczyzny obrazu. „Właściwy” wektor znajduje się w tej płaszczyźnie i jest wskazany na schemacie. Wektor kierunku (który nazwał Twój kod w) jest prostopadła do obrazu i wskazuje bezpośrednio na punkt patrzenia.

Wektor kameryu w twoim kodzie) musi leżeć na płaszczyźnie obrazu, więc nie możemy po prostu użyć „w górę”. I musi być prostopadła do wektora „właściwego”. Najłatwiejszym sposobem uzyskania tego jest przekroczenie tych dwóch wektorów.

Ponieważ wygenerowaliśmy „właściwy” wektor pod względem oryginalnego wektora w górę, daje nam to orientację.