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] 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);