@@ -130,6 +130,13 @@ def __init__(
130130 self ._focus_dist = np .linalg .norm (np .asarray (lookat ) - np .asarray (pos ))
131131
132132 def build (self ):
133+ n_envs = max (self ._visualizer .scene .n_envs , 1 )
134+ self ._multi_env_pos_tensor = torch .empty ((n_envs , 3 ), dtype = gs .tc_float , device = gs .device )
135+ self ._multi_env_lookat_tensor = torch .empty ((n_envs , 3 ), dtype = gs .tc_float , device = gs .device )
136+ self ._multi_env_up_tensor = torch .empty ((n_envs , 3 ), dtype = gs .tc_float , device = gs .device )
137+ self ._multi_env_transform_tensor = torch .empty ((n_envs , 4 , 4 ), dtype = gs .tc_float , device = gs .device )
138+ self ._multi_env_quat_tensor = torch .empty ((n_envs , 4 ), dtype = gs .tc_float , device = gs .device )
139+
133140 self ._envs_offset = torch .as_tensor (self ._visualizer ._scene .envs_offset , dtype = gs .tc_float , device = gs .device )
134141
135142 self ._batch_renderer = self ._visualizer .batch_renderer
@@ -154,7 +161,12 @@ def build(self):
154161 self ._other_stacked = self ._visualizer ._context .env_separate_rigid
155162
156163 self ._is_built = True
157- self .setup_initial_env_poses ()
164+ self .set_pose (
165+ transform = self ._initial_transform , pos = self ._initial_pos , lookat = self ._initial_lookat , up = self ._initial_up
166+ )
167+ # FIXME: For some reason, it is necessary to update the camera twice...
168+ if self ._raytracer is not None :
169+ self ._raytracer .update_camera (self )
158170
159171 def attach (self , rigid_link , offset_T ):
160172 """
@@ -296,8 +308,8 @@ def _batch_render(
296308 depth = False ,
297309 segmentation = False ,
298310 normal = False ,
311+ antialiasing = True ,
299312 force_render = False ,
300- antialiasing = False ,
301313 ):
302314 """
303315 Render the camera view with batch renderer.
@@ -371,7 +383,7 @@ def render(
371383 normal_arr : np.ndarray
372384 The rendered surface normal(s).
373385 """
374- rgb_arr , depth_arr , seg_arr , seg_color_arr , normal_arr = None , None , None , None , None
386+ rgb_arr , depth_arr , seg_arr , seg_color_arr , seg_idxc_arr , normal_arr = None , None , None , None , None , None
375387
376388 if self ._batch_renderer is not None :
377389 rgb_arr , depth_arr , seg_idxc_arr , normal_arr = self ._batch_render (
@@ -521,28 +533,6 @@ def render_pointcloud(self, world_frame=True):
521533 point_cloud = point_cloud [:, :3 ].reshape ((* depth_arr .shape , 3 ))
522534 return point_cloud , mask
523535
524- @gs .assert_built
525- def setup_initial_env_poses (self ):
526- """
527- Setup the camera poses for multiple environments.
528- """
529- if self ._initial_transform is not None :
530- assert self ._initial_transform .shape == (4 , 4 )
531- self ._initial_pos , self ._initial_lookat , self ._initial_up = gu .T_to_pos_lookat_up (self ._initial_transform )
532- else :
533- self ._initial_transform = gu .pos_lookat_up_to_T (self ._initial_pos , self ._initial_lookat , self ._initial_up )
534-
535- n_envs = max (self ._visualizer .scene .n_envs , 1 )
536- self ._multi_env_pos_tensor = self ._initial_pos .repeat ((n_envs , 1 ))
537- self ._multi_env_lookat_tensor = self ._initial_lookat .repeat ((n_envs , 1 ))
538- self ._multi_env_up_tensor = self ._initial_up .repeat ((n_envs , 1 ))
539- self ._multi_env_transform_tensor = self ._initial_transform .repeat ((n_envs , 1 , 1 ))
540- self ._multi_env_quat_tensor = _T_to_quat_for_madrona (self ._multi_env_transform_tensor )
541-
542- self ._rasterizer .update_camera (self )
543- if self ._raytracer is not None :
544- self ._raytracer .update_camera (self )
545-
546536 @gs .assert_built
547537 def set_pose (self , transform = None , pos = None , lookat = None , up = None , env_idx = None ):
548538 """
0 commit comments