From 01bfc5065d608f327c9027275ee32f951580869b Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Tue, 13 Dec 2022 15:25:01 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8C=85=E5=9B=B4?= =?UTF-8?q?=E7=9B=92=E7=9A=84=E4=B8=A4=E4=B8=AA=E9=A1=B6=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FinalProject/model.h | 2 ++ FinalProject/sceneviewer.cpp | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/FinalProject/model.h b/FinalProject/model.h index 2e319d2..20e0aa2 100644 --- a/FinalProject/model.h +++ b/FinalProject/model.h @@ -19,6 +19,8 @@ private: std::string _directory; MODELSTATUS _status = LOADING; + + public: Model(std::string path); ~Model(); diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index 37851c0..30fe06b 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -81,14 +81,17 @@ void SceneViewer::initializeGL() { vertexShader.dispose(); fragmentShader.dispose(); - Model* backpackModel = new Model("E:\\Repositories\\CollegeProjects\\CGAssignments\\FinalProject\\Models\\backpack\\backpack.obj"); + Model* backpackModel = new Model("D:/code/ComputerGraphic/SceneEditor/obj/nanosuit/nanosuit.obj"); Logger::info("Model loaded"); Renderable renderable(backpackModel); _objects.push_back(backpackModel); - _camera.setPosition(glm::vec3(0.0f, 0.0f, 3.0f)); + _camera.setPosition(glm::vec3(0.0f, 15.0f, 8.0f)); _camera.setYaw(-90.0f); - _camera.setPitch(0.0f); + _camera.setPitch(-30.0f); + + + } void SceneViewer::resizeGL(int w, int h) { From 68cbbbafe4e2b317899122cabbb5f7af4adc3c95 Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Tue, 13 Dec 2022 15:25:01 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8C=85=E5=9B=B4?= =?UTF-8?q?=E7=9B=92=E7=9A=84=E4=B8=A4=E4=B8=AA=E9=A1=B6=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FinalProject/model.h | 8 +++++++- FinalProject/sceneviewer.cpp | 9 ++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/FinalProject/model.h b/FinalProject/model.h index 2e319d2..ef26663 100644 --- a/FinalProject/model.h +++ b/FinalProject/model.h @@ -8,7 +8,7 @@ #include "mesh.h" #include "shader.h" - +#include class Model { public: enum MODELSTATUS { LOADING, LOADED, ERR }; @@ -19,6 +19,12 @@ private: std::string _directory; MODELSTATUS _status = LOADING; + // largest point + glm::vec3 right_up_front = glm::vec3(3e37f, 3e37f, 3e37f); + // smallest point + glm::vec3 left_down_back = -right_up_front; + + public: Model(std::string path); ~Model(); diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index 37851c0..30fe06b 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -81,14 +81,17 @@ void SceneViewer::initializeGL() { vertexShader.dispose(); fragmentShader.dispose(); - Model* backpackModel = new Model("E:\\Repositories\\CollegeProjects\\CGAssignments\\FinalProject\\Models\\backpack\\backpack.obj"); + Model* backpackModel = new Model("D:/code/ComputerGraphic/SceneEditor/obj/nanosuit/nanosuit.obj"); Logger::info("Model loaded"); Renderable renderable(backpackModel); _objects.push_back(backpackModel); - _camera.setPosition(glm::vec3(0.0f, 0.0f, 3.0f)); + _camera.setPosition(glm::vec3(0.0f, 15.0f, 8.0f)); _camera.setYaw(-90.0f); - _camera.setPitch(0.0f); + _camera.setPitch(-30.0f); + + + } void SceneViewer::resizeGL(int w, int h) { From b145dbc567dd45dcfc997e3cb83b0febeead4151 Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Tue, 13 Dec 2022 15:54:19 +0800 Subject: [PATCH 03/10] set boundary in loop --- FinalProject/model.cpp | 13 ++++++++++--- FinalProject/model.h | 7 +++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/FinalProject/model.cpp b/FinalProject/model.cpp index 1809c28..8a69afc 100644 --- a/FinalProject/model.cpp +++ b/FinalProject/model.cpp @@ -65,9 +65,16 @@ Mesh Model::processMesh(aiMesh* mesh, const aiScene* scene) { glm::vec3 vertexBitangent = glm::vec3(0.0f); // Process vertex positions - vertexPosition.x = mesh->mVertices[i].x; - vertexPosition.y = mesh->mVertices[i].y; - vertexPosition.z = mesh->mVertices[i].z; + // 使用循环避免代码重复,如果可行的话,可以在此循环中确定法向量等信息 + for (int j = 0; j < 3; j++) { + vertexPosition[j] = mesh->mVertices[i][j]; + left_down_back[j] = left_down_back[j] < vertexPosition[j] ? left_down_back[j] : vertexPosition[j]; + right_up_front[j] = right_up_front[j] > vertexPosition[j] ? right_up_front[j] : vertexPosition[j]; + } + + //vertexPosition.x = mesh->mVertices[i].x; + //vertexPosition.y = mesh->mVertices[i].y; + //vertexPosition.z = mesh->mVertices[i].z; // Process vertex normals if (mesh->mNormals) { diff --git a/FinalProject/model.h b/FinalProject/model.h index ef26663..636253b 100644 --- a/FinalProject/model.h +++ b/FinalProject/model.h @@ -19,11 +19,10 @@ private: std::string _directory; MODELSTATUS _status = LOADING; - // largest point - glm::vec3 right_up_front = glm::vec3(3e37f, 3e37f, 3e37f); // smallest point - glm::vec3 left_down_back = -right_up_front; - + glm::vec3 left_down_back = glm::vec3(3e37f, 3e37f, 3e37f); + // largest point + glm::vec3 right_up_front = -left_down_back; public: Model(std::string path); From 30fe45b773d220a2f25723c74468ccbd9d53d7fc Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Tue, 13 Dec 2022 16:03:28 +0800 Subject: [PATCH 04/10] define function to get boundary --- FinalProject/model.cpp | 4 +- FinalProject/model.h | 11 ++++- .../253395836ff6e468d34a6e0bb41a535/model.h | 42 +++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 enc_temp_folder/253395836ff6e468d34a6e0bb41a535/model.h diff --git a/FinalProject/model.cpp b/FinalProject/model.cpp index 8a69afc..f8ae923 100644 --- a/FinalProject/model.cpp +++ b/FinalProject/model.cpp @@ -68,8 +68,8 @@ Mesh Model::processMesh(aiMesh* mesh, const aiScene* scene) { // 使用循环避免代码重复,如果可行的话,可以在此循环中确定法向量等信息 for (int j = 0; j < 3; j++) { vertexPosition[j] = mesh->mVertices[i][j]; - left_down_back[j] = left_down_back[j] < vertexPosition[j] ? left_down_back[j] : vertexPosition[j]; - right_up_front[j] = right_up_front[j] > vertexPosition[j] ? right_up_front[j] : vertexPosition[j]; + _left_down_back[j] = _left_down_back[j] < vertexPosition[j] ? _left_down_back[j] : vertexPosition[j]; + _right_up_front[j] = _right_up_front[j] > vertexPosition[j] ? _right_up_front[j] : vertexPosition[j]; } //vertexPosition.x = mesh->mVertices[i].x; diff --git a/FinalProject/model.h b/FinalProject/model.h index 636253b..951bde1 100644 --- a/FinalProject/model.h +++ b/FinalProject/model.h @@ -20,9 +20,9 @@ private: MODELSTATUS _status = LOADING; // smallest point - glm::vec3 left_down_back = glm::vec3(3e37f, 3e37f, 3e37f); + glm::vec3 _left_down_back = glm::vec3(3e37f, 3e37f, 3e37f); // largest point - glm::vec3 right_up_front = -left_down_back; + glm::vec3 _right_up_front = -_left_down_back; public: Model(std::string path); @@ -31,6 +31,13 @@ public: public: inline MODELSTATUS status() const { return _status; } + inline glm::vec3 get_upper_bound() { + return _right_up_front; + } + inline glm::vec3 get_lower_bound() { + return _left_down_back; + } + private: void loadModel(std::string path); void processNode(aiNode* node, const aiScene* scene); diff --git a/enc_temp_folder/253395836ff6e468d34a6e0bb41a535/model.h b/enc_temp_folder/253395836ff6e468d34a6e0bb41a535/model.h new file mode 100644 index 0000000..636253b --- /dev/null +++ b/enc_temp_folder/253395836ff6e468d34a6e0bb41a535/model.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "mesh.h" +#include "shader.h" +#include +class Model { +public: + enum MODELSTATUS { LOADING, LOADED, ERR }; + +private: + std::vector _meshes; + std::vector _texturesLoaded; + std::string _directory; + MODELSTATUS _status = LOADING; + + // smallest point + glm::vec3 left_down_back = glm::vec3(3e37f, 3e37f, 3e37f); + // largest point + glm::vec3 right_up_front = -left_down_back; + +public: + Model(std::string path); + ~Model(); + +public: + inline MODELSTATUS status() const { return _status; } + +private: + void loadModel(std::string path); + void processNode(aiNode* node, const aiScene* scene); + Mesh processMesh(aiMesh* mesh, const aiScene* scene); + std::vector loadMaterialTextures(aiMaterial* mat, aiTextureType type, TextureType textureType); + +public: + void render(const ShaderProgram& shader) const; +}; \ No newline at end of file From 14a3a08bf6c6c10431ddee88f525d6e90c889253 Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Tue, 13 Dec 2022 16:42:44 +0800 Subject: [PATCH 05/10] add check_boundary --- FinalProject/model.cpp | 32 ++++++++++---- FinalProject/model.h | 5 ++- .../253395836ff6e468d34a6e0bb41a535/model.h | 42 ------------------- 3 files changed, 28 insertions(+), 51 deletions(-) delete mode 100644 enc_temp_folder/253395836ff6e468d34a6e0bb41a535/model.h diff --git a/FinalProject/model.cpp b/FinalProject/model.cpp index f8ae923..6a313d9 100644 --- a/FinalProject/model.cpp +++ b/FinalProject/model.cpp @@ -66,15 +66,15 @@ Mesh Model::processMesh(aiMesh* mesh, const aiScene* scene) { // Process vertex positions // 使用循环避免代码重复,如果可行的话,可以在此循环中确定法向量等信息 - for (int j = 0; j < 3; j++) { - vertexPosition[j] = mesh->mVertices[i][j]; - _left_down_back[j] = _left_down_back[j] < vertexPosition[j] ? _left_down_back[j] : vertexPosition[j]; - _right_up_front[j] = _right_up_front[j] > vertexPosition[j] ? _right_up_front[j] : vertexPosition[j]; - } + //for (int j = 0; j < 3; j++) { + // vertexPosition[j] = mesh->mVertices[i][j]; + // _left_down_back[j] = _left_down_back[j] < vertexPosition[j] ? _left_down_back[j] : vertexPosition[j]; + // _right_up_front[j] = _right_up_front[j] > vertexPosition[j] ? _right_up_front[j] : vertexPosition[j]; + //} - //vertexPosition.x = mesh->mVertices[i].x; - //vertexPosition.y = mesh->mVertices[i].y; - //vertexPosition.z = mesh->mVertices[i].z; + vertexPosition.x = mesh->mVertices[i].x; + vertexPosition.y = mesh->mVertices[i].y; + vertexPosition.z = mesh->mVertices[i].z; // Process vertex normals if (mesh->mNormals) { @@ -184,3 +184,19 @@ void Model::render(const ShaderProgram& shader) const { _meshes[i].render(shader); } } + +void Model::check_boundary() { + for (int i = 0; i < _meshes.size(); i++) { + for (int j = 0; j < _meshes[i].vertices().size();j++) { + // 0,1,2 for x,y,z + for (int k = 0; k < 3; k++) { + _left_down_back[k] = _left_down_back[k] < _meshes[i].vertices()[j]._position[k] ? + _left_down_back[k] : _meshes[i].vertices()[j]._position[k]; + + _right_up_front[k] = _right_up_front[k] > _meshes[i].vertices()[j]._position[k] ? + _right_up_front[k] : _meshes[i].vertices()[j]._position[k]; + } + } + } + +} \ No newline at end of file diff --git a/FinalProject/model.h b/FinalProject/model.h index 951bde1..9a22193 100644 --- a/FinalProject/model.h +++ b/FinalProject/model.h @@ -20,7 +20,7 @@ private: MODELSTATUS _status = LOADING; // smallest point - glm::vec3 _left_down_back = glm::vec3(3e37f, 3e37f, 3e37f); + glm::vec3 _left_down_back = glm::vec3(3e36f, 3e36f, 3e36f); // largest point glm::vec3 _right_up_front = -_left_down_back; @@ -31,6 +31,8 @@ public: public: inline MODELSTATUS status() const { return _status; } + + // maybe we can check if boundary has not been set yet inline glm::vec3 get_upper_bound() { return _right_up_front; } @@ -46,4 +48,5 @@ private: public: void render(const ShaderProgram& shader) const; + void check_boundary(); }; \ No newline at end of file diff --git a/enc_temp_folder/253395836ff6e468d34a6e0bb41a535/model.h b/enc_temp_folder/253395836ff6e468d34a6e0bb41a535/model.h deleted file mode 100644 index 636253b..0000000 --- a/enc_temp_folder/253395836ff6e468d34a6e0bb41a535/model.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include "mesh.h" -#include "shader.h" -#include -class Model { -public: - enum MODELSTATUS { LOADING, LOADED, ERR }; - -private: - std::vector _meshes; - std::vector _texturesLoaded; - std::string _directory; - MODELSTATUS _status = LOADING; - - // smallest point - glm::vec3 left_down_back = glm::vec3(3e37f, 3e37f, 3e37f); - // largest point - glm::vec3 right_up_front = -left_down_back; - -public: - Model(std::string path); - ~Model(); - -public: - inline MODELSTATUS status() const { return _status; } - -private: - void loadModel(std::string path); - void processNode(aiNode* node, const aiScene* scene); - Mesh processMesh(aiMesh* mesh, const aiScene* scene); - std::vector loadMaterialTextures(aiMaterial* mat, aiTextureType type, TextureType textureType); - -public: - void render(const ShaderProgram& shader) const; -}; \ No newline at end of file From cabdc8b5e8913635aca07887cda217b271bf64c5 Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Tue, 13 Dec 2022 16:48:47 +0800 Subject: [PATCH 06/10] add comment to remind user --- FinalProject/model.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/FinalProject/model.h b/FinalProject/model.h index 9a22193..44949ce 100644 --- a/FinalProject/model.h +++ b/FinalProject/model.h @@ -33,9 +33,12 @@ public: // maybe we can check if boundary has not been set yet + // Do remember to ensure you have called check_boundary inline glm::vec3 get_upper_bound() { return _right_up_front; } + + // Do remember to ensure you have called check_boundary inline glm::vec3 get_lower_bound() { return _left_down_back; } @@ -49,4 +52,7 @@ private: public: void render(const ShaderProgram& shader) const; void check_boundary(); + + // maybe we can encapsure a function to get both upper and lower bound? + }; \ No newline at end of file From 5ec0a5718ea251f5f982cc7ec817dc41d36bbc98 Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Tue, 13 Dec 2022 17:23:11 +0800 Subject: [PATCH 07/10] modify constructor of renderable and update skeleton --- FinalProject/model.cpp | 2 ++ FinalProject/model.h | 5 ++++- FinalProject/renderable.cpp | 17 +++++++++++++++-- FinalProject/renderable.h | 5 +++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/FinalProject/model.cpp b/FinalProject/model.cpp index 6a313d9..3f3ee94 100644 --- a/FinalProject/model.cpp +++ b/FinalProject/model.cpp @@ -34,6 +34,8 @@ void Model::loadModel(std::string path) { processNode(scene->mRootNode, scene); _status = LOADED; Logger::info("Model loaded"); + // 仅检查一次即可 + check_boundary(); } void Model::processNode(aiNode* node, const aiScene* scene) { diff --git a/FinalProject/model.h b/FinalProject/model.h index 44949ce..7f3df3a 100644 --- a/FinalProject/model.h +++ b/FinalProject/model.h @@ -48,10 +48,13 @@ private: void processNode(aiNode* node, const aiScene* scene); Mesh processMesh(aiMesh* mesh, const aiScene* scene); std::vector loadMaterialTextures(aiMaterial* mat, aiTextureType type, TextureType textureType); + // Since these are loacl position, this function should be called just once. + void check_boundary(); public: void render(const ShaderProgram& shader) const; - void check_boundary(); + + // maybe we can encapsure a function to get both upper and lower bound? diff --git a/FinalProject/renderable.cpp b/FinalProject/renderable.cpp index 86463a1..a022be4 100644 --- a/FinalProject/renderable.cpp +++ b/FinalProject/renderable.cpp @@ -2,9 +2,17 @@ #include "renderable.h" -Renderable::Renderable(Model* model) : _model(model) {} +// 极值点一定在model包围盒的顶点出取到 -Renderable::Renderable(Model* model, glm::vec3 position) : _model(model), _position(position) {} +Renderable::Renderable(Model* model) : _model(model) { + _upper_bound = model->get_upper_bound(); + _lower_bound = model->get_lower_bound(); +} + +Renderable::Renderable(Model* model, glm::vec3 position) : _model(model), _position(position) { + _upper_bound = model->get_upper_bound(); + _lower_bound = model->get_lower_bound(); +} void Renderable::move(glm::vec3 deltaVec) { _position += deltaVec; @@ -36,3 +44,8 @@ void Renderable::render(ShaderProgram shader) { // Render _model->render(shader); } + +// check here to get global boundary +void Renderable::check_boundary() { + +} \ No newline at end of file diff --git a/FinalProject/renderable.h b/FinalProject/renderable.h index 7e5912a..dc13c63 100644 --- a/FinalProject/renderable.h +++ b/FinalProject/renderable.h @@ -12,6 +12,9 @@ private: glm::vec3 _position = glm::vec3(0.0f); glm::mat4 _rotation = glm::mat4(1.0f); glm::vec3 _scale = glm::vec3(1.0f); + // 下面是与坐标轴平行的顶点 + glm::vec3 _lower_bound; + glm::vec3 _upper_bound; public: Renderable(Model* model); @@ -29,6 +32,8 @@ public: public: void render(ShaderProgram shader); + // check here to get global boundary + void check_boundary(); }; inline glm::mat4 Renderable::modelMatrix() const { From 13bd34973c9112efc5df375f8bb9c6e6cdba99bd Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Tue, 13 Dec 2022 19:02:44 +0800 Subject: [PATCH 08/10] implement check_boundary --- FinalProject/model.cpp | 20 ++++++++++---------- FinalProject/renderable.cpp | 25 ++++++++++++++++--------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/FinalProject/model.cpp b/FinalProject/model.cpp index 3f3ee94..e1db286 100644 --- a/FinalProject/model.cpp +++ b/FinalProject/model.cpp @@ -35,7 +35,7 @@ void Model::loadModel(std::string path) { _status = LOADED; Logger::info("Model loaded"); // 仅检查一次即可 - check_boundary(); + //check_boundary(); } void Model::processNode(aiNode* node, const aiScene* scene) { @@ -67,16 +67,16 @@ Mesh Model::processMesh(aiMesh* mesh, const aiScene* scene) { glm::vec3 vertexBitangent = glm::vec3(0.0f); // Process vertex positions - // 使用循环避免代码重复,如果可行的话,可以在此循环中确定法向量等信息 - //for (int j = 0; j < 3; j++) { - // vertexPosition[j] = mesh->mVertices[i][j]; - // _left_down_back[j] = _left_down_back[j] < vertexPosition[j] ? _left_down_back[j] : vertexPosition[j]; - // _right_up_front[j] = _right_up_front[j] > vertexPosition[j] ? _right_up_front[j] : vertexPosition[j]; - //} + //使用循环避免代码重复,如果可行的话,可以在此循环中确定法向量等信息 + for (int j = 0; j < 3; j++) { + vertexPosition[j] = mesh->mVertices[i][j]; + _left_down_back[j] = _left_down_back[j] < vertexPosition[j] ? _left_down_back[j] : vertexPosition[j]; + _right_up_front[j] = _right_up_front[j] > vertexPosition[j] ? _right_up_front[j] : vertexPosition[j]; + } - vertexPosition.x = mesh->mVertices[i].x; - vertexPosition.y = mesh->mVertices[i].y; - vertexPosition.z = mesh->mVertices[i].z; + //vertexPosition.x = mesh->mVertices[i].x; + //vertexPosition.y = mesh->mVertices[i].y; + //vertexPosition.z = mesh->mVertices[i].z; // Process vertex normals if (mesh->mNormals) { diff --git a/FinalProject/renderable.cpp b/FinalProject/renderable.cpp index a022be4..11e1459 100644 --- a/FinalProject/renderable.cpp +++ b/FinalProject/renderable.cpp @@ -4,15 +4,9 @@ // 极值点一定在model包围盒的顶点出取到 -Renderable::Renderable(Model* model) : _model(model) { - _upper_bound = model->get_upper_bound(); - _lower_bound = model->get_lower_bound(); -} +Renderable::Renderable(Model* model) : _model(model) {} -Renderable::Renderable(Model* model, glm::vec3 position) : _model(model), _position(position) { - _upper_bound = model->get_upper_bound(); - _lower_bound = model->get_lower_bound(); -} +Renderable::Renderable(Model* model, glm::vec3 position) : _model(model), _position(position) {} void Renderable::move(glm::vec3 deltaVec) { _position += deltaVec; @@ -47,5 +41,18 @@ void Renderable::render(ShaderProgram shader) { // check here to get global boundary void Renderable::check_boundary() { - + std::vector temp = { _lower_bound,_upper_bound }; + _lower_bound = glm::vec3(3e36, 3e36, 3e36); + _upper_bound = -_lower_bound; + auto model = this->modelMatrix();// 变换矩阵 + // 位运算 从000到111的每一种组合 + for (int i = 0; i < 7; i++) { + //遍历每一个顶点 + glm::vec4 vex = glm::vec4(temp[i & 4][0], temp[i & 2][1], temp[i & 1][2],1.0f); + vex = model * vex; // 经过变化之后的点的坐标 + for (int j = 0; j < 3; j++) { + _lower_bound[j] = _lower_bound[j] < vex[j] ? _lower_bound[j] : vex[j]; + _upper_bound[j] = _upper_bound[j] > vex[j] ? _upper_bound[j] : vex[j]; + } + } } \ No newline at end of file From cef83fe19e98d64ed1dfc62b33fb805704815f32 Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Tue, 13 Dec 2022 20:09:50 +0800 Subject: [PATCH 09/10] fix bug and add test code --- FinalProject/renderable.cpp | 11 ++++++----- FinalProject/renderable.h | 14 ++++++++++++++ FinalProject/sceneviewer.cpp | 6 ++++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/FinalProject/renderable.cpp b/FinalProject/renderable.cpp index 11e1459..16eb8a2 100644 --- a/FinalProject/renderable.cpp +++ b/FinalProject/renderable.cpp @@ -2,7 +2,7 @@ #include "renderable.h" -// 极值点一定在model包围盒的顶点出取到 +// 极值点一定在model包围盒的顶点处取到 Renderable::Renderable(Model* model) : _model(model) {} @@ -40,16 +40,17 @@ void Renderable::render(ShaderProgram shader) { } // check here to get global boundary +// must check before get boundary void Renderable::check_boundary() { - std::vector temp = { _lower_bound,_upper_bound }; + std::vector temp = {_model->get_upper_bound(),_model->get_lower_bound()}; _lower_bound = glm::vec3(3e36, 3e36, 3e36); _upper_bound = -_lower_bound; auto model = this->modelMatrix();// 变换矩阵 // 位运算 从000到111的每一种组合 - for (int i = 0; i < 7; i++) { + for (int i = 0; i < 8; i++) { //遍历每一个顶点 - glm::vec4 vex = glm::vec4(temp[i & 4][0], temp[i & 2][1], temp[i & 1][2],1.0f); - vex = model * vex; // 经过变化之后的点的坐标 + glm::vec4 vx = glm::vec4(temp[(i & 4) >> 2][0], temp[(i & 2)>>1][1], temp[i & 1][2], 1.0f); + auto vex = model * vx; // 经过变化之后的点的坐标 for (int j = 0; j < 3; j++) { _lower_bound[j] = _lower_bound[j] < vex[j] ? _lower_bound[j] : vex[j]; _upper_bound[j] = _upper_bound[j] > vex[j] ? _upper_bound[j] : vex[j]; diff --git a/FinalProject/renderable.h b/FinalProject/renderable.h index dc13c63..3e55e8f 100644 --- a/FinalProject/renderable.h +++ b/FinalProject/renderable.h @@ -30,6 +30,9 @@ public: inline glm::mat4 modelMatrix() const; + inline glm::vec3 get_upper_boundary()const; + inline glm::vec3 get_lower_boundary()const; + public: void render(ShaderProgram shader); // check here to get global boundary @@ -39,7 +42,18 @@ public: inline glm::mat4 Renderable::modelMatrix() const { glm::mat4 model = glm::mat4(1.0f); model = glm::translate(model, _position); + // 左乘与右乘应该是不一样的,但是这里的表现相同 model = model * _rotation; + //model = _rotation * model; model = glm::scale(model, _scale); return model; + + } + +inline glm::vec3 Renderable::get_lower_boundary()const { + return _lower_bound; +} +inline glm::vec3 Renderable::get_upper_boundary()const { + return _upper_bound; +} \ No newline at end of file diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index 30fe06b..ff09019 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -86,6 +86,12 @@ void SceneViewer::initializeGL() { Renderable renderable(backpackModel); _objects.push_back(backpackModel); + //renderable.scale(1); + //renderable.rotate(glm::vec3(1, 0, 0), 2); + //renderable.check_boundary(); + //auto t1 = renderable.get_lower_boundary(); + //auto t2 = renderable.get_upper_boundary(); + _camera.setPosition(glm::vec3(0.0f, 15.0f, 8.0f)); _camera.setYaw(-90.0f); _camera.setPitch(-30.0f); From 95c899f546c984474542eae6900f2b9d3f84596f Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Tue, 13 Dec 2022 20:25:16 +0800 Subject: [PATCH 10/10] change sequence of model * rotation --- FinalProject/renderable.h | 6 ++---- FinalProject/sceneviewer.cpp | 10 +++++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/FinalProject/renderable.h b/FinalProject/renderable.h index 3e55e8f..1ae9fe3 100644 --- a/FinalProject/renderable.h +++ b/FinalProject/renderable.h @@ -43,12 +43,10 @@ inline glm::mat4 Renderable::modelMatrix() const { glm::mat4 model = glm::mat4(1.0f); model = glm::translate(model, _position); // 左乘与右乘应该是不一样的,但是这里的表现相同 - model = model * _rotation; - //model = _rotation * model; + //model = model * _rotation; + model = _rotation * model; model = glm::scale(model, _scale); return model; - - } inline glm::vec3 Renderable::get_lower_boundary()const { diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index ff09019..772beae 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -86,11 +86,11 @@ void SceneViewer::initializeGL() { Renderable renderable(backpackModel); _objects.push_back(backpackModel); - //renderable.scale(1); - //renderable.rotate(glm::vec3(1, 0, 0), 2); - //renderable.check_boundary(); - //auto t1 = renderable.get_lower_boundary(); - //auto t2 = renderable.get_upper_boundary(); + renderable.move(glm::vec3(100.0f, 0.0f, 0.0f)); + renderable.rotate(glm::vec3(0, 1, 0), 3.1415926f/2); + renderable.check_boundary(); + auto t1 = renderable.get_lower_boundary(); + auto t2 = renderable.get_upper_boundary(); _camera.setPosition(glm::vec3(0.0f, 15.0f, 8.0f)); _camera.setYaw(-90.0f);