class PbCameraNode(NodePath): """Pybullet-compatible camera node wrapper """ Z2Y = Mat4(1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1) def __init__(self, render: NodePath): self._camera = Camera('pb_camera') self._lens = MatrixLens() self._camera.set_lens(self._lens) super().__init__(self._camera) self.reparent_to(render) def set_active(self, active: bool): self._camera.set_active(active) def is_active(self): return self._camera.is_active() def update(self, pb_camera): self.set_mat(self.Z2Y * Mat4(*pb_camera.pose_mat)) mat = np.asarray(pb_camera.proj_mat).reshape(4, 4) m22, m32 = -mat[2, 2], -mat[3, 2] zfar = (2.0 * m32) / (2.0 * m22 - 2.0) znear = ((m22 - 1.0) * zfar) / (m22 + 1.0) self._lens.set_near_far(znear, zfar) self._lens.set_user_mat(self.Z2Y * Mat4(*pb_camera.proj_mat))
def init(self): for i in range(self._max_updates): camera = Camera("ShadowCam-" + str(i)) camera.set_lens(MatrixLens()) camera.set_active(False) camera.set_scene(self._scene_parent) self._tag_state_mgr.register_shadow_camera(camera) self._camera_nps.append(self._scene_parent.attach_new_node(camera)) self._cameras.append(camera) region = self._atlas_graphics_output.make_display_region() region.set_sort(1000) region.set_clear_depth_active(True) region.set_clear_depth(1.0) region.set_clear_color_active(False) region.set_camera(self._camera_nps[i]) region.set_active(False) self._display_regions.append(region) self._atlas = ShadowAtlas(self._atlas_size)
def init(self): for i in range(self._max_updates): camera = Camera("ShadowCam-" + str(i)) camera.set_lens(MatrixLens()) camera.set_active(False) camera.set_scene(self._scene_parent) self._tag_state_mgr.register_camera("shadow", camera) self._camera_nps.append(self._scene_parent.attach_new_node(camera)) self._cameras.append(camera) region = self._atlas_graphics_output.make_display_region() region.set_sort(1000) region.set_clear_depth_active(True) region.set_clear_depth(1.0) region.set_clear_color_active(False) region.set_camera(self._camera_nps[i]) region.set_active(False) self._display_regions.append(region) self._atlas = ShadowAtlas(self._atlas_size)