# Copyright (c) Meta Platforms, Inc. and affiliates. # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. import numpy as np import numpy.typing as npt import logging def get_projection_matrix(buffer_w: int, buffer_h: int, type_: str = 'perspective') -> npt.NDArray[np.float32]: if type_ == 'perspective': fov = 35.0 near = 0.1 aspect = buffer_w / buffer_h top = near * np.tan(fov * np.pi / 360) right = top * aspect far = 10000.0 bottom = -top left = -right M_0_0 = (2 * near) / (right - left) M_0_2 = (left + right) / (left - right) M_1_1 = (2 * near) / (top - bottom) M_1_2 = (bottom + top) / (bottom-top) M_2_2 = (far + near) / (near - far) M_2_3 = (2 * far * near) / (near - far) M_3_2 = -1 M: npt.NDArray[np.float32] = np.zeros([4, 4], dtype=np.float32) M[0, 0] = M_0_0 M[0, 2] = M_0_2 M[1, 1] = M_1_1 M[1, 2] = M_1_2 M[2, 2] = M_2_2 M[2, 3] = M_2_3 M[3, 2] = M_3_2 return M else: logging.critical(f'unsupported camera type specified: {type_}') assert False