Example Usage

Everything in the meshrender model revolves around the Scene object, which manages the lights, objects, and camera in the world.

Simple Example

In this example, we will render a pair of triangular meshes, illuminated by a point light source.

import numpy as np
import trimesh
from autolab_core import RigidTransform
from perception import CameraIntrinsics, RenderMode

from meshrender import Scene, MaterialProperties, AmbientLight, PointLight, SceneObject, VirtualCamera

# Start with an empty scene
scene = Scene()

#====================================
# Add objects to the scene
#====================================

# Begin by loading meshes
cube_mesh = trimesh.load_mesh('cube.obj')
sphere_mesh = trimesh.load_mesh('sphere.obj')

# Set up each object's pose in the world
cube_pose = RigidTransform(
    rotation=np.eye(3),
    translation=np.array([0.0, 0.0, 0.0]),
    from_frame='obj',
    to_frame='world'
)
sphere_pose = RigidTransform(
    rotation=np.eye(3),
    translation=np.array([1.0, 1.0, 0.0]),
    from_frame='obj',
    to_frame='world'
)

# Set up each object's material properties
cube_material = MaterialProperties(
    color = np.array([0.1, 0.1, 0.5]),
    k_a = 0.3,
    k_d = 1.0,
    k_s = 1.0,
    alpha = 10.0,
    smooth=False
)
sphere_material = MaterialProperties(
    color = np.array([0.1, 0.1, 0.5]),
    k_a = 0.3,
    k_d = 1.0,
    k_s = 1.0,
    alpha = 10.0,
    smooth=True
)

# Create SceneObjects for each object
cube_obj = SceneObject(cube_mesh, cube_pose, cube_material)
sphere_obj = SceneObject(sphere_mesh, sphere_pose, sphere_material)

# Add the SceneObjects to the scene
scene.add_object('cube', cube_obj)
scene.add_object('sphere', sphere_obj)

#====================================
# Add lighting to the scene
#====================================

# Create an ambient light
ambient = AmbientLight(
    color=np.array([1.0, 1.0, 1.0]),
    strength=1.0
)

# Create a point light
point = PointLight(
    location=np.array([1.0, 2.0, 3.0]),
    color=np.array([1.0, 1.0, 1.0]),
    strength=10.0
)

# Add the lights to the scene
scene.ambient_light = ambient # only one ambient light per scene
scene.add_light('point_light_one', point)

#====================================
# Add a camera to the scene
#====================================

# Set up camera intrinsics
ci = CameraIntrinsics(
    frame = 'camera',
    fx = 525.0,
    fy = 525.0,
    cx = 319.5,
    cy = 239.5,
    skew=0.0,
    height=480,
    width=640
)

# Set up the camera pose (z axis faces away from scene, x to right, y up)
cp = RigidTransform(
    rotation = np.array([
        [0.0, 0.0, -1.0],
        [0.0, 1.0,  0.0],
        [1.0, 0.0,  0.0]
    ]),
    translation = np.array([-0.3, 0.0, 0.0]),
    from_frame='camera',
    to_frame='world'
)

# Create a VirtualCamera
camera = VirtualCamera(ci, cp)

# Add the camera to the scene
scene.camera = camera

#====================================
# Render images
#====================================

# Render raw numpy arrays containing color and depth
color_image_raw, depth_image_raw = scene.render(render_color=True)

# Alternatively, just render a depth image
depth_image_raw = scene.render(render_color=False)

# Alternatively, collect wrapped images
wrapped_color, wrapped_depth, wrapped_segmask = scene.wrapped_render(
    [RenderMode.COLOR, RenderMode.DEPTH, RenderMode.SEGMASK]
)