1
0
forked from josh/j3ml

Implement CreateFrustumFromCamera

This commit is contained in:
2024-01-10 14:46:12 -05:00
parent cc9ff95daa
commit dea5735c87
7 changed files with 179 additions and 14 deletions

View File

@@ -32,7 +32,8 @@ file(GLOB_RECURSE J3ML_SRC "src/J3ML/*.c" "src/J3ML/*.cpp")
include_directories("include") include_directories("include")
add_library(J3ML SHARED ${J3ML_SRC} add_library(J3ML SHARED ${J3ML_SRC}
src/J3ML/LinearAlgebra/AxisAngle.cpp) src/J3ML/LinearAlgebra/AxisAngle.cpp
include/J3ML/LinearAlgebra/Vector.h)
set_target_properties(J3ML PROPERTIES LINKER_LANGUAGE CXX) set_target_properties(J3ML PROPERTIES LINKER_LANGUAGE CXX)
install(TARGETS ${PROJECT_NAME} DESTINATION lib/${PROJECT_NAME}) install(TARGETS ${PROJECT_NAME} DESTINATION lib/${PROJECT_NAME})

View File

@@ -3,12 +3,13 @@
#pragma once #pragma once
namespace Geometry { namespace Geometry {
using Point2D = LinearAlgebra::Vector2; using Vector2 = LinearAlgebra::Vector2;
using Vector3 = LinearAlgebra::Vector3;
class LineSegment2D class LineSegment2D
{ {
Point2D A; Vector2 A;
Point2D B; Vector2 B;
}; };
class Rectangle; //AABB2D; class Rectangle; //AABB2D;
@@ -29,7 +30,7 @@ namespace Geometry {
using Point3D = LinearAlgebra::Vector3;
// A 3D axis-aligned bounding box // A 3D axis-aligned bounding box
// This data structure can be used to represent coarse bounds of objects, in situations where detailed triangle-level // This data structure can be used to represent coarse bounds of objects, in situations where detailed triangle-level
@@ -44,18 +45,59 @@ namespace Geometry {
class Line; class Line;
class LineSegment class LineSegment
{ {
Point3D A; Vector3 A;
Point3D B; Vector3 B;
}; };
class Ray class Ray
{ {
Point3D Origin; Vector3 Origin;
Point3D Direction; Vector3 Direction;
}; };
class OBB; class OBB;
class Frustum; class Plane
class Plane; {
public:
Vector3 Position;
Vector3 Normal;
float distance = 0.f;
};
class Frustum {
public:
Plane TopFace;
Plane BottomFace;
Plane RightFace;
Plane LeftFace;
Plane FarFace;
Plane NearFace;
};
class Camera {
public:
Vector3 Position;
Vector3 Front;
Vector3 Right;
Vector3 Up;
};
static Frustum CreateFrustumFromCamera(const Camera& cam, float aspect, float fovY, float zNear, float zFar)
{
Frustum frustum;
const float halfVSide = zFar * tanf(fovY * 0.5f);
const float halfHSide = halfVSide * aspect;
const Vector3 frontMultFar = cam.Front * zFar;
frustum.NearFace = Plane{cam.Position + cam.Front * zNear, cam.Front};
frustum.FarFace = Plane{cam.Position + frontMultFar, -cam.Front};
frustum.RightFace = Plane{cam.Position, Vector3::Cross(frontMultFar - cam.Right * halfHSide, cam.Up)};
frustum.LeftFace = Plane{cam.Position, Vector3::Cross(cam.Up, frontMultFar+cam.Right*halfHSide)};
frustum.TopFace = Plane{cam.Position, Vector3::Cross(cam.Right, frontMultFar - cam.Up * halfVSide)};
frustum.BottomFace = Plane{cam.Position, Vector3::Cross(frontMultFar + cam.Up * halfVSide, cam.Right)};
return frustum;
}
class Polygon; class Polygon;
class Polyhedron; class Polyhedron;
class QuadTree; class QuadTree;

View File

@@ -10,7 +10,7 @@ namespace LinearAlgebra {
* The elements of this matrix are * The elements of this matrix are
* m_00, m_01, m_02, m_03 * m_00, m_01, m_02, m_03
* m_10, m_11, m_12, m_13 * m_10, m_11, m_12, m_13
* m_20, m_21, m_22, m_23, * m_20, m_21, m_22, xm_23,
* m_30, m_31, m_32, m_33 * m_30, m_31, m_32, m_33
* *
* The element m_yx is the value on the row y and column x. * The element m_yx is the value on the row y and column x.
@@ -18,8 +18,42 @@ namespace LinearAlgebra {
*/ */
class Matrix4x4 { class Matrix4x4 {
public: public:
enum { Rows = 4 };
enum { Cols = 4 };
static const Matrix4x4 Zero; static const Matrix4x4 Zero;
static const Matrix4x4 Identity; static const Matrix4x4 Identity;
static const Matrix4x4 NaN;
Matrix4x4() {}
Matrix4x4(float val);
Matrix4x4(float m00, float m01, float m02, float m03,
float m10, float m11, float m12, float m13,
float m20, float m21, float m22, float m23,
float m30, float m31, float m32, float m33);
Matrix4x4(const Vector4& r1, const Vector4& r2, const Vector4& r3, const Vector4& r4);
explicit Matrix4x4(const Quaternion& orientation);
Vector4 GetRow(int index) const;
Vector4 GetColumn(int index) const;
float At(int x, int y) const;
Vector4 Diagonal() const;
Vector4 WorldX() const;
Vector4 WorldY() const;
Vector4 WorldZ() const;
/// Computes the determinant of this matrix.
// If the determinant is nonzero, this matrix is invertible.
float Determinant() const;
Matrix4x4 Inverse() const;
Matrix4x4 Transpose() const;
Vector2 Transform(const Vector2& rhs) const;
Vector3 Transform(const Vector3& rhs) const;
Vector4 Transform(const Vector4& rhs) const;
Vector3 GetTranslationComponent() const; Vector3 GetTranslationComponent() const;
Matrix3x3 GetRotationComponent() const; Matrix3x3 GetRotationComponent() const;

View File

@@ -0,0 +1,13 @@
#pragma once
template <typename T, int Dims>
class templated_vector
{
};
using v2f = templated_vector<float, 2>;
using v3f = templated_vector<float, 3>;
using v4f = templated_vector<float, 4>;

View File

@@ -1,5 +1,5 @@
#include <iostream> #include <iostream>
#include <J3ML/Geometry.h>
int main(int argc, char** argv) int main(int argc, char** argv)
{ {

View File

@@ -1,5 +1,80 @@
#include <J3ML/LinearAlgebra/Matrix4x4.h> #include <J3ML/LinearAlgebra/Matrix4x4.h>
#include <J3ML/LinearAlgebra/Vector4.h>
namespace LinearAlgebra { namespace LinearAlgebra {
const Matrix4x4 Matrix4x4::Zero = Matrix4x4(0);
const Matrix4x4 Matrix4x4::Identity = Matrix4x4({1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1});
const Matrix4x4 Matrix4x4::NaN = Matrix4x4(NAN);
Matrix4x4::Matrix4x4(const Vector4 &r1, const Vector4 &r2, const Vector4 &r3, const Vector4 &r4) {
this->elems[0][0] = r1.x;
this->elems[0][1] = r1.y;
this->elems[0][2] = r1.z;
this->elems[0][3] = r1.w;
this->elems[1][0] = r2.x;
this->elems[1][1] = r2.y;
this->elems[1][2] = r2.z;
this->elems[1][3] = r2.w;
this->elems[2][0] = r3.x;
this->elems[2][1] = r3.y;
this->elems[2][2] = r3.z;
this->elems[2][3] = r3.w;
this->elems[3][0] = r4.x;
this->elems[3][1] = r4.y;
this->elems[3][2] = r4.z;
this->elems[3][3] = r4.w;
}
Matrix4x4::Matrix4x4(float val) {
this->elems[0][0] = val;
this->elems[0][1] = val;
this->elems[0][2] = val;
this->elems[0][3] = val;
this->elems[1][0] = val;
this->elems[1][1] = val;
this->elems[1][2] = val;
this->elems[1][3] = val;
this->elems[2][0] = val;
this->elems[2][1] = val;
this->elems[2][2] = val;
this->elems[2][3] = val;
this->elems[3][0] = val;
this->elems[3][1] = val;
this->elems[3][2] = val;
this->elems[3][3] = val;
}
Matrix4x4::Matrix4x4(float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13,
float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33) {
this->elems[0][0] = m00;
this->elems[0][1] = m01;
this->elems[0][2] = m02;
this->elems[0][3] = m03;
this->elems[1][0] = m10;
this->elems[1][1] = m11;
this->elems[1][2] = m12;
this->elems[1][3] = m13;
this->elems[2][0] = m20;
this->elems[2][1] = m21;
this->elems[2][2] = m22;
this->elems[2][3] = m23;
this->elems[3][0] = m30;
this->elems[3][1] = m31;
this->elems[3][2] = m32;
this->elems[3][3] = m33;
}
Matrix4x4::Matrix4x4(const Quaternion &orientation) {
}
} }

View File

@@ -189,7 +189,7 @@ TEST(Vector3Test, V3_AngleBetween) {
Vector3 B {.25f, .75f, .25f}; Vector3 B {.25f, .75f, .25f};
A = A.Normalize(); A = A.Normalize();
B = B.Normalize(); B = B.Normalize();
LinearAlgebra::Angle2D ExpectedResult {-0.697914, -2.35619}; LinearAlgebra::Angle2D ExpectedResult {-0.69791365, -2.3561945};
std::cout << A.AngleBetween(B).x << ", " << A.AngleBetween(B).y << ""; std::cout << A.AngleBetween(B).x << ", " << A.AngleBetween(B).y << "";
auto angle = A.AngleBetween(B); auto angle = A.AngleBetween(B);
EXPECT_FLOAT_EQ(angle.x, ExpectedResult.x); EXPECT_FLOAT_EQ(angle.x, ExpectedResult.x);