game2006/server/gameserver/glmhelper.cc
aozhiwei f9bf8342f0 1
2023-03-31 15:34:39 +08:00

79 lines
1.8 KiB
C++

#include "precompile.h"
#include <math.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include "glmhelper.h"
const glm::vec3 GlmHelper::ZERO = glm::vec3(0.0f, 0.0f, 0.0f);
const glm::vec3 GlmHelper::RIGHT = glm::vec3(1.0f, 0.0f, 0.0f);
const glm::vec3 GlmHelper::UP = glm::vec3(0.0f, 0.0f, 1.0f);
const glm::vec3 GlmHelper::DONW = glm::vec3(0.0f, 0.0f, -1.0f);
void GlmHelper::RotateY(glm::vec3& v, float angle)
{
auto transform =
glm::rotate(
glm::mat4(1.0),
angle,
//glm::radians(angle),
glm::vec3(0.0f, 1.0f, 0.0f)
);
glm::vec4 v1 = transform * glm::vec4(v.x, v.y, v.z, 0.0f);
v.x = v1.x;
v.y = v1.y;
v.z = v1.z;
}
void GlmHelper::Normalize(glm::vec3& v)
{
v = glm::normalize(v);
if (isnan(v.x)) {
abort();
}
if (isnan(v.y)) {
abort();
}
if (isnan(v.z)) {
abort();
}
}
float GlmHelper::Norm(const glm::vec3& v)
{
return glm::length(v);
}
bool GlmHelper::IsZero(const glm::vec3& v)
{
return fabs(v.x) < 0.00001f && fabs(v.y) < 0.00001f && fabs(v.z) < 0.00001f;
}
float GlmHelper::CalcAngle(const glm::vec3& v1, const glm::vec3& v2)
{
#if 1
glm::vec3 v3 = v1;
glm::vec3 v4 = v2;
v3.y = 0.0f;
v4.y = 0.0f;
float angle = acos(glm::dot(v3, v4) / Norm(v3) / Norm(v4));
#else
float angle = acos(glm::dot(v1, v2) / Norm(v1) / Norm(v2));
#endif
return angle / 3.1415926f;
}
void GlmHelper::FillVert(const glm::vec3& v, float* vert)
{
vert[0] = v.x;
vert[1] = v.y;
vert[2] = v.z;
}
bool GlmHelper::IsEqual2D(const glm::vec3& v1, const glm::vec3& v2)
{
return std::abs(v1.x - v2.x) < 0.00001f && std::abs(v1.z - v2.z) < 0.00001f;
}