Note
Go to the end to download the full example code.
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()
)

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())
--- 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))
--- 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()

--- Isometric + 15° X + 30° Y + 45° Z ---
Total running time of the script: (0 minutes 29.668 seconds)









