in run_nerf_helpers.py [0:0]
def viewdirs_via_finite_differences(self, input_pts):
# input_pts: N x 3
eps = 0.000001
input_pts = input_pts.view(-1, self.num_ray_samples, 3) # rays x samples x 3
difference_type = "backward"
if difference_type == "central":
# central differences (except for first and last sample since one neighbor is missing for them)
unnormalized_central_differences = (
input_pts[:, 2:, :] - input_pts[:, :-2, :]
) # rays x (samples-2) x 3
central_differences = unnormalized_central_differences / (
torch.norm(unnormalized_central_differences, dim=-1, keepdim=True) + eps
)
# fill in first and last sample by duplicating neighboring direction
input_views = torch.cat(
[
central_differences[:, 0, :].view(-1, 1, 3),
central_differences,
central_differences[:, -1, :].view(-1, 1, 3),
],
axis=1,
) # rays x samples x 3
elif difference_type == "backward":
unnormalized_backward_differences = (
input_pts[:, 1:, :] - input_pts[:, :-1, :]
) # rays x (samples-1) x 3. 0-th sample has no direction.
backward_differences = unnormalized_backward_differences / (
torch.norm(unnormalized_backward_differences, dim=-1, keepdim=True)
+ eps
)
# fill in first sample by duplicating neighboring direction
input_views = torch.cat(
[backward_differences[:, 0, :].view(-1, 1, 3), backward_differences],
axis=1,
) # rays x samples x 3
input_views = input_views.view(-1, 3) # rays * samples x 3
input_views = self.embeddirs_fn(input_views) # rays * samples x input_ch_views
return input_views