added trace line

This commit is contained in:
2024-11-14 06:37:41 +03:00
parent 455e8d2509
commit 918036605b
8 changed files with 206 additions and 3 deletions

View File

@@ -3,8 +3,11 @@ target_sources(omath PRIVATE
Matrix.cpp
color.cpp
Vector4.cpp
Vector2.cpp)
Vector2.cpp
Triangle3d.cpp
)
add_subdirectory(prediction)
add_subdirectory(pathfinding)
add_subdirectory(projection)
add_subdirectory(projection)
add_subdirectory(collision)

36
source/Triangle3d.cpp Normal file
View File

@@ -0,0 +1,36 @@
#include "omath/Triangle3d.hpp"
namespace omath
{
Triangle3d::Triangle3d(const Vector3 &vertex1, const Vector3 &vertex2, const Vector3 &vertex3)
: m_vertex1(vertex1), m_vertex2(vertex2), m_vertex3(vertex3)
{
}
Vector3 Triangle3d::CalculateNormal() const
{
return (m_vertex1 - m_vertex2).Cross(m_vertex3 - m_vertex1).Normalized();
}
float Triangle3d::SideALength() const
{
return m_vertex1.DistTo(m_vertex2);
}
float Triangle3d::SideBLength() const
{
return m_vertex3.DistTo(m_vertex2);
}
Vector3 Triangle3d::SideAVector() const
{
return m_vertex1 - m_vertex2;
}
Vector3 Triangle3d::SideBVector() const
{
return m_vertex3 - m_vertex2;
}
}

View File

@@ -0,0 +1 @@
target_sources(omath PRIVATE LineTracer.cpp)

View File

@@ -0,0 +1,40 @@
//
// Created by Orange on 11/13/2024.
//
#pragma once
#include "omath/collision/LineTracer.hpp"
namespace omath::collision
{
bool LineTracer::CanTraceLine(const Ray &ray, const Triangle3d &triangle)
{
const auto sideA = triangle.SideAVector();
const auto sideB = triangle.SideBVector();
const auto rayDir = ray.end - ray.start;
const auto p = rayDir.Cross(sideB);
const auto det = sideA.Dot(p);
if (std::abs(det) < 1e-6)
return true;
const auto invDet = 1 / det;
const auto t = ray.start - triangle.m_vertex2;
const auto u = t.Dot(p) * invDet;
if (u < 0.f || u > 1.f)
return true;
const auto q = t.Cross(sideA);
const auto v = rayDir.Dot(q) * invDet;
if (v < 0.f || u + v > 1.f)
return true;
return sideB.Dot(q) * invDet <= 0.f;
}
}