26CameraResult CameraController::computeForRotation(
const QQuaternion &effectiveRotation,
30 float aspectRatio)
const
35 float farPlane = std::max(m_sceneSize * 20.0f, 100.0f);
36 result.
projection.perspective(45.0f, aspectRatio, m_sceneSize * 0.01f, farPlane);
39 float baseDistance = m_sceneSize * 1.5f;
40 result.
distance = baseDistance - vpZoom * (m_sceneSize * 0.05f);
41 result.
cameraPos = effectiveRotation.rotatedVector(QVector3D(0, 0, result.
distance));
42 result.
upVector = effectiveRotation.rotatedVector(QVector3D(0, 1, 0));
43 result.
lookAt = QVector3D(0, 0, 0);
46 if (applyPan && (pan.x() != 0.0f || pan.y() != 0.0f)) {
47 const QVector3D right = effectiveRotation.rotatedVector(QVector3D(1, 0, 0)).normalized();
48 const QVector3D up = result.
upVector.normalized();
49 const QVector3D offset = right * pan.x() + up * pan.y();
58 result.
model.translate(-m_sceneCenter);
68 const QQuaternion effective = m_cameraRotation * preset;
70 return computeForRotation(effective, m_zoom, QVector2D(),
false, aspectRatio);
77 const int preset = std::clamp(subView.
preset, 0, 6);
80 QQuaternion effectiveRotation;
84 effectiveRotation = presetOffset;
89 return computeForRotation(effectiveRotation, subView.
zoom, subView.
pan,
90 isPlanar, aspectRatio);
100 QQuaternion effective =
rotation * preset;
102 const QVector3D upAxis = effective.rotatedVector(QVector3D(0, 1, 0)).normalized();
103 const QVector3D rightAxis = effective.rotatedVector(QVector3D(1, 0, 0)).normalized();
105 QQuaternion yaw = QQuaternion::fromAxisAndAngle(upAxis, -delta.x() * speed);
106 QQuaternion pitch = QQuaternion::fromAxisAndAngle(rightAxis, -delta.y() * speed);
108 effective = yaw * pitch * effective;
109 rotation = effective * preset.conjugated();
119 const float panSpeed =
sceneSize * 0.002f;
120 pan += QVector2D(-delta.x() * panSpeed, delta.y() * panSpeed);
QQuaternion multiViewPresetOffset(int preset)
bool multiViewPresetIsPerspective(int preset)
QQuaternion perspectivePresetRotation()
Camera state and projection / view / model matrix computation for single- and multi-view layouts.
Viewport subdivision holding its own camera, projection, and scissor rectangle.
QQuaternion perspectiveRotation
Computed camera matrices (projection, view, model) and vectors for a single viewport.
static void applyMouseRotation(const QPoint &delta, QQuaternion &rotation, float speed=0.5f)
static void applyMousePan(const QPoint &delta, QVector2D &pan, float sceneSize)
QQuaternion rotation() const
CameraResult computeMultiView(const SubView &subView, float aspectRatio) const
CameraResult computeSingleView(float aspectRatio) const