Split computations of of roll, yaw, pitch into seperate functions
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
#include <types/vertex.h>
|
||||
#include <engine/collision.h>
|
||||
#include <cmath>
|
||||
#include <tuple>
|
||||
|
||||
void VertexArray::load (const std::string& filename) {
|
||||
std::ifstream file(filename);
|
||||
@@ -142,30 +143,56 @@ void VertexArray::drawWireframe() {
|
||||
glEnd();
|
||||
}
|
||||
|
||||
std::tuple<float, float> ComputeVertexRoll(Vertex vertex, float roll) {
|
||||
float newX = vertex.x * std::cos(roll) - vertex.y * std::sin(roll);
|
||||
float newY = vertex.x * std::sin(roll) + vertex.y * std::cos(roll);
|
||||
return {newX, newY};
|
||||
}
|
||||
|
||||
std::tuple<float, float> ComputeVertexYaw(Vertex vertex, float yaw) {
|
||||
float newX = vertex.x * std::cos(yaw) + vertex.z * std::sin(yaw);
|
||||
float newZ = -vertex.x * std::sin(yaw) + vertex.z * std::cos(yaw);
|
||||
return {newX, newZ};
|
||||
}
|
||||
|
||||
std::tuple<float, float> ComputeVertexPitch(Vertex vertex, float pitch) {
|
||||
float newY = vertex.y * std::cos(pitch) - vertex.z * std::sin(pitch);
|
||||
float newZ = vertex.y * std::sin(pitch) + vertex.z * std::cos(pitch);
|
||||
return {newY, newZ};
|
||||
}
|
||||
|
||||
|
||||
|
||||
void VertexArray::rotate(const Vector3& angle) {
|
||||
float angleX = Math::Radians(angle.x);
|
||||
float angleY = Math::Radians(angle.y);
|
||||
float angleZ = Math::Radians(angle.z);
|
||||
|
||||
// Roll
|
||||
for (Vertex &vertex: vertices) {
|
||||
float newX = vertex.x * std::cos(angleZ) - vertex.y * std::sin(angleZ);
|
||||
float newY = vertex.x * std::sin(angleZ) + vertex.y * std::cos(angleZ);
|
||||
vertex.x = newX;
|
||||
vertex.y = newY;
|
||||
/*float newX = vertex.x * std::cos(angleZ) - vertex.y * std::sin(angleZ);
|
||||
float newY = vertex.x * std::sin(angleZ) + vertex.y * std::cos(angleZ);*/
|
||||
auto result = ComputeVertexRoll(vertex, angleZ);
|
||||
vertex.x = std::get<0>(result);
|
||||
vertex.y = std::get<1>(result);
|
||||
}
|
||||
|
||||
// Yaw
|
||||
for (Vertex &vertex: vertices) {
|
||||
float newX = vertex.x * std::cos(angleY) + vertex.z * std::sin(angleY);
|
||||
float newZ = -vertex.x * std::sin(angleY) + vertex.z * std::cos(angleY);
|
||||
vertex.x = newX;
|
||||
vertex.z = newZ;
|
||||
/*float newX = vertex.x * std::cos(angleY) + vertex.z * std::sin(angleY);
|
||||
float newZ = -vertex.x * std::sin(angleY) + vertex.z * std::cos(angleY);*/
|
||||
auto result = ComputeVertexYaw(vertex, angleY);
|
||||
vertex.x = std::get<0>(result);
|
||||
vertex.z = std::get<1>(result);
|
||||
}
|
||||
|
||||
// Pitch
|
||||
for (Vertex &vertex: vertices) {
|
||||
float newY = vertex.y * std::cos(angleX) - vertex.z * std::sin(angleX);
|
||||
float newZ = vertex.y * std::sin(angleX) + vertex.z * std::cos(angleX);
|
||||
vertex.y = newY;
|
||||
vertex.z = newZ;
|
||||
/*float newY = vertex.y * std::cos(angleX) - vertex.z * std::sin(angleX);
|
||||
float newZ = vertex.y * std::sin(angleX) + vertex.z * std::cos(angleX);*/
|
||||
auto result = ComputeVertexPitch(vertex, angleX);
|
||||
vertex.y = std::get<0>(result);
|
||||
vertex.z = std::get<1>(result);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user