Repository navigation
Expand file tree
/
Copy pathcamera.cpp
More file actions
73 lines (62 loc) · 1.74 KB
/
Copy pathcamera.cpp
File metadata and controls
73 lines (62 loc) · 1.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "camera.h"
#include <QtMath>
#include <algorithm>
Camera::Camera() = default;
QVector3D Camera::position() const
{
float x = m_distance * cosf(m_pitch) * cosf(m_yaw);
float y = m_distance * cosf(m_pitch) * sinf(m_yaw);
float z = m_distance * sinf(m_pitch);
return m_target + QVector3D(x, y, z);
}
QMatrix4x4 Camera::viewMatrix() const
{
QMatrix4x4 view;
view.lookAt(position(), m_target, QVector3D(0, 0, 1));
return view;
}
QMatrix4x4 Camera::projectionMatrix() const
{
QMatrix4x4 proj;
proj.perspective(m_fov, m_aspect, m_near, m_far);
return proj;
}
void Camera::rotate(float dx, float dy)
{
m_yaw -= dx * m_rotSens;
m_pitch += dy * m_rotSens;
m_pitch = std::clamp(m_pitch, -1.5f, 1.5f);
}
void Camera::setAngles(float yaw, float pitch)
{
m_yaw = yaw;
m_pitch = std::clamp(pitch, -1.5f, 1.5f);
}
void Camera::pan(float dx, float dy)
{
QVector3D forward = (m_target - position()).normalized();
QVector3D up(0, 0, 1);
QVector3D right = QVector3D::crossProduct(forward, up).normalized();
QVector3D camUp = QVector3D::crossProduct(right, forward).normalized();
float scale = m_distance * m_panScale;
m_target += right * (-dx * scale) + camUp * (dy * scale);
}
void Camera::zoom(float delta)
{
m_distance *= (1.0f - delta * m_zoomFactor);
m_distance = std::clamp(m_distance, 0.1f, 10000.0f);
}
void Camera::focusOnBounds(const QVector3D &bmin, const QVector3D &bmax)
{
m_target = (bmin + bmax) * 0.5f;
float extent = (bmax - bmin).length();
if (extent < 0.001f)
extent = 10.0f;
m_distance = extent * 1.5f;
m_near = m_distance * 0.001f;
m_far = m_distance * 100.0f;
}
void Camera::setAspectRatio(float aspect)
{
m_aspect = aspect;
}