diff --git a/pytorch3d/renderer/cameras.py b/pytorch3d/renderer/cameras.py index 94683d067..dd4355094 100644 --- a/pytorch3d/renderer/cameras.py +++ b/pytorch3d/renderer/cameras.py @@ -1280,8 +1280,11 @@ def look_at_view_transform( dist, elev, azim, at, up, device=device ) dist, elev, azim, at, up = broadcasted_args - C = camera_position_from_spherical_angles( - dist, elev, azim, degrees=degrees, device=device + C = ( + camera_position_from_spherical_angles( + dist, elev, azim, degrees=degrees, device=device + ) + + at ) R = look_at_rotation(C, at, up, device=device) diff --git a/tests/test_cameras.py b/tests/test_cameras.py index 88c78ea7b..8755701b0 100644 --- a/tests/test_cameras.py +++ b/tests/test_cameras.py @@ -167,6 +167,21 @@ def test_look_at_view_transform_default_values(self): self.assertTrue(torch.allclose(R, R_default, atol=2e-7)) self.assertTrue(torch.allclose(t, t_default, atol=2e-7)) + def test_look_at_view_transform_non_default_at_position(self): + dist = 1.0 + elev = 0.0 + azim = 0.0 + at = ((1, 1, 1),) + # Using passed values for dist, elev, azim, at + R, t = look_at_view_transform(dist, elev, azim, at=at) + # Using default dist=1.0, elev=0.0, azim=0.0 + R_default, t_default = look_at_view_transform() + # test default = passed = expected + # R must be the same, t must be translated by (1,-1,1) with respect to t_default + t_trans = torch.tensor([1, -1, 1], dtype=torch.float32).view(1, 3) + self.assertTrue(torch.allclose(R, R_default, atol=2e-7)) + self.assertTrue(torch.allclose(t, t_default + t_trans, atol=2e-7)) + def test_camera_position_from_angles_python_scalar(self): dist = 2.7 elev = 90.0