Split computations of of roll, yaw, pitch into seperate functions

This commit is contained in:
maxbyte9p
2024-04-04 14:29:22 -04:00
parent 357aeedd8c
commit 8977343c68

View File

@@ -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);
}
}