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);
QQuaternion multiViewPresetOffset(int preset)
bool multiViewPresetIsPerspective(int preset)
QQuaternion perspectivePresetRotation()
CameraController class declaration.
QQuaternion perspectiveRotation
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