Control camera position and orientation#

This example showcases various camera positioning and rotation techniques to navigate and view results from different angles:

  • Axis-aligned camera positions (top, bottom, front, back, left, right, isometric).

  • Camera rotation around world axes (X, Y, Z).

  • Combined transformations by chaining rotation operations.

  • Viewport-level camera control for visualization management.

Import dependencies

from ansys.result_explorer.core import launch_result_explorer
from ansys.result_explorer.core.examples import (
    ExampleKeys,
    get_example_file,
    get_example_snapshot_settings,
)
from ansys.result_explorer.core.objects import CameraPosition

Launch Result Explorer and load data#

Start a Result Explorer instance and create a workspace with a solution.

rx = launch_result_explorer()

rst_path = get_example_file(ExampleKeys.RST_MULTIPLE_CONNECTIONS)

print("Creating workspace...")
workspace = rx.create_workspace(name="Camera Example Workspace")

print("Creating solution...")
sol = rx.create_solution(
    name="Camera Example Solution",
    file_path=rst_path,
)
print(f"Solution created: {sol}")
Creating workspace...
Creating solution...
Solution created:

======================================================================
Solution: Camera Example Solution
======================================================================
ID:                      7ef35e87-1ecf-475c-9896-759962669f74
Description:             N/A

Status:
  Ready:                   Yes
  Live:                    No

Result Files:
  - /home/runner/work/pyresultexplorer/pyresultexplorer/tests/data/multiple_connections.rst (key: rst)

Analysis Information:
  Physics Type:            mechanical
  Analysis Type:           static
  Solver Version:          24.1
  Unit System:             MKS: m, kg, N, s, V, A, degC

Mesh Information:
  Num Elements:            246
  Num Nodes:               844
  Num Named Selections:    2
  Num Bodies:              18
  Distance Unit:           m

Results Information:
  Num Sets:                1
  Available Results:       28
  Time/Freq Unit:          s

Available Plot Results:
  Displacement
    - total_displacement
    - displacement [X, Y, Z]
  Stress
    - stress_tensor [XX, YY, ZZ, XY, YZ, XZ]
    - equivalent_von_mises_stress
    - principal_stress_1 [1]
    - principal_stress_2 [2]
    - principal_stress_3 [3]
  Elastic Strain
    - elastic_strain_tensor [XX, YY, ZZ, XY, YZ, XZ]
    - equivalent_elastic_strain
    - principal_elastic_strain_1 [1]
    - principal_elastic_strain_2 [2]
    - principal_elastic_strain_3 [3]
  Structural Temperature
    - structural_temperature
  Strain Energy
    - strain_energy
  Kinetic Energy
    - kinetic_energy
  Contact
    - contact_status
    - contact_pressure
    - contact_penetration
    - contact_sliding_distance
    - contact_gap_distance
    - contact_friction_stress
    - contact_total_stress
    - contact_fluid_penetration_pressure
    - contact_surface_heat_flux
  Beam Results
    - beam_axial_force
    - beam_bending_moment_y
    - beam_bending_moment_z
    - beam_torsional_moment
    - beam_axial_stress
    - beam_axial_strain
    - beam_shear_force_y
    - beam_shear_force_z
  User Defined

Solver Text Outputs (Logs): None
======================================================================

Assign a view to a viewport#

Pick a 3-D view and assign it to the workspace viewport.

views = sol.plot_views
view = next((v for v in views if "Displacement" in v.name), None) or views[0]
print(f"Using view: {view.name}")

print("Assigning view to viewport...")
viewport = workspace.assign_view(view=view, wait=True)
viewport.display_options.show_mesh_edges = True
print(f"Viewport ready: {viewport}")
viewport.save_snapshot(
    file_path="012-camera-position-initial.png", settings=get_example_snapshot_settings()
)
012 camera position
Using view: Displacement
Assigning view to viewport...
Viewport ready: Viewport(0b380bc4-d2f5-447c-a867-959692615dae)

Preserve initial camera state#

Read the initial camera state to preserve zoom and translation when applying preset orientations.

initial_cam = viewport.display_options.camera_position
initial_zoom = initial_cam.zoom if initial_cam is not None else 1.0
initial_translation = initial_cam.translation if initial_cam is not None else (0.0, 0.0, 0.0)
print(f"Initial zoom={initial_zoom}, translation={initial_translation}")


def apply_camera(label: str, cam: CameraPosition) -> None:
    """Apply a camera position and print the result."""
    print(f"\n--- {label} ---")
    cam = cam.with_zoom(initial_zoom).with_translation(*initial_translation)
    opts = viewport.display_options
    opts.camera_position = cam
    viewport.save_snapshot(
        file_path=f"012-camera-position-{label.replace(' ', '-').lower()}.png",
        settings=get_example_snapshot_settings(),
    )
Initial zoom=0.05590475075809319, translation=(-0.0017736924358639327, -0.0010054096795604189, -0.01587615475514842)

Apply axis-aligned preset views#

Set the camera to standard axis-aligned orientations.

apply_camera("Top view", CameraPosition.top())
apply_camera("Bottom view", CameraPosition.bottom())
apply_camera("Front view", CameraPosition.front())
apply_camera("Back view", CameraPosition.back())
apply_camera("Left view", CameraPosition.left())
apply_camera("Right view", CameraPosition.right_view())
apply_camera("Isometric view", CameraPosition.isometric())
  • 012 camera position
  • 012 camera position
  • 012 camera position
  • 012 camera position
  • 012 camera position
  • 012 camera position
  • 012 camera position
--- Top view ---

--- Bottom view ---

--- Front view ---

--- Back view ---

--- Left view ---

--- Right view ---

--- Isometric view ---

Apply rotations around world axes#

Rotate the camera from an isometric base around each world axis.

iso = CameraPosition.isometric()

apply_camera("Isometric + 30° around X", iso.rotate_x(30))
apply_camera("Isometric + 45° around Y", iso.rotate_y(45))
apply_camera("Isometric + 60° around Z", iso.rotate_z(60))
  • 012 camera position
  • 012 camera position
  • 012 camera position
--- Isometric + 30° around X ---

--- Isometric + 45° around Y ---

--- Isometric + 60° around Z ---

Combine multiple rotations#

Chain multiple rotations to create complex camera orientations.

apply_camera(
    "Isometric + 15° X + 30° Y + 45° Z",
    iso.rotate_x(15).rotate_y(30).rotate_z(45),
)

rx.stop()
012 camera position
--- Isometric + 15° X + 30° Y + 45° Z ---

Total running time of the script: (0 minutes 29.668 seconds)

Gallery generated by Sphinx-Gallery