29CameraResult CameraController::computeForRotation(
const QQuaternion& effectiveRotation,
33 float aspectRatio)
const
38 float farPlane = std::max(m_sceneSize * 20.0f, 100.0f);
39 result.projection.perspective(45.0f, aspectRatio, m_sceneSize * 0.01f, farPlane);
42 float baseDistance = m_sceneSize * 1.5f;
43 result.distance = baseDistance - vpZoom * (m_sceneSize * 0.05f);
44 result.cameraPos = effectiveRotation.rotatedVector(QVector3D(0, 0, result.distance));
45 result.upVector = effectiveRotation.rotatedVector(QVector3D(0, 1, 0));
46 result.lookAt = QVector3D(0, 0, 0);
49 if (applyPan && (pan.x() != 0.0f || pan.y() != 0.0f)) {
50 const QVector3D right = effectiveRotation.rotatedVector(QVector3D(1, 0, 0)).normalized();
51 const QVector3D up = result.upVector.normalized();
52 const QVector3D offset = right * pan.x() + up * pan.y();
53 result.lookAt += offset;
54 result.cameraPos += offset;
58 result.view.lookAt(result.cameraPos, result.lookAt, result.upVector);
61 result.model.translate(-m_sceneCenter);
71 const QQuaternion effective = m_cameraRotation * preset;
73 return computeForRotation(effective, m_zoom, QVector2D(),
false, aspectRatio);
80 const int preset = std::clamp(subView.
preset, 0, 6);
83 QQuaternion effectiveRotation;
87 effectiveRotation = presetOffset;
92 return computeForRotation(effectiveRotation, subView.
zoom, subView.
pan,
93 isPlanar, aspectRatio);
103 QQuaternion effective =
rotation * preset;
105 const QVector3D upAxis = effective.rotatedVector(QVector3D(0, 1, 0)).normalized();
106 const QVector3D rightAxis = effective.rotatedVector(QVector3D(1, 0, 0)).normalized();
108 QQuaternion yaw = QQuaternion::fromAxisAndAngle(upAxis, -delta.x() * speed);
109 QQuaternion pitch = QQuaternion::fromAxisAndAngle(rightAxis, -delta.y() * speed);
111 effective = yaw * pitch * effective;
112 rotation = effective * preset.conjugated();
122 const float panSpeed =
sceneSize * 0.002f;
123 pan += QVector2D(-delta.x() * panSpeed, delta.y() * panSpeed);
Camera state and projection / view / model matrix computation for single- and multi-view layouts.
3-D brain visualisation using the Qt RHI rendering backend.
bool multiViewPresetIsPerspective(int preset)
QQuaternion multiViewPresetOffset(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 applyMousePan(const QPoint &delta, QVector2D &pan, float sceneSize)
CameraResult computeMultiView(const SubView &subView, float aspectRatio) const
QQuaternion rotation() const
CameraResult computeSingleView(float aspectRatio) const
static void applyMouseRotation(const QPoint &delta, QQuaternion &rotation, float speed=0.5f)