# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. import typing import torch from pytorch3d.common.datatypes import Device from pytorch3d.renderer.cameras import ( CamerasBase, FoVOrthographicCameras, FoVPerspectiveCameras, OpenGLOrthographicCameras, OpenGLPerspectiveCameras, OrthographicCameras, PerspectiveCameras, SfMOrthographicCameras, SfMPerspectiveCameras, ) from pytorch3d.renderer.fisheyecameras import FishEyeCameras from pytorch3d.transforms.so3 import so3_exp_map def init_random_cameras( cam_type: typing.Type[CamerasBase], batch_size: int, random_z: bool = False, device: Device = "cpu", ): cam_params = {} T = torch.randn(batch_size, 3) * 0.03 if not random_z: T[:, 2] = 4 R = so3_exp_map(torch.randn(batch_size, 3) * 3.0) cam_params = {"R": R, "T": T, "device": device} if cam_type in (OpenGLPerspectiveCameras, OpenGLOrthographicCameras): cam_params["znear"] = torch.rand(batch_size) * 10 + 0.1 cam_params["zfar"] = torch.rand(batch_size) * 4 + 1 + cam_params["znear"] if cam_type == OpenGLPerspectiveCameras: cam_params["fov"] = torch.rand(batch_size) * 60 + 30 cam_params["aspect_ratio"] = torch.rand(batch_size) * 0.5 + 0.5 else: cam_params["top"] = torch.rand(batch_size) * 0.2 + 0.9 cam_params["bottom"] = -(torch.rand(batch_size)) * 0.2 - 0.9 cam_params["left"] = -(torch.rand(batch_size)) * 0.2 - 0.9 cam_params["right"] = torch.rand(batch_size) * 0.2 + 0.9 elif cam_type in (FoVPerspectiveCameras, FoVOrthographicCameras): cam_params["znear"] = torch.rand(batch_size) * 10 + 0.1 cam_params["zfar"] = torch.rand(batch_size) * 4 + 1 + cam_params["znear"] if cam_type == FoVPerspectiveCameras: cam_params["fov"] = torch.rand(batch_size) * 60 + 30 cam_params["aspect_ratio"] = torch.rand(batch_size) * 0.5 + 0.5 else: cam_params["max_y"] = torch.rand(batch_size) * 0.2 + 0.9 cam_params["min_y"] = -(torch.rand(batch_size)) * 0.2 - 0.9 cam_params["min_x"] = -(torch.rand(batch_size)) * 0.2 - 0.9 cam_params["max_x"] = torch.rand(batch_size) * 0.2 + 0.9 elif cam_type in ( SfMOrthographicCameras, SfMPerspectiveCameras, OrthographicCameras, PerspectiveCameras, ): cam_params["focal_length"] = torch.rand(batch_size) * 10 + 0.1 cam_params["principal_point"] = torch.randn((batch_size, 2)) elif cam_type == FishEyeCameras: cam_params["focal_length"] = torch.rand(batch_size, 1) * 10 + 0.1 cam_params["principal_point"] = torch.randn((batch_size, 2)) cam_params["radial_params"] = torch.randn((batch_size, 6)) cam_params["tangential_params"] = torch.randn((batch_size, 2)) cam_params["thin_prism_params"] = torch.randn((batch_size, 4)) else: raise ValueError(str(cam_type)) return cam_type(**cam_params)