Triển khai vào hàmCamera::generate_ray(...)
trong src/pathtracer/camera.cpp
.
Hàm này lấy tọa độ hình ảnh chuẩn hóa( x , y ) như đầu vào và trả về một biếnRay
trong hệ tọa độ thế giới (world coordinate). Theo quy ước, đầu tiên bạn sẽ biến đổi tọa độ hình ảnh sang hệ tọa độ máy ảnh , tạo ra tia trong hệ tọa độ máy ảnh , và cuối cùng là biến đổi nó thành tia trong không gian thế giới .
Không gian camera có hệ tọa độ riêng. Như minh họa bên dưới, trong hệ tọa độ máy ảnh, máy ảnh được đặt ở vị trí( 0 , 0 , 0 ) và nhìn dọc theo trục Z , được gọi là hướng nhìn của máy ảnh.
Dọc theo hướng xem này, chúng ta định nghĩa một cảm biến máy ảnh ảo hình chữ nhật được đặt theo trục nằm trên mặt phẳng Z = - 1. Trung tâm của cảm biến ở( 0 , 0 , - 1 ). Góc dưới cùng bên trái của nó ở $( - tan (\frac{hFov}{2}) , - t a n (\frac{v F o v}{2}) , - 1 )$ và góc trên cùng bên phải của nó ở $( - tan (\frac{hFov}{2}) , - t a n (\frac{v F o v}{2}) , - 1 )$, ở đây $hFov$ và $vFov$ là trường góc nhìn dọc theo trục X và Y.
Cảm biến máy ảnh ảo này tương ứng với một hình ảnh. Một điểm trên ảnh có thể được ánh xạ tới cảm biến và ngược lại. Cụ thể, 2 tọa độ hình ảnh được chuẩn hóa là ( 0 , 0 ) và ( 1 , 1 ) ứng với góc dưới cùng bên trái và trên cùng bên phải của cảm biến trong không gian máy ảnh. Lưu ý rằng đối với tọa độ hình ảnh chuẩn hóa ( 0 , 0 ) được đặt ở góc dưới cùng bên trái của hình ảnh. Hệ tọa độ này khác với hệ tọa độ mà chúng tôi đã sử dụng trong Bài tập 1, trong đó( 0 , 0 ) ở góc trên cùng bên trái của hình ảnh.
Như thể hiện trong hình, tia trong không gian máy ảnh sẽ bắt đầu từ máy ảnh và đi qua điểm trên cảm biến tương ứng với tọa độ hình ảnh chuẩn hóa đầu vào ( x , y ) . Sau đó bạn muốn biến tia này thành tia trong không gian thế giới . Một tia thì có 2 thành phần có gốc và hướng. Bạn cần phải biến đổi cả hai một cách chính xác để chuyển đổi một cách chính xác một tia từ không gian máy ảnh sang không gian thế giới. Ngoài ra, chúng tôi yêu cầu rằng hướng tia phải là một vector chuẩn hóa .
Ghi chú thực hiện:
class Camera
có các biến thành viên sau đây mà bạn có thể sử dụng để cài đặt. Đây không phải là một danh sách đầy đủ.
hFov và vFov
xác định thông số cảm biến. Lưu ý rằng chúng được tính bằng độ chứ không phải bằng radian.pos
là vị trí camera trong không gian thế giới và c2w
là ma trận quay camera sang thế giới.'nclip
và fclip
đều lớn hơn 0 và đại diện cho mặt cắt gần và xa. Chúng tôi coi tất cả mọi thứ nằm bên ngoài hai mặt phẳng cắt này là không thể nhìn thấy đối với máy ảnh. Bạn nên khởi tạo min_t
và max_t
của của class Ray
với nclip
và fclip
. Chúng tôi sẽ giải thích cách khởi tạo này trong task 3.Sau khi hoàn thành task 1 và 2, bạn sẽ có thể tạo hình ảnh để gỡ lỗi việc triển khai của mình.
Điền vào PathTracer::raytrace_pixel(...)
trong src/pathtracer/pathtracer.cpp
.
Tọa độ pixel đầu vào nằm trong không gian hình ảnh chưa chuẩn hóa . Nhắc lại phần 1 rằng không gian ảnh có hệ tọa độ riêng, trong đó (0 , 0)được đặt ở góc dưới cùng bên trái của hình ảnh. Đầu vào ( x , y ) do đó tương ứng với góc dưới cùng bên trái của một pixel.