diff --git a/genesis/utils/misc.py b/genesis/utils/misc.py index f031fb6fdb..d6d1b33962 100644 --- a/genesis/utils/misc.py +++ b/genesis/utils/misc.py @@ -142,7 +142,7 @@ def assert_built(method): @functools.wraps(method) def wrapper(self, *args, **kwargs): if not self.is_built: - gs.raise_exception("Scene is not built yet.") + gs.raise_exception(f"{type(self).__name__} is not built yet.") return method(self, *args, **kwargs) return wrapper diff --git a/genesis/vis/rasterizer_context.py b/genesis/vis/rasterizer_context.py index 93a290a10a..e30ad5470a 100644 --- a/genesis/vis/rasterizer_context.py +++ b/genesis/vis/rasterizer_context.py @@ -74,6 +74,8 @@ def build(self, scene): self.scene = scene self.sim = scene.sim self.visualizer = scene.visualizer + + # Update visuals at this point avoids nasty visual artifacts during Scene build self.visualizer.update_visual_states() if self.rendered_envs_idx is None: diff --git a/genesis/vis/visualizer.py b/genesis/vis/visualizer.py index 14a3968a8d..b25200171b 100644 --- a/genesis/vis/visualizer.py +++ b/genesis/vis/visualizer.py @@ -215,10 +215,11 @@ def update_visual_states(self): return for camera in self._cameras: - if camera._attached_link is not None: - camera.move_to_attach() - elif camera._followed_entity is not None: - camera.update_following() + if camera.is_built: + if camera._attached_link is not None: + camera.move_to_attach() + elif camera._followed_entity is not None: + camera.update_following() if self._scene.rigid_solver.is_active(): self._scene.rigid_solver.update_geoms_render_T()