-
Notifications
You must be signed in to change notification settings - Fork 0
/
fpmouse.cpp
90 lines (70 loc) · 1.96 KB
/
fpmouse.cpp
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "fpmouse.h"
FPMouse::FPMouse() : rad2deg(180.0 /M_PI)
{
velocity = 0.0;
trackingMouse = false;
lastTime = QTime::currentTime();
std::cerr << "Mouse criado\n";
}
void FPMouse::mouseMove(const QPointF &p)
{
if (!trackingMouse)
return;
std::cerr << "Movendo mouse \n";
QTime currentTime = QTime::currentTime();
int msecs = lastTime.msecsTo(currentTime);
if (msecs) {
QVector3D vp = mousePosTo3D(p);
QVector3D currentPos3D = QVector3D(vp.x(), vp.y(), 0);
double lenSqr = currentPos3D.lengthSquared();
if (lenSqr >= 1.0)
currentPos3D.normalize();
else
currentPos3D.setZ(sqrt(1.0 - lenSqr));
/* (lenSqr >= 1.0) ? currentPos3D.normalize() :
currentPos3D.setZ(sqrt(1.0 - lenSqr)); */
axis = QVector3D::crossProduct(lastPos3D, currentPos3D);
double angle = rad2deg * axis.length();
velocity = angle / msecs;
axis.normalize();
rotation = QQuaternion::fromAxisAndAngle(axis, angle) * rotation;
lastPos3D = currentPos3D;
lastTime = currentTime;
}
}
void FPMouse::mousePress(const QPointF &p)
{
rotation = getRotation();
trackingMouse = true;
lastTime = QTime::currentTime();
std::cerr << "Pressionando mouse \n";
lastPos3D = mousePosTo3D(p);
double lenSqr = lastPos3D.lengthSquared();
(lenSqr >= 1.0) ? lastPos3D.normalize() :
lastPos3D.setZ(sqrt(lenSqr));
velocity = 0.0;
}
void FPMouse::mouseRelease(const QPointF &p)
{
//mouseMove(p);
//trackingMouse = false;
}
void FPMouse::resizeViewport(int width, int height)
{
viewportWidth = static_cast<double>(width);
viewportHeight = static_cast<double>(height);
}
QQuaternion FPMouse::getRotation()
{
if (trackingMouse)
return rotation;
QTime currentTime = QTime::currentTime();
double angle = velocity * lastTime.msecsTo(currentTime);
return QQuaternion::fromAxisAndAngle(axis, angle) * rotation;
}
QVector3D FPMouse::mousePosTo3D(const QPointF &p)
{
return QVector3D(1.0 * p.x() / viewportWidth - 1.0,
1.0 - 1.0 * p.y() / viewportHeight,
0.0);
}