-
Notifications
You must be signed in to change notification settings - Fork 0
/
collideableobject.cpp
95 lines (74 loc) · 2.76 KB
/
collideableobject.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
91
92
93
94
95
#include "collideableobject.h"
/*!
* \class CollideableObject
*
* \brief The CollideableObject class is the base class which must be extended by
* all objects which we want to collide in the ray tracing simulation. It enforces
* methods which are required by the algorithm.
*
* \since v1
*/
/*!
* \fn CollideableObject::interceptPlane(Ray &ray, double &t)
*
* Returns true if the ray intercepts with the plane which is this object.
* output t is the distance along the ray at which the collision occurs.
*/
bool CollideableObject::interceptPlane(Ray &ray, double &t) {
if (this->collisionsEnabled == 0) {
return false;
}
Eigen::Vector3d rayDirection = ray.getDirection();
m_normal.normalize();
double denom = m_normal.dot(rayDirection);
if (fabs(denom) > 0.0001) {
Eigen::Vector3d numerator = this->getLocation() - ray.getOrigin();
t = numerator.dot(m_normal) / denom;
return t >= 0;
}
return false;
}
CollideableObject::CollideableObject(Eigen::Vector3d location, int side,
Eigen::Vector3d normal)
: m_location(std::move(location)), side(side), m_normal(std::move(normal)) {
}
CollideableObject::~CollideableObject() = default;
const Eigen::Vector3d &CollideableObject::getLocation() const {
return CollideableObject::m_location;
}
const Eigen::Vector3d &CollideableObject::getNormal() const {
return CollideableObject::m_normal;
}
void CollideableObject::setLocation(const Eigen::Vector3d &location) {
CollideableObject::m_location = location;
}
/*!
* \brief CollideableObject::newPosition
* \param samplePositition - The position for the sample object (works like a pivot point)
* \param angle - The desired angle of incidence against the plane of the object
* \param emissionDirection - The vector direction from the laser to the sample
*
* This uses trigonometry to calculate the desired position for the object.
* This will be flipped for the other side of the sample (post interception with sample),
* as for now we are just dealing with perfect reflection.
*/
void CollideableObject::newPosition(Eigen::Vector3d samplePositition, double angle,
Eigen::Vector3d emissionDirection) {
double adjLength = samplePositition(1) - this->m_location(1);
double oppLength = std::tan(angle * (M_PI / 180.0)) * adjLength;
this->m_location(0) = oppLength * side;
if (side != 0) {
this->m_normal = std::move(emissionDirection);
this->m_normal(0) = this->m_normal(0) * side;
}
}
/*!
* \brief CollideableObject::setEnabled
* \param state
*
* enabled or disables the object in the 3D visualisation and in the ray tracing algorithm it
* will turn off the collision detection.
*/
void CollideableObject::setEnabled(int state) {
this->collisionsEnabled = state;
}