def __init__(self, render_scene=None, plane_grid_spacing=1., plane_grid_num_of_lines=10, spheres_count=(8, 8)) -> None: """ Base class for PyRender viewer and offscreen renderer. """ ViewerBase.__init__(self) self.spheres_count = spheres_count self.plane_grid_num_of_lines = plane_grid_num_of_lines self.plane_grid_spacing = plane_grid_spacing if render_scene is None: render_scene = PyRenderScene() render_scene.bg_color = np.array([0.75] * 3) if render_scene.main_camera_node is None: cam = PerspectiveCamera(yfov=np.deg2rad(60), aspectRatio=1.414, znear=0.005) cam_pose = np.eye(4) cam_pose[:3, 3] = RoboticTrackball.spherical_to_cartesian( 3., 0., np.deg2rad(45.), target=np.zeros(3)) cam_pose[:3, :3] = RoboticTrackball.look_at_rotation( eye=cam_pose[:3, 3], target=np.zeros(3), up=[0, 0, 1]) nc = Node(camera=cam, matrix=cam_pose) render_scene.add_node(nc) render_scene.main_camera_node = nc self.render_scene = render_scene self.nodes_and_actors = []
def __init__(self, render_scene=None, viewport_size=None, render_flags=None, viewer_flags=None, registered_keys=None, run_in_thread=True, video_filename=None, **kwargs): """ Use render_scene to specify camera or lighting or additional geometries if required. Additional viewer flags: - axes_scale - size of coordinate axes """ if render_scene is None: render_scene = pyrender.Scene() render_scene.bg_color = np.array([0.75] * 3) if render_scene.main_camera_node is None: cam = pyrender.PerspectiveCamera(yfov=np.deg2rad(60), aspectRatio=1.414, znear=0.005) cam_pose = np.eye(4) cam_pose[:3, 3] = RoboticTrackball.spherical_to_cartesian( 3., 0., np.deg2rad(45.), target=np.zeros(3)) cam_pose[:3, :3] = RoboticTrackball.look_at_rotation( eye=cam_pose[:3, 3], target=np.zeros(3), up=[0, 0, 1]) nc = pyrender.Node(camera=cam, matrix=cam_pose) render_scene.add_node(nc) render_scene.main_camera_node = nc _viewer_flags = { 'view_center': np.zeros(3), 'window_title': 'PyPhysX Scene Viewer', 'show_world_axis': True, 'show_mesh_axes': False, 'axes_scale': 0.5, 'use_raymond_lighting': True, 'plane_grid_spacing': 1., 'plane_grid_num_of_lines': 10, 'spheres_count': [8, 8], } if viewer_flags is not None: _viewer_flags.update(viewer_flags) super().__init__(render_scene, viewport_size, render_flags, _viewer_flags, registered_keys, run_in_thread, **kwargs) self.nodes_and_actors = [] fps = self.viewer_flags['refresh_rate'] self.video_writer = imageio.get_writer( video_filename, fps=fps) if video_filename is not None else None
def test_move_target90deg(self): pose = np.eye(4) pose[:3, 3] = RoboticTrackball.spherical_to_cartesian(3., np.deg2rad(90.), np.deg2rad(45.), target=np.zeros(3)) pose[:3, :3] = RoboticTrackball.look_at_rotation(eye=pose[:3, 3], target=np.zeros(3), up=[0, 0, 1]) trackball = RoboticTrackball(pose, (640, 480), 1.) trackball.move_target(np.array([1., 2., 3.])) self.assertAlmostEqual(trackball._n_target[0], -2.) self.assertAlmostEqual(trackball._n_target[1], 1.) self.assertAlmostEqual(trackball._n_target[2], 3.)
def test_rotate(self): pose = np.eye(4) pose[:3, 3] = RoboticTrackball.spherical_to_cartesian(3., 0., np.deg2rad(45.), target=np.zeros(3)) pose[:3, :3] = RoboticTrackball.look_at_rotation(eye=pose[:3, 3], target=np.zeros(3), up=[0, 0, 1]) trackball = RoboticTrackball(pose, (640, 480), 1.) trackball.set_state(RoboticTrackball.STATE_ROTATE) trackball.drag([10, 20]) # 10px in azimuth, 20px in elevation npose = trackball._n_pose d, a, e = RoboticTrackball.cartesian_to_spherical( npose[:3, 3], trackball._target) self.assertAlmostEqual(d, 3.) self.assertAlmostEqual(a, 0. - 10 * 5e-1 / (0.3 * 480)) self.assertAlmostEqual(e, np.deg2rad(45.) + 20 * 5e-1 / (0.3 * 480))