48CameraResult CameraController::computeForRotation(
const QQuaternion &effectiveRotation,
52 float aspectRatio)
const
57 float farPlane = std::max(m_sceneSize * 20.0f, 100.0f);
58 result.
projection.perspective(45.0f, aspectRatio, m_sceneSize * 0.01f, farPlane);
61 float baseDistance = m_sceneSize * 1.5f;
62 result.
distance = baseDistance - vpZoom * (m_sceneSize * 0.05f);
63 result.
cameraPos = effectiveRotation.rotatedVector(QVector3D(0, 0, result.
distance));
64 result.
upVector = effectiveRotation.rotatedVector(QVector3D(0, 1, 0));
65 result.
lookAt = QVector3D(0, 0, 0);
68 if (applyPan && (pan.x() != 0.0f || pan.y() != 0.0f)) {
69 const QVector3D right = effectiveRotation.rotatedVector(QVector3D(1, 0, 0)).normalized();
70 const QVector3D up = result.
upVector.normalized();
71 const QVector3D offset = right * pan.x() + up * pan.y();
80 result.
model.translate(-m_sceneCenter);
90 const QQuaternion effective = m_cameraRotation * preset;
92 return computeForRotation(effective, m_zoom, QVector2D(),
false, aspectRatio);
99 const int preset = std::clamp(subView.
preset, 0, 6);
102 QQuaternion effectiveRotation;
106 effectiveRotation = presetOffset;
111 return computeForRotation(effectiveRotation, subView.
zoom, subView.
pan,
112 isPlanar, aspectRatio);
122 QQuaternion effective =
rotation * preset;
124 const QVector3D upAxis = effective.rotatedVector(QVector3D(0, 1, 0)).normalized();
125 const QVector3D rightAxis = effective.rotatedVector(QVector3D(1, 0, 0)).normalized();
127 QQuaternion yaw = QQuaternion::fromAxisAndAngle(upAxis, -delta.x() * speed);
128 QQuaternion pitch = QQuaternion::fromAxisAndAngle(rightAxis, -delta.y() * speed);
130 effective = yaw * pitch * effective;
131 rotation = effective * preset.conjugated();
141 const float panSpeed =
sceneSize * 0.002f;
142 pan += QVector2D(-delta.x() * panSpeed, delta.y() * panSpeed);
CameraController class declaration.
QQuaternion multiViewPresetOffset(int preset)
bool multiViewPresetIsPerspective(int preset)
QQuaternion perspectivePresetRotation()
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