Create camera matrix from vectors.
(
position: torch.Tensor,
look_at_position: torch.Tensor | None = None,
world_up: torch.Tensor | None = None,
inverse: bool = False,
)
| 231 | |
| 232 | |
| 233 | def create_camera_matrix( |
| 234 | position: torch.Tensor, |
| 235 | look_at_position: torch.Tensor | None = None, |
| 236 | world_up: torch.Tensor | None = None, |
| 237 | inverse: bool = False, |
| 238 | ) -> torch.Tensor: |
| 239 | """Create camera matrix from vectors.""" |
| 240 | device = position.device |
| 241 | |
| 242 | if look_at_position is None: |
| 243 | look_at_position = torch.zeros(3, device=device) |
| 244 | if world_up is None: |
| 245 | world_up = torch.tensor([0.0, 0.0, 1.0], device=device) |
| 246 | |
| 247 | position, look_at_position, world_up = torch.broadcast_tensors( |
| 248 | position, look_at_position, world_up |
| 249 | ) |
| 250 | |
| 251 | camera_front = look_at_position - position |
| 252 | camera_front = camera_front / camera_front.norm(dim=-1, keepdim=True) |
| 253 | |
| 254 | camera_right = torch.cross(camera_front, world_up, dim=-1) |
| 255 | camera_right = camera_right / camera_right.norm(dim=-1, keepdim=True) |
| 256 | |
| 257 | camera_down = torch.cross(camera_front, camera_right, dim=-1) |
| 258 | rotation_matrix = torch.stack([camera_right, camera_down, camera_front], dim=-1) |
| 259 | |
| 260 | matrix = eyes(dim=4, shape=position.shape[:-1], device=device) |
| 261 | if inverse: |
| 262 | matrix[..., :3, :3] = rotation_matrix.transpose(-1, -2) |
| 263 | matrix[..., :3, 3:4] = -rotation_matrix.transpose(-1, -2) @ position[..., None] |
| 264 | else: |
| 265 | matrix[..., :3, :3] = rotation_matrix |
| 266 | matrix[..., :3, 3] = position |
| 267 | |
| 268 | return matrix |
| 269 | |
| 270 | |
| 271 | class PinholeCameraModel: |