class mrpt::viz::COrbitCameraController

Overview

Framework-agnostic orbit/pan/zoom camera controller.

Encapsulates the camera state (azimuth, elevation, zoom distance, pointing-at, roll, FOV, projective flag) and the mouse-delta math that converts raw pointer/scroll events into camera changes.

It is intentionally free of any UI or OpenGL dependency so it can be reused by mrpt_gui (nanogui), mrpt_imgui (Dear ImGui), or any future frontend.

Typical usage - forward framework mouse events into the three on* methods; then call applyTo(camera) before rendering:

mrpt::viz::COrbitCameraController ctrl;
ctrl.setCameraPointing(0, 0, 0);
ctrl.setZoomDistance(15.0f);

// Inside your mouse-move handler:
ctrl.onMouseMove(x, y, MouseButtons::Left, KeyModifiers::None);

// Before rendering:
ctrl.applyTo(myCamera);
#include <mrpt/viz/COrbitCameraController.h>

class COrbitCameraController
{
public:
    // enums

    enum KeyModifiers;
    enum MouseButtons;

    // structs

    struct Params;

    // fields

    float orbitSensitivity = 0.25f;
    float panSensitivity = 0.001f;
    float zoomSensitivity = 0.15f;
    float rollSensitivity = 0.15f;

    // construction

    COrbitCameraController();
    COrbitCameraController(const COrbitCameraController&);
    COrbitCameraController(COrbitCameraController&&);

    // methods

    COrbitCameraController& operator = (const COrbitCameraController&);
    COrbitCameraController& operator = (COrbitCameraController&&);

    void setCameraPointing(
        float x,
        float y,
        float z
        );

    void setCameraPointing(const mrpt::math::TPoint3Df& pt);
    void setCameraPointing(const mrpt::math::TPoint3D& pt);
    float getCameraPointingX() const;
    float getCameraPointingY() const;
    float getCameraPointingZ() const;
    void setZoomDistance(float d);
    float getZoomDistance() const;
    void setAzimuthDegrees(float deg);
    float getAzimuthDegrees() const;
    void setElevationDegrees(float deg);
    float getElevationDegrees() const;
    void setRollDegrees(float deg);
    float getRollDegrees() const;
    void setProjectiveModel(bool isProjective);
    bool isProjectiveModel() const;
    void setFOVdeg(float fov);
    float getFOVdeg() const;
    void setZoomLimits(float minZoom, float maxZoom);
    std::pair<float, float> getZoomLimits();
    void onMouseMove(int x, int y, uint8_t buttons, uint8_t modifiers);
    void onMouseButton(int x, int y, uint8_t button, bool down);
    void onScroll(float delta, uint8_t modifiers);
    void applyTo(mrpt::viz::CCamera& cam) const;
    void setFrom(const mrpt::viz::CCamera& cam);
};

Fields

float orbitSensitivity = 0.25f

deg/pixel

float panSensitivity = 0.001f

world-units * zoom factor per pixel

float zoomSensitivity = 0.15f

fractional distance change per scroll unit

float rollSensitivity = 0.15f

deg/pixel

Methods

void setZoomLimits(float minZoom, float maxZoom)

Clamp zoom to minZoom, maxZoom.

void onMouseMove(int x, int y, uint8_t buttons, uint8_t modifiers)

Call on pointer-move events while any button is held.

void onMouseButton(int x, int y, uint8_t button, bool down)

Call on button press/release.

void onScroll(float delta, uint8_t modifiers)

Call on scroll-wheel events.

Parameters:

delta

+1 = wheel-up (zoom in), -1 = wheel-down (zoom out). Fractional values are accepted (high-DPI trackpads).

modifiers

KeyModifiers bitmask.

void applyTo(mrpt::viz::CCamera& cam) const

Writes the current orbit parameters into cam.

void setFrom(const mrpt::viz::CCamera& cam)

Initialises the controller from an existing CCamera.