Skip to content

Camera

You can directly get and set camera attributes by using member functions on a viewer object:

import panopti
viewer = panopti.connect(...)

# get current camera state as dict
camera_data = viewer.camera() 

# set camera attributes manually
viewer.set_camera(
    position=(0.0, 5.0, 0.0),
    target=(0.0, 0.0, 0.0),
    projection_mode='orthographic'
)

# standard look_at function:
viewer.look_at(
    position=(-2.0, 1.0, 3.0),
    target=(0.0, -2.0, 0.0),
)

# this function is triggered when the viewer camera is manipulated
@viewer.events.camera()
def my_camera_event(viewer, camera_info):
    print('Camera was moved to ', camera_info.position)

viewer.hold()

ViewerClient.camera

camera

Return the current camera parameters as a dictionary containing:

key meaning type
position camera world coords ndarray
rotation camera XYZ euler rotation ndarray
quaternion camera rotation as quaternion ndarray
up camera up-vector ndarray
target point the camera is looking at ndarray
fov vertical field-of-view (degrees) float
near near-plane distance float
far far-plane distance float
aspect viewport aspect ratio (w / h) float
projection_mode 'perspective' or 'orthographic' str
ViewerClient.set_camera

set_camera

Update the viewer camera.

Accepts the same keyword arguments that camera returns. Any provided values will overwrite the current camera state.

ViewerClient.look_at

look_at

Position the camera and look at target.

Parameters:

Name Type Description Default
position (list, ndarray)

Camera position in world coordinates.

required
target (list, ndarray)

World coordinate the camera should look at.

required
Camera Event Decorator @viewer.events.camera()

event decorator

The camera event is triggered when the user manipulates the viewer camera (e.g. orbit, pan, zoom). This event provides a CameraInfo object containing information about the camera's current state.

Parameters:

Name Type Description Default
throttle int

Throttle interval in milliseconds. If provided, the callback will only be called at most once per throttle interval.

None

Example usage:

@viewer.events.camera()
def camera_event(viewer, camera_info):
    print('Camera was updated!')
    # swivel scene mesh to always face the camera (in Y-axis):
    mesh = viewer.get('myMesh')
    mx, my, mz = mesh.position
    cx, cy, cz = camera_info.position  # dot-access notation
    yaw = math.atan2(cx - mx, cz - mz)
    mesh.rotation = [0, yaw, 0]
    mesh.update(rotation=[0, yaw, 0])

# Or with throttling (100ms interval)
@viewer.events.camera(throttle=100)
def throttled_camera_event(viewer, camera_info):
    print('Throttled camera update!')
camera_info is a CameraInfo object with the following attributes:

attribute meaning type
position camera world coords ndarray
rotation camera XYZ euler rotation ndarray
quaternion camera rotation as quaternion ndarray
up camera up-vector ndarray
target point the camera is looking at ndarray
fov vertical field-of-view (degrees) float
near near-plane distance float
far far-plane distance float
aspect viewport aspect ratio (w / h) float
projection_mode 'perspective' or 'orthographic' str