From e43f2e1aac47181136b9c82b189671d9ebefdb15 Mon Sep 17 00:00:00 2001 From: InkSoul Date: Sun, 30 Mar 2025 23:15:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20gltf=E5=8C=85=E5=9B=B4?= =?UTF-8?q?=E7=9B=92=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/render/glTFBoundingBox.cpp | 52 ++++++++++++++++++++++++++++++++++ src/render/glTFBoundingBox.h | 44 ++++++++++++++++++++++++++++ src/render/glTFModel.cpp | 2 +- src/render/glTFModel.h | 2 +- src/render/glTFModel_Common.h | 2 +- 5 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 src/render/glTFBoundingBox.cpp create mode 100644 src/render/glTFBoundingBox.h diff --git a/src/render/glTFBoundingBox.cpp b/src/render/glTFBoundingBox.cpp new file mode 100644 index 0000000..3c31dc6 --- /dev/null +++ b/src/render/glTFBoundingBox.cpp @@ -0,0 +1,52 @@ +#include "glTFBoundingBox.h" + +GLTFLOADER_NAMESPACE_BEGIN + + +glTFBoundingBOX::glTFBoundingBOX() + : m_isValid(false) + , m_Min(glm::vec3(0,0,0)) + , m_Max(glm::vec3(1,1,1)) +{ +} + +glTFBoundingBOX::glTFBoundingBOX(glm::vec3 min, glm::vec3 max) + : m_isValid(false) + , m_Min(min) + , m_Max(max) +{ +} + +glTFBoundingBOX::~glTFBoundingBOX() +{ +} + +glTFBoundingBOX glTFBoundingBOX::getAABB(glm::mat4 matrix) +{ + glm::vec3 min = glm::vec3(matrix[3]); + glm::vec3 max = min; + glm::vec3 v0, v1; + + glm::vec3 right = glm::vec3(matrix[0]); + v0 = right * m_Min.x; + v1 = right * m_Max.x; + min += glm::min(v0, v1); + max += glm::max(v0, v1); + + glm::vec3 up = glm::vec3(matrix[1]); + v0 = up * m_Min.y; + v1 = up * m_Max.y; + min += glm::min(v0, v1); + max += glm::max(v0, v1); + + glm::vec3 back = glm::vec3(matrix[2]); + v0 = back * m_Min.z; + v1 = back * m_Max.z; + min += glm::min(v0, v1); + max += glm::max(v0, v1); + + return glTFBoundingBOX(min, max); +} + + +GLTFLOADER_NAMESPACE_END \ No newline at end of file diff --git a/src/render/glTFBoundingBox.h b/src/render/glTFBoundingBox.h new file mode 100644 index 0000000..657a692 --- /dev/null +++ b/src/render/glTFBoundingBox.h @@ -0,0 +1,44 @@ +#ifndef GLTFBOUNDINGBOX_H +#define GLTFBOUNDINGBOX_H + +#include "glTFModel_Common.h" +#include + +GLTFLOADER_NAMESPACE_BEGIN + +class glTFBoundingBOX +{ +public: + glTFBoundingBOX(); + glTFBoundingBOX(glm::vec3 min, glm::vec3 max); + ~glTFBoundingBOX(); + + glTFBoundingBOX getAABB(glm::mat4 matrix); + +private: + + glm::vec3 m_Min; + glm::vec3 m_Max; + bool m_isValid = false; +}; + + + + + + + + + + + + + + + + + +GLTFLOADER_NAMESPACE_END + +#endif // !GLTFBOUNDINGBOX_H + diff --git a/src/render/glTFModel.cpp b/src/render/glTFModel.cpp index 671fc70..5ff37d8 100644 --- a/src/render/glTFModel.cpp +++ b/src/render/glTFModel.cpp @@ -29,7 +29,7 @@ glTFModel::BoundingBox::BoundingBox(glm::vec3 min, glm::vec3 max) : min(min), max(max) { }; - //Axis-Aligned Bounding Box), AABB + //Axis-Aligned Bounding Box),简称 AABB glTFModel::BoundingBox glTFModel::BoundingBox::getAABB(glm::mat4 m) { glm::vec3 min = glm::vec3(m[3]); glm::vec3 max = min; diff --git a/src/render/glTFModel.h b/src/render/glTFModel.h index 65caf3f..3e0b058 100644 --- a/src/render/glTFModel.h +++ b/src/render/glTFModel.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/render/glTFModel_Common.h b/src/render/glTFModel_Common.h index 59a2554..dfe4d56 100644 --- a/src/render/glTFModel_Common.h +++ b/src/render/glTFModel_Common.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once /// 命名空间宏 #define GLTFLOADER_NAMESPACE_BEGIN namespace glTFLoader {