From 9773b0b00853d7ed8c0747ddaa4e253a1ea50f03 Mon Sep 17 00:00:00 2001 From: sleeplessai <2018063+sleeplessai@users.noreply.github.com> Date: Wed, 26 Jul 2023 23:22:28 +0800 Subject: [PATCH 1/4] homework2, draw opencv 3d logo in motion with opengl compat. --- src/Game.cpp | 86 +++++++++++++++++++++++++++++++++++++++--------- src/InputCtl.cpp | 2 +- src/main.cpp | 2 +- 3 files changed, 73 insertions(+), 17 deletions(-) diff --git a/src/Game.cpp b/src/Game.cpp index d475d83..3f26630 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -4,14 +4,16 @@ #include #include "OBJ.hpp" +#include + struct Game::Private { // P-IMPL pattern glm::mat4x4 viewMat; glm::mat4x4 projMat; - OBJ monkey; + std::vector ocvLogo; }; -Game::Game() : m_private(std::make_unique()) {} +Game::Game() : m_private(std::make_unique()), m_window(nullptr) {} Game::~Game() = default; @@ -31,11 +33,52 @@ void Game::set_window(GLFWwindow *window) { #endif void Game::initialize() { - /* m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/opencvpart.obj"); */ - m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/monkey.obj"); - /* m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/cube.obj"); */ + OBJ ocvpart; + ocvpart.load_obj(OPENGLTUTOR_HOME "assets/opencvpart.obj"); + + for (size_t i = 0; i < 3; ++i) { + m_private->ocvLogo.push_back(ocvpart); + } + constexpr float short_side = 0.65f; + glm::vec3 tri_sides = {short_side, 2 * short_side, short_side * sqrtf(3)}; + + auto C0 = glm::vec3(0.0f, tri_sides.y, 0.0f); + auto C1 = glm::vec3(-tri_sides.z, -tri_sides.x, 0.0f); + auto C2 = glm::vec3(tri_sides.z, -tri_sides.x, 0.0f); + + std::vector cvLogoModel; + + auto model = glm::mat4x4(1.0f); + model = glm::translate(model, C0); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f)); + model = glm::rotate(model, glm::radians(150.0f), glm::vec3(0.0f, 1.0f, 0.0f)); + cvLogoModel.push_back(model); + + model = glm::mat4x4(1.0f); + model = glm::translate(model, C1); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f)); + model = glm::rotate(model, glm::radians(-90.0f), glm::vec3(0.0f, 1.0f, 0.0f)); + cvLogoModel.push_back(model); + + model = glm::mat4x4(1.0f); + model = glm::translate(model, C2); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f)); + model = glm::rotate(model, glm::radians(-30.0f), glm::vec3(0.0f, 1.0f, 0.0f)); + cvLogoModel.push_back(model); + + for (size_t i = 0; i < m_private->ocvLogo.size(); ++i) { + auto& ocvPart = m_private->ocvLogo.at(i); + auto& ocvPartModel = cvLogoModel.at(i); + for (auto& vert : ocvPart.vertices) { + vert = ocvPartModel * glm::vec4(vert, 1.0f); + } + } + + //m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/monkey.obj"); + //m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/cube.obj"); + CHECK_GL(glEnable(GL_DEPTH_TEST)); - CHECK_GL(glDisable(GL_MULTISAMPLE)); + CHECK_GL(glEnable(GL_MULTISAMPLE)); CHECK_GL(glEnable(GL_BLEND)); CHECK_GL(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); CHECK_GL(glEnable(GL_LIGHTING)); @@ -44,6 +87,7 @@ void Game::initialize() { CHECK_GL(glEnable(GL_CULL_FACE)); CHECK_GL(glCullFace(GL_BACK)); CHECK_GL(glFrontFace(GL_CCW)); + CHECK_GL(glShadeModel(GL_SMOOTH)); } void Game::render() { @@ -57,19 +101,31 @@ void Game::render() { CHECK_GL(glMatrixMode(GL_PROJECTION)); CHECK_GL(glLoadMatrixf(glm::value_ptr(projection))); - + auto view = m_inputCtl.get_view_matrix(); - + glm::mat4x4 model(1.0f); + + static float motionAngle = 0.0f; + static constexpr glm::vec3 motionAxis = { 0.0f, 1.0f, 0.0f }; + static constexpr float motionDelta = 1.2f; - static float angle = 0.0f; - model = glm::rotate(model, glm::radians(angle), glm::vec3(0.0f, 1.0f, 0.0f)); - model = glm::translate(model, glm::vec3(0.0f, 0.12f * glm::sin(glm::radians(angle) * 2.718f), 0.0f)); - angle += 0.5f; - CHECK_GL(glMatrixMode(GL_MODELVIEW)); + + model = glm::rotate(glm::mat4(1.0f), glm::radians(motionAngle), motionAxis); + CHECK_GL(glLoadMatrixf(glm::value_ptr(view * model))); + glColor3f(1.0f, 0.0f, 0.0f); + m_private->ocvLogo.at(0).draw_obj(); + + model = glm::rotate(glm::mat4(1.0f), glm::radians(motionAngle), motionAxis); + CHECK_GL(glLoadMatrixf(glm::value_ptr(view * model))); + glColor3f(0.0f, 1.0f, 0.0f); + m_private->ocvLogo.at(1).draw_obj(); + + model = glm::rotate(glm::mat4(1.0f), glm::radians(motionAngle), motionAxis); CHECK_GL(glLoadMatrixf(glm::value_ptr(view * model))); + glColor3f(0.0f, 0.0f, 1.0f); + m_private->ocvLogo.at(2).draw_obj(); - glColor3f(0.9f, 0.6f, 0.1f); - m_private->monkey.draw_obj(); + motionAngle += motionDelta; } diff --git a/src/InputCtl.cpp b/src/InputCtl.cpp index 68444ae..07e0efd 100644 --- a/src/InputCtl.cpp +++ b/src/InputCtl.cpp @@ -26,7 +26,7 @@ static auto glfw_input_callback(FpFn fpFn) { struct CameraState { /* glm::mat4x4 transformation; */ - glm::vec3 eye = {0, 0, 5}; + glm::vec3 eye = {0, 0, 10}; glm::vec3 lookat = {0, 0, 0}; glm::vec3 up_vector = {0, 1, 0}; glm::vec3 keep_up_axis = {0, 1, 0}; diff --git a/src/main.cpp b/src/main.cpp index 7f82a7c..849a32a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -40,7 +40,7 @@ int main() { } // Create main window - constexpr char title[] = "Example"; + constexpr char title[] = "Homework2: OpenCV 3D Logo"; GLFWwindow *window = glfwCreateWindow(1024, 768, title, NULL, NULL); // Test if window creation succeed From 5e20e6d686df36e52ea6f3e229dae41d173b8033 Mon Sep 17 00:00:00 2001 From: sleeplessai <2018063+sleeplessai@users.noreply.github.com> Date: Fri, 28 Jul 2023 12:36:39 +0800 Subject: [PATCH 2/4] homework2, shade smooth --- include/OBJ.hpp | 1 + src/Game.cpp | 6 +++--- src/OBJ.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/include/OBJ.hpp b/include/OBJ.hpp index d2f6fac..5a574d1 100644 --- a/include/OBJ.hpp +++ b/include/OBJ.hpp @@ -9,4 +9,5 @@ struct OBJ { void load_obj(std::string path); void draw_obj(); + void draw_obj_smooth(); }; diff --git a/src/Game.cpp b/src/Game.cpp index 3f26630..b374e1c 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -115,17 +115,17 @@ void Game::render() { model = glm::rotate(glm::mat4(1.0f), glm::radians(motionAngle), motionAxis); CHECK_GL(glLoadMatrixf(glm::value_ptr(view * model))); glColor3f(1.0f, 0.0f, 0.0f); - m_private->ocvLogo.at(0).draw_obj(); + m_private->ocvLogo.at(0).draw_obj_smooth(); model = glm::rotate(glm::mat4(1.0f), glm::radians(motionAngle), motionAxis); CHECK_GL(glLoadMatrixf(glm::value_ptr(view * model))); glColor3f(0.0f, 1.0f, 0.0f); - m_private->ocvLogo.at(1).draw_obj(); + m_private->ocvLogo.at(1).draw_obj_smooth(); model = glm::rotate(glm::mat4(1.0f), glm::radians(motionAngle), motionAxis); CHECK_GL(glLoadMatrixf(glm::value_ptr(view * model))); glColor3f(0.0f, 0.0f, 1.0f); - m_private->ocvLogo.at(2).draw_obj(); + m_private->ocvLogo.at(2).draw_obj_smooth(); motionAngle += motionDelta; } diff --git a/src/OBJ.cpp b/src/OBJ.cpp index c9ddab5..07205bd 100644 --- a/src/OBJ.cpp +++ b/src/OBJ.cpp @@ -70,3 +70,42 @@ void OBJ::draw_obj() { CHECK_GL(glEnd()); } + +void OBJ::draw_obj_smooth() { + std::vector faceNormalBuffer; + std::vector vertexNormalBuffer(vertices.size()); + + for (auto& face : faces) { + auto const& a = vertices.at(face[0]); + auto const& b = vertices.at(face[1]); + auto const& c = vertices.at(face[2]); + + glm::vec3 fn = compute_normal(a, b, c); + faceNormalBuffer.push_back(fn); + vertexNormalBuffer[face[0]] += fn; + vertexNormalBuffer[face[1]] += fn; + vertexNormalBuffer[face[2]] += fn; + } + for (auto& vn : vertexNormalBuffer) { + vn = glm::normalize(vn); + } + + glBegin(GL_TRIANGLES); + for (auto const& face : faces) { + auto const& a = vertices.at(face[0]); + auto const& b = vertices.at(face[1]); + auto const& c = vertices.at(face[2]); + + auto const& n1 = vertexNormalBuffer.at(face[0]); + auto const& n2 = vertexNormalBuffer.at(face[1]); + auto const& n3 = vertexNormalBuffer.at(face[2]); + + glNormal3fv(glm::value_ptr(n1)); + glVertex3fv(glm::value_ptr(a)); + glNormal3fv(glm::value_ptr(n2)); + glVertex3fv(glm::value_ptr(b)); + glNormal3fv(glm::value_ptr(n3)); + glVertex3fv(glm::value_ptr(c)); + } + CHECK_GL(glEnd()); +} \ No newline at end of file From 6a30adfda070f1d3683812b81b14015550cc3cf0 Mon Sep 17 00:00:00 2001 From: sleeplessai <2018063+sleeplessai@users.noreply.github.com> Date: Fri, 28 Jul 2023 17:39:27 +0800 Subject: [PATCH 3/4] homework2, group obj faces --- assets/opencvpart_grp.obj | 724 ++++++++++++++++++++++++++++++++++++++ include/OBJ.hpp | 5 +- src/Game.cpp | 5 +- src/OBJ.cpp | 60 +++- 4 files changed, 777 insertions(+), 17 deletions(-) create mode 100644 assets/opencvpart_grp.obj diff --git a/assets/opencvpart_grp.obj b/assets/opencvpart_grp.obj new file mode 100644 index 0000000..388524f --- /dev/null +++ b/assets/opencvpart_grp.obj @@ -0,0 +1,724 @@ +# Blender 3.5.0 +# www.blender.org +o Circle +v 0.000000 0.000000 -1.000000 +v -0.881921 0.000000 -0.471397 +v -0.923880 0.000000 -0.382683 +v -0.956940 0.000000 -0.290285 +v -0.980785 0.000000 -0.195090 +v -0.995185 0.000000 -0.098017 +v -1.000000 0.000000 0.000000 +v -0.995185 0.000000 0.098017 +v -0.980785 0.000000 0.195090 +v -0.956940 0.000000 0.290285 +v -0.923880 0.000000 0.382683 +v -0.881921 0.000000 0.471397 +v -0.831470 0.000000 0.555570 +v -0.773010 0.000000 0.634393 +v -0.707107 0.000000 0.707107 +v -0.634393 0.000000 0.773010 +v -0.555570 0.000000 0.831470 +v -0.471397 0.000000 0.881921 +v -0.382683 0.000000 0.923880 +v -0.290285 0.000000 0.956940 +v -0.195090 0.000000 0.980785 +v -0.098017 0.000000 0.995185 +v 0.000000 0.000000 1.000000 +v 0.098017 0.000000 0.995185 +v 0.195090 0.000000 0.980785 +v 0.290285 0.000000 0.956940 +v 0.382683 0.000000 0.923880 +v 0.471397 0.000000 0.881921 +v 0.555570 0.000000 0.831470 +v 0.634393 0.000000 0.773010 +v 0.707107 0.000000 0.707107 +v 0.773010 0.000000 0.634393 +v 0.831470 0.000000 0.555570 +v 0.881921 0.000000 0.471397 +v 0.923880 0.000000 0.382683 +v 0.956940 0.000000 0.290285 +v 0.980785 0.000000 0.195090 +v 0.995185 0.000000 0.098017 +v 1.000000 0.000000 0.000000 +v 0.995185 0.000000 -0.098017 +v 0.980785 0.000000 -0.195090 +v 0.956940 0.000000 -0.290285 +v 0.923880 0.000000 -0.382683 +v 0.881921 0.000000 -0.471397 +v 0.831470 0.000000 -0.555570 +v 0.773010 0.000000 -0.634393 +v 0.707107 0.000000 -0.707107 +v 0.634393 0.000000 -0.773010 +v 0.555570 0.000000 -0.831470 +v 0.471397 0.000000 -0.881921 +v 0.382683 0.000000 -0.923880 +v 0.290285 0.000000 -0.956940 +v 0.195090 0.000000 -0.980785 +v 0.098017 0.000000 -0.995185 +v 0.000000 0.000000 -0.604589 +v -0.533200 0.000000 -0.285001 +v -0.558567 0.000000 -0.231366 +v -0.578555 0.000000 -0.175503 +v -0.592972 0.000000 -0.117949 +v -0.601677 0.000000 -0.059260 +v -0.604589 0.000000 0.000000 +v -0.601677 0.000000 0.059260 +v -0.592972 0.000000 0.117949 +v -0.578555 0.000000 0.175503 +v -0.558567 0.000000 0.231366 +v -0.533200 0.000000 0.285001 +v -0.502697 0.000000 0.335892 +v -0.467353 0.000000 0.383547 +v -0.427509 0.000000 0.427509 +v -0.383547 0.000000 0.467353 +v -0.335892 0.000000 0.502697 +v -0.285001 0.000000 0.533200 +v -0.231366 0.000000 0.558567 +v -0.175503 0.000000 0.578555 +v -0.117949 0.000000 0.592972 +v -0.059260 0.000000 0.601677 +v 0.000000 0.000000 0.604589 +v 0.059260 0.000000 0.601677 +v 0.117949 0.000000 0.592972 +v 0.175503 0.000000 0.578555 +v 0.231366 0.000000 0.558567 +v 0.285001 0.000000 0.533200 +v 0.335892 0.000000 0.502697 +v 0.383547 0.000000 0.467353 +v 0.427509 0.000000 0.427509 +v 0.467353 0.000000 0.383547 +v 0.502697 0.000000 0.335892 +v 0.533200 0.000000 0.285001 +v 0.558567 0.000000 0.231366 +v 0.578555 0.000000 0.175503 +v 0.592972 0.000000 0.117949 +v 0.601677 0.000000 0.059260 +v 0.604589 0.000000 0.000000 +v 0.601677 0.000000 -0.059260 +v 0.592972 0.000000 -0.117949 +v 0.578555 0.000000 -0.175503 +v 0.558567 0.000000 -0.231366 +v 0.533200 0.000000 -0.285001 +v 0.502697 0.000000 -0.335892 +v 0.467353 0.000000 -0.383547 +v 0.427509 0.000000 -0.427509 +v 0.383547 0.000000 -0.467353 +v 0.335892 0.000000 -0.502697 +v 0.285001 0.000000 -0.533200 +v 0.231366 0.000000 -0.558567 +v 0.175503 0.000000 -0.578555 +v 0.117949 0.000000 -0.592972 +v 0.059260 0.000000 -0.601677 +v 0.000000 0.300000 -1.000000 +v -0.881921 0.300000 -0.471397 +v -0.923880 0.300000 -0.382683 +v -0.956940 0.300000 -0.290285 +v -0.980785 0.300000 -0.195090 +v -0.995185 0.300000 -0.098017 +v -1.000000 0.300000 0.000000 +v -0.995185 0.300000 0.098017 +v -0.980785 0.300000 0.195090 +v -0.956940 0.300000 0.290285 +v -0.923880 0.300000 0.382683 +v -0.881921 0.300000 0.471397 +v -0.831470 0.300000 0.555570 +v -0.773010 0.300000 0.634393 +v -0.707107 0.300000 0.707107 +v -0.634393 0.300000 0.773010 +v -0.555570 0.300000 0.831470 +v -0.471397 0.300000 0.881921 +v -0.382683 0.300000 0.923880 +v -0.290285 0.300000 0.956940 +v -0.195090 0.300000 0.980785 +v -0.098017 0.300000 0.995185 +v 0.000000 0.300000 1.000000 +v 0.098017 0.300000 0.995185 +v 0.195090 0.300000 0.980785 +v 0.290285 0.300000 0.956940 +v 0.382683 0.300000 0.923880 +v 0.471397 0.300000 0.881921 +v 0.555570 0.300000 0.831470 +v 0.634393 0.300000 0.773010 +v 0.707107 0.300000 0.707107 +v 0.773010 0.300000 0.634393 +v 0.831470 0.300000 0.555570 +v 0.881921 0.300000 0.471397 +v 0.923880 0.300000 0.382683 +v 0.956940 0.300000 0.290285 +v 0.980785 0.300000 0.195090 +v 0.995185 0.300000 0.098017 +v 1.000000 0.300000 0.000000 +v 0.995185 0.300000 -0.098017 +v 0.980785 0.300000 -0.195090 +v 0.956940 0.300000 -0.290285 +v 0.923880 0.300000 -0.382683 +v 0.881921 0.300000 -0.471397 +v 0.831470 0.300000 -0.555570 +v 0.773010 0.300000 -0.634393 +v 0.707107 0.300000 -0.707107 +v 0.634393 0.300000 -0.773010 +v 0.555570 0.300000 -0.831470 +v 0.471397 0.300000 -0.881921 +v 0.382683 0.300000 -0.923880 +v 0.290285 0.300000 -0.956940 +v 0.195090 0.300000 -0.980785 +v 0.098017 0.300000 -0.995185 +v 0.000000 0.300000 -0.604589 +v -0.533200 0.300000 -0.285001 +v -0.558567 0.300000 -0.231366 +v -0.578555 0.300000 -0.175503 +v -0.592972 0.300000 -0.117949 +v -0.601677 0.300000 -0.059260 +v -0.604589 0.300000 0.000000 +v -0.601677 0.300000 0.059260 +v -0.592972 0.300000 0.117949 +v -0.578555 0.300000 0.175503 +v -0.558567 0.300000 0.231366 +v -0.533200 0.300000 0.285001 +v -0.502697 0.300000 0.335892 +v -0.467353 0.300000 0.383547 +v -0.427509 0.300000 0.427509 +v -0.383547 0.300000 0.467353 +v -0.335892 0.300000 0.502697 +v -0.285001 0.300000 0.533200 +v -0.231366 0.300000 0.558567 +v -0.175503 0.300000 0.578555 +v -0.117949 0.300000 0.592972 +v -0.059260 0.300000 0.601677 +v 0.000000 0.300000 0.604589 +v 0.059260 0.300000 0.601677 +v 0.117949 0.300000 0.592972 +v 0.175503 0.300000 0.578555 +v 0.231366 0.300000 0.558567 +v 0.285001 0.300000 0.533200 +v 0.335892 0.300000 0.502697 +v 0.383547 0.300000 0.467353 +v 0.427509 0.300000 0.427509 +v 0.467353 0.300000 0.383547 +v 0.502697 0.300000 0.335892 +v 0.533200 0.300000 0.285001 +v 0.558567 0.300000 0.231366 +v 0.578555 0.300000 0.175503 +v 0.592972 0.300000 0.117949 +v 0.601677 0.300000 0.059260 +v 0.604589 0.300000 0.000000 +v 0.601677 0.300000 -0.059260 +v 0.592972 0.300000 -0.117949 +v 0.578555 0.300000 -0.175503 +v 0.558567 0.300000 -0.231366 +v 0.533200 0.300000 -0.285001 +v 0.502697 0.300000 -0.335892 +v 0.467353 0.300000 -0.383547 +v 0.427509 0.300000 -0.427509 +v 0.383547 0.300000 -0.467353 +v 0.335892 0.300000 -0.502697 +v 0.285001 0.300000 -0.533200 +v 0.231366 0.300000 -0.558567 +v 0.175503 0.300000 -0.578555 +v 0.117949 0.300000 -0.592972 +v 0.059260 0.300000 -0.601677 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.9040 -0.0000 -0.4276 +vn -0.9415 -0.0000 -0.3369 +vn -0.9700 -0.0000 -0.2430 +vn -0.9892 -0.0000 -0.1467 +vn -0.9988 -0.0000 -0.0491 +vn -0.9988 -0.0000 0.0491 +vn -0.9892 -0.0000 0.1467 +vn -0.9700 -0.0000 0.2430 +vn -0.9415 -0.0000 0.3369 +vn -0.9040 -0.0000 0.4276 +vn -0.8577 -0.0000 0.5141 +vn -0.8032 -0.0000 0.5957 +vn -0.7410 -0.0000 0.6716 +vn -0.6716 -0.0000 0.7410 +vn -0.5957 -0.0000 0.8032 +vn -0.5141 -0.0000 0.8577 +vn -0.4276 -0.0000 0.9040 +vn -0.3369 -0.0000 0.9415 +vn -0.2430 -0.0000 0.9700 +vn -0.1467 -0.0000 0.9892 +vn -0.0491 -0.0000 0.9988 +vn 0.0491 -0.0000 0.9988 +vn 0.1467 -0.0000 0.9892 +vn 0.2430 -0.0000 0.9700 +vn 0.3369 -0.0000 0.9415 +vn 0.4276 -0.0000 0.9040 +vn 0.5141 -0.0000 0.8577 +vn 0.5957 -0.0000 0.8032 +vn 0.6716 -0.0000 0.7410 +vn 0.7410 -0.0000 0.6716 +vn 0.8032 -0.0000 0.5957 +vn 0.8577 -0.0000 0.5141 +vn 0.9040 -0.0000 0.4276 +vn 0.9415 -0.0000 0.3369 +vn 0.9700 -0.0000 0.2430 +vn 0.9892 -0.0000 0.1467 +vn 0.9988 -0.0000 0.0491 +vn 0.9988 -0.0000 -0.0491 +vn 0.9892 -0.0000 -0.1467 +vn 0.9700 -0.0000 -0.2430 +vn 0.9415 -0.0000 -0.3369 +vn 0.9040 -0.0000 -0.4276 +vn 0.8577 -0.0000 -0.5141 +vn 0.8032 -0.0000 -0.5957 +vn 0.7410 -0.0000 -0.6716 +vn 0.6716 -0.0000 -0.7410 +vn 0.5957 -0.0000 -0.8032 +vn 0.5141 -0.0000 -0.8577 +vn 0.4276 -0.0000 -0.9040 +vn 0.3369 -0.0000 -0.9415 +vn 0.2430 -0.0000 -0.9700 +vn 0.1467 -0.0000 -0.9892 +vn 0.0491 -0.0000 -0.9988 +vn -0.0491 -0.0000 -0.9988 +vn -0.1467 -0.0000 -0.9892 +vn -0.2430 -0.0000 -0.9700 +vn -0.3369 -0.0000 -0.9415 +vn -0.4276 -0.0000 -0.9040 +vn -0.5141 -0.0000 -0.8577 +vn -0.5957 -0.0000 -0.8032 +vn -0.6716 -0.0000 -0.7410 +vn -0.7410 -0.0000 -0.6716 +vn -0.8032 -0.0000 -0.5957 +vn -0.8577 -0.0000 -0.5141 +vn -1.0000 -0.0000 -0.0000 +vn 0.4714 -0.0000 -0.8819 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +s 0 +#group 0 +f 47/47/1 46/46/1 100/100/1 101/101/1 +f 21/21/1 20/20/1 74/74/1 75/75/1 +f 48/48/1 47/47/1 101/101/1 102/102/1 +f 22/22/1 21/21/1 75/75/1 76/76/1 +f 49/49/1 48/48/1 102/102/1 103/103/1 +f 23/23/1 22/22/1 76/76/1 77/77/1 +f 50/50/1 49/49/1 103/103/1 104/104/1 +f 24/24/1 23/23/1 77/77/1 78/78/1 +f 51/51/1 50/50/1 104/104/1 105/105/1 +f 25/25/1 24/24/1 78/78/1 79/79/1 +f 52/52/1 51/51/1 105/105/1 106/106/1 +f 26/26/1 25/25/1 79/79/1 80/80/1 +f 53/53/1 52/52/1 106/106/1 107/107/1 +f 27/27/1 26/26/1 80/80/1 81/81/1 +f 54/54/1 53/53/1 107/107/1 108/108/1 +f 28/28/1 27/27/1 81/81/1 82/82/1 +f 1/1/1 54/54/1 108/108/1 55/55/1 +f 29/29/1 28/28/1 82/82/1 83/83/1 +f 3/3/1 2/2/1 56/56/1 57/57/1 +f 30/30/1 29/29/1 83/83/1 84/84/1 +f 4/4/1 3/3/1 57/57/1 58/58/1 +f 31/31/1 30/30/1 84/84/1 85/85/1 +f 5/5/1 4/4/1 58/58/1 59/59/1 +f 32/32/1 31/31/1 85/85/1 86/86/1 +f 6/6/1 5/5/1 59/59/1 60/60/1 +f 33/33/1 32/32/1 86/86/1 87/87/1 +f 7/7/1 6/6/1 60/60/1 61/61/1 +f 34/34/1 33/33/1 87/87/1 88/88/1 +f 8/8/1 7/7/1 61/61/1 62/62/1 +f 35/35/1 34/34/1 88/88/1 89/89/1 +f 9/9/1 8/8/1 62/62/1 63/63/1 +f 36/36/1 35/35/1 89/89/1 90/90/1 +f 10/10/1 9/9/1 63/63/1 64/64/1 +f 37/37/1 36/36/1 90/90/1 91/91/1 +f 11/11/1 10/10/1 64/64/1 65/65/1 +f 38/38/1 37/37/1 91/91/1 92/92/1 +f 12/12/1 11/11/1 65/65/1 66/66/1 +f 39/39/1 38/38/1 92/92/1 93/93/1 +f 13/13/1 12/12/1 66/66/1 67/67/1 +f 40/40/1 39/39/1 93/93/1 94/94/1 +f 14/14/1 13/13/1 67/67/1 68/68/1 +f 41/41/1 40/40/1 94/94/1 95/95/1 +f 15/15/1 14/14/1 68/68/1 69/69/1 +f 42/42/1 41/41/1 95/95/1 96/96/1 +f 16/16/1 15/15/1 69/69/1 70/70/1 +f 43/43/1 42/42/1 96/96/1 97/97/1 +f 17/17/1 16/16/1 70/70/1 71/71/1 +f 44/44/1 43/43/1 97/97/1 98/98/1 +f 18/18/1 17/17/1 71/71/1 72/72/1 +f 45/45/1 44/44/1 98/98/1 99/99/1 +f 19/19/1 18/18/1 72/72/1 73/73/1 +f 46/46/1 45/45/1 99/99/1 100/100/1 +f 20/20/1 19/19/1 73/73/1 74/74/1 +#group 1 +f 155/155/2 209/209/2 208/208/2 154/154/2 +f 129/129/2 183/183/2 182/182/2 128/128/2 +f 156/156/2 210/210/2 209/209/2 155/155/2 +f 130/130/2 184/184/2 183/183/2 129/129/2 +f 157/157/2 211/211/2 210/210/2 156/156/2 +f 131/131/2 185/185/2 184/184/2 130/130/2 +f 158/158/2 212/212/2 211/211/2 157/157/2 +f 132/132/2 186/186/2 185/185/2 131/131/2 +f 159/159/2 213/213/2 212/212/2 158/158/2 +f 133/133/2 187/187/2 186/186/2 132/132/2 +f 160/160/2 214/214/2 213/213/2 159/159/2 +f 134/134/2 188/188/2 187/187/2 133/133/2 +f 161/161/2 215/215/2 214/214/2 160/160/2 +f 135/135/2 189/189/2 188/188/2 134/134/2 +f 162/162/2 216/216/2 215/215/2 161/161/2 +f 136/136/2 190/190/2 189/189/2 135/135/2 +f 109/109/2 163/163/2 216/216/2 162/162/2 +f 137/137/2 191/191/2 190/190/2 136/136/2 +f 111/111/2 165/165/2 164/164/2 110/110/2 +f 138/138/2 192/192/2 191/191/2 137/137/2 +f 112/112/2 166/166/2 165/165/2 111/111/2 +f 139/139/2 193/193/2 192/192/2 138/138/2 +f 113/113/2 167/167/2 166/166/2 112/112/2 +f 140/140/2 194/194/2 193/193/2 139/139/2 +f 114/114/2 168/168/2 167/167/2 113/113/2 +f 141/141/2 195/195/2 194/194/2 140/140/2 +f 115/115/2 169/169/2 168/168/2 114/114/2 +f 142/142/2 196/196/2 195/195/2 141/141/2 +f 116/116/2 170/170/2 169/169/2 115/115/2 +f 143/143/2 197/197/2 196/196/2 142/142/2 +f 117/117/2 171/171/2 170/170/2 116/116/2 +f 144/144/2 198/198/2 197/197/2 143/143/2 +f 118/118/2 172/172/2 171/171/2 117/117/2 +f 145/145/2 199/199/2 198/198/2 144/144/2 +f 119/119/2 173/173/2 172/172/2 118/118/2 +f 146/146/2 200/200/2 199/199/2 145/145/2 +f 120/120/2 174/174/2 173/173/2 119/119/2 +f 147/147/2 201/201/2 200/200/2 146/146/2 +f 121/121/2 175/175/2 174/174/2 120/120/2 +f 148/148/2 202/202/2 201/201/2 147/147/2 +f 122/122/2 176/176/2 175/175/2 121/121/2 +f 149/149/2 203/203/2 202/202/2 148/148/2 +f 123/123/2 177/177/2 176/176/2 122/122/2 +f 150/150/2 204/204/2 203/203/2 149/149/2 +f 124/124/2 178/178/2 177/177/2 123/123/2 +f 151/151/2 205/205/2 204/204/2 150/150/2 +f 125/125/2 179/179/2 178/178/2 124/124/2 +f 152/152/2 206/206/2 205/205/2 151/151/2 +f 126/126/2 180/180/2 179/179/2 125/125/2 +f 153/153/2 207/207/2 206/206/2 152/152/2 +f 127/127/2 181/181/2 180/180/2 126/126/2 +f 154/154/2 208/208/2 207/207/2 153/153/2 +f 128/128/2 182/182/2 181/181/2 127/127/2 +#group 2 +f 2/2/3 3/3/3 111/111/3 110/110/3 +f 3/3/4 4/4/4 112/112/4 111/111/4 +f 4/4/5 5/5/5 113/113/5 112/112/5 +f 5/5/6 6/6/6 114/114/6 113/113/6 +f 6/6/7 7/7/7 115/115/7 114/114/7 +f 7/7/8 8/8/8 116/116/8 115/115/8 +f 8/8/9 9/9/9 117/117/9 116/116/9 +f 9/9/10 10/10/10 118/118/10 117/117/10 +f 10/10/11 11/11/11 119/119/11 118/118/11 +f 11/11/12 12/12/12 120/120/12 119/119/12 +f 12/12/13 13/13/13 121/121/13 120/120/13 +f 13/13/14 14/14/14 122/122/14 121/121/14 +f 14/14/15 15/15/15 123/123/15 122/122/15 +f 15/15/16 16/16/16 124/124/16 123/123/16 +f 16/16/17 17/17/17 125/125/17 124/124/17 +f 17/17/18 18/18/18 126/126/18 125/125/18 +f 18/18/19 19/19/19 127/127/19 126/126/19 +f 19/19/20 20/20/20 128/128/20 127/127/20 +f 20/20/21 21/21/21 129/129/21 128/128/21 +f 21/21/22 22/22/22 130/130/22 129/129/22 +f 22/22/23 23/23/23 131/131/23 130/130/23 +f 23/23/24 24/24/24 132/132/24 131/131/24 +f 24/24/25 25/25/25 133/133/25 132/132/25 +f 25/25/26 26/26/26 134/134/26 133/133/26 +f 26/26/27 27/27/27 135/135/27 134/134/27 +f 27/27/28 28/28/28 136/136/28 135/135/28 +f 28/28/29 29/29/29 137/137/29 136/136/29 +f 29/29/30 30/30/30 138/138/30 137/137/30 +f 30/30/31 31/31/31 139/139/31 138/138/31 +f 31/31/32 32/32/32 140/140/32 139/139/32 +f 32/32/33 33/33/33 141/141/33 140/140/33 +f 33/33/34 34/34/34 142/142/34 141/141/34 +f 34/34/35 35/35/35 143/143/35 142/142/35 +f 35/35/36 36/36/36 144/144/36 143/143/36 +f 36/36/37 37/37/37 145/145/37 144/144/37 +f 37/37/38 38/38/38 146/146/38 145/145/38 +f 38/38/39 39/39/39 147/147/39 146/146/39 +f 39/39/40 40/40/40 148/148/40 147/147/40 +f 40/40/41 41/41/41 149/149/41 148/148/41 +f 41/41/42 42/42/42 150/150/42 149/149/42 +f 42/42/43 43/43/43 151/151/43 150/150/43 +f 43/43/44 44/44/44 152/152/44 151/151/44 +f 44/44/45 45/45/45 153/153/45 152/152/45 +f 45/45/46 46/46/46 154/154/46 153/153/46 +f 46/46/47 47/47/47 155/155/47 154/154/47 +f 47/47/48 48/48/48 156/156/48 155/155/48 +f 48/48/49 49/49/49 157/157/49 156/156/49 +f 49/49/50 50/50/50 158/158/50 157/157/50 +f 50/50/51 51/51/51 159/159/51 158/158/51 +f 51/51/52 52/52/52 160/160/52 159/159/52 +f 52/52/53 53/53/53 161/161/53 160/160/53 +f 53/53/54 54/54/54 162/162/54 161/161/54 +f 54/54/55 1/1/55 109/109/55 162/162/55 +#group 3 +f 57/57/35 56/56/35 164/164/35 165/165/35 +f 58/58/36 57/57/36 165/165/36 166/166/36 +f 59/59/37 58/58/37 166/166/37 167/167/37 +f 60/60/38 59/59/38 167/167/38 168/168/38 +f 61/61/39 60/60/39 168/168/39 169/169/39 +f 62/62/40 61/61/40 169/169/40 170/170/40 +f 63/63/41 62/62/41 170/170/41 171/171/41 +f 64/64/42 63/63/42 171/171/42 172/172/42 +f 65/65/43 64/64/43 172/172/43 173/173/43 +f 66/66/44 65/65/44 173/173/44 174/174/44 +f 67/67/45 66/66/45 174/174/45 175/175/45 +f 68/68/46 67/67/46 175/175/46 176/176/46 +f 69/69/47 68/68/47 176/176/47 177/177/47 +f 70/70/48 69/69/48 177/177/48 178/178/48 +f 71/71/49 70/70/49 178/178/49 179/179/49 +f 72/72/50 71/71/50 179/179/50 180/180/50 +f 73/73/51 72/72/51 180/180/51 181/181/51 +f 74/74/52 73/73/52 181/181/52 182/182/52 +f 75/75/53 74/74/53 182/182/53 183/183/53 +f 76/76/54 75/75/54 183/183/54 184/184/54 +f 77/77/55 76/76/55 184/184/55 185/185/55 +f 78/78/56 77/77/56 185/185/56 186/186/56 +f 79/79/57 78/78/57 186/186/57 187/187/57 +f 80/80/58 79/79/58 187/187/58 188/188/58 +f 81/81/59 80/80/59 188/188/59 189/189/59 +f 82/82/60 81/81/60 189/189/60 190/190/60 +f 83/83/61 82/82/61 190/190/61 191/191/61 +f 84/84/62 83/83/62 191/191/62 192/192/62 +f 85/85/63 84/84/63 192/192/63 193/193/63 +f 86/86/64 85/85/64 193/193/64 194/194/64 +f 87/87/65 86/86/65 194/194/65 195/195/65 +f 88/88/66 87/87/66 195/195/66 196/196/66 +f 89/89/3 88/88/3 196/196/3 197/197/3 +f 90/90/4 89/89/4 197/197/4 198/198/4 +f 91/91/5 90/90/5 198/198/5 199/199/5 +f 92/92/6 91/91/6 199/199/6 200/200/6 +f 93/93/7 92/92/7 200/200/7 201/201/7 +f 94/94/8 93/93/8 201/201/8 202/202/8 +f 95/95/9 94/94/9 202/202/9 203/203/9 +f 96/96/10 95/95/10 203/203/10 204/204/10 +f 97/97/11 96/96/11 204/204/11 205/205/11 +f 98/98/12 97/97/12 205/205/12 206/206/12 +f 99/99/13 98/98/13 206/206/13 207/207/13 +f 100/100/14 99/99/14 207/207/14 208/208/14 +f 101/101/15 100/100/15 208/208/15 209/209/15 +f 102/102/16 101/101/16 209/209/16 210/210/16 +f 103/103/17 102/102/17 210/210/17 211/211/17 +f 104/104/18 103/103/18 211/211/18 212/212/18 +f 105/105/19 104/104/19 212/212/19 213/213/19 +f 106/106/20 105/105/20 213/213/20 214/214/20 +f 107/107/21 106/106/21 214/214/21 215/215/21 +f 108/108/22 107/107/22 215/215/22 216/216/22 +f 55/55/23 108/108/23 216/216/23 163/163/23 +#group 4 +f 1/1/67 55/55/67 163/163/67 109/109/67 +#group 5 +f 56/56/68 2/2/68 110/110/68 164/164/68 diff --git a/include/OBJ.hpp b/include/OBJ.hpp index 5a574d1..96e30fc 100644 --- a/include/OBJ.hpp +++ b/include/OBJ.hpp @@ -2,12 +2,15 @@ #include #include #include +#include struct OBJ { std::vector vertices; std::vector faces; + std::unordered_map> face_groups; - void load_obj(std::string path); + void load_obj(std::string path, bool enable_group = false); void draw_obj(); void draw_obj_smooth(); + void draw_obj_group_smooth(); // TODO }; diff --git a/src/Game.cpp b/src/Game.cpp index b374e1c..db17c20 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -5,12 +5,14 @@ #include "OBJ.hpp" #include +#include struct Game::Private { // P-IMPL pattern glm::mat4x4 viewMat; glm::mat4x4 projMat; std::vector ocvLogo; + OBJ monkey; }; Game::Game() : m_private(std::make_unique()), m_window(nullptr) {} @@ -34,7 +36,7 @@ void Game::set_window(GLFWwindow *window) { void Game::initialize() { OBJ ocvpart; - ocvpart.load_obj(OPENGLTUTOR_HOME "assets/opencvpart.obj"); + ocvpart.load_obj(OPENGLTUTOR_HOME "assets/opencvpart_grp.obj", true); for (size_t i = 0; i < 3; ++i) { m_private->ocvLogo.push_back(ocvpart); @@ -96,6 +98,7 @@ void Game::render() { CHECK_GL(glViewport(0, 0, width, height)); CHECK_GL(glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT)); + glClearColor(0.1f, 0.1f, 0.1f, 1.0f); auto projection = m_inputCtl.get_projection_matrix(); diff --git a/src/OBJ.cpp b/src/OBJ.cpp index 07205bd..8ce070a 100644 --- a/src/OBJ.cpp +++ b/src/OBJ.cpp @@ -5,8 +5,9 @@ #include #include #include +#include -void OBJ::load_obj(std::string path) { +void OBJ::load_obj(std::string path, bool enable_group) { std::ifstream file(path); if (!file.is_open()) { std::cerr << "Failed to open file: " << path << '\n'; @@ -14,6 +15,8 @@ void OBJ::load_obj(std::string path) { } std::string line; + int current_group = -1, grouped_face = 0; + while (std::getline(file, line)) { if (line.substr(0, 2) == "v ") { std::istringstream s(line.substr(2)); @@ -33,12 +36,22 @@ void OBJ::load_obj(std::string path) { for (size_t i = 2; i < indices.size(); i++) { glm::uvec3 face = glm::uvec3(indices[0], indices[i - 1], indices[i]); faces.push_back(face); + + if (!enable_group && current_group >= 0) continue; + face_groups[current_group].push_back(faces.size() - 1); + grouped_face++; } - } + } else if (line.substr(0, 7) == "#group ") { + std::istringstream s(line.substr(7)); + unsigned int group; + s >> group; + current_group = group; + } } file.close(); std::cout << "Loaded " << vertices.size() << " vertices, " << faces.size() << " faces.\n"; + std::cout << grouped_face << " faces grouped.\n"; } static glm::vec3 perspective_divide(glm::vec4 pos) { @@ -52,6 +65,20 @@ static glm::vec3 compute_normal(glm::vec3 a, glm::vec3 b, glm::vec3 c) { return glm::normalize(glm::cross(ab, ac)); } +static glm::vec3 compute_contrib_normal(glm::vec3 v0, glm::vec3 v1, glm::vec3 v2, uint32_t vert) { + std::vector face = {v0, v1, v2}; + auto const& a = face.at(vert); + auto const& b = face.at((vert + 1) % 3); + auto const& c = face.at((vert + 2) % 3); + + glm::vec3 ab = b - a; + glm::vec3 ac = c - a; + glm::vec3 norm = glm::cross(ab, ac); + float contrib_w = asinf(static_cast(norm.length()) / (ab.length() * ac.length())); + + return glm::normalize(norm) * contrib_w; +} + void OBJ::draw_obj() { glBegin(GL_TRIANGLES); @@ -72,40 +99,43 @@ void OBJ::draw_obj() { } void OBJ::draw_obj_smooth() { - std::vector faceNormalBuffer; std::vector vertexNormalBuffer(vertices.size()); + // NormalComputePass for (auto& face : faces) { auto const& a = vertices.at(face[0]); auto const& b = vertices.at(face[1]); auto const& c = vertices.at(face[2]); - glm::vec3 fn = compute_normal(a, b, c); - faceNormalBuffer.push_back(fn); - vertexNormalBuffer[face[0]] += fn; - vertexNormalBuffer[face[1]] += fn; - vertexNormalBuffer[face[2]] += fn; + vertexNormalBuffer[face[0]] += compute_contrib_normal(a, b, c, 0); + vertexNormalBuffer[face[1]] += compute_contrib_normal(a, b, c, 1); + vertexNormalBuffer[face[2]] += compute_contrib_normal(a, b, c, 2); } for (auto& vn : vertexNormalBuffer) { vn = glm::normalize(vn); } + // ObjectDrawPass glBegin(GL_TRIANGLES); for (auto const& face : faces) { auto const& a = vertices.at(face[0]); auto const& b = vertices.at(face[1]); auto const& c = vertices.at(face[2]); - auto const& n1 = vertexNormalBuffer.at(face[0]); - auto const& n2 = vertexNormalBuffer.at(face[1]); - auto const& n3 = vertexNormalBuffer.at(face[2]); + auto const& n0 = vertexNormalBuffer.at(face[0]); + auto const& n1 = vertexNormalBuffer.at(face[1]); + auto const& n2 = vertexNormalBuffer.at(face[2]); - glNormal3fv(glm::value_ptr(n1)); + glNormal3fv(glm::value_ptr(n0)); glVertex3fv(glm::value_ptr(a)); - glNormal3fv(glm::value_ptr(n2)); + glNormal3fv(glm::value_ptr(n1)); glVertex3fv(glm::value_ptr(b)); - glNormal3fv(glm::value_ptr(n3)); + glNormal3fv(glm::value_ptr(n2)); glVertex3fv(glm::value_ptr(c)); } CHECK_GL(glEnd()); -} \ No newline at end of file +} + +void OBJ::draw_obj_group_smooth() { + // TODO +} From cba197da126db6f9da29aca71f57282d626997a2 Mon Sep 17 00:00:00 2001 From: sleeplessai <2018063+sleeplessai@users.noreply.github.com> Date: Sat, 29 Jul 2023 00:28:46 +0800 Subject: [PATCH 4/4] homework2, render opencv 3d logo, support shade flat/smooth and smoothing group --- assets/opencvpart.obj | 6 + assets/opencvpart_grp.obj | 724 -------------------------------------- include/OBJ.hpp | 5 +- src/Game.cpp | 7 +- src/OBJ.cpp | 82 ++--- 5 files changed, 51 insertions(+), 773 deletions(-) delete mode 100644 assets/opencvpart_grp.obj diff --git a/assets/opencvpart.obj b/assets/opencvpart.obj index 03231fe..388524f 100644 --- a/assets/opencvpart.obj +++ b/assets/opencvpart.obj @@ -502,6 +502,7 @@ vt 0.000000 0.000000 vt 0.000000 0.000000 vt 0.000000 0.000000 s 0 +#group 0 f 47/47/1 46/46/1 100/100/1 101/101/1 f 21/21/1 20/20/1 74/74/1 75/75/1 f 48/48/1 47/47/1 101/101/1 102/102/1 @@ -555,6 +556,7 @@ f 45/45/1 44/44/1 98/98/1 99/99/1 f 19/19/1 18/18/1 72/72/1 73/73/1 f 46/46/1 45/45/1 99/99/1 100/100/1 f 20/20/1 19/19/1 73/73/1 74/74/1 +#group 1 f 155/155/2 209/209/2 208/208/2 154/154/2 f 129/129/2 183/183/2 182/182/2 128/128/2 f 156/156/2 210/210/2 209/209/2 155/155/2 @@ -608,6 +610,7 @@ f 153/153/2 207/207/2 206/206/2 152/152/2 f 127/127/2 181/181/2 180/180/2 126/126/2 f 154/154/2 208/208/2 207/207/2 153/153/2 f 128/128/2 182/182/2 181/181/2 127/127/2 +#group 2 f 2/2/3 3/3/3 111/111/3 110/110/3 f 3/3/4 4/4/4 112/112/4 111/111/4 f 4/4/5 5/5/5 113/113/5 112/112/5 @@ -661,6 +664,7 @@ f 51/51/52 52/52/52 160/160/52 159/159/52 f 52/52/53 53/53/53 161/161/53 160/160/53 f 53/53/54 54/54/54 162/162/54 161/161/54 f 54/54/55 1/1/55 109/109/55 162/162/55 +#group 3 f 57/57/35 56/56/35 164/164/35 165/165/35 f 58/58/36 57/57/36 165/165/36 166/166/36 f 59/59/37 58/58/37 166/166/37 167/167/37 @@ -714,5 +718,7 @@ f 106/106/20 105/105/20 213/213/20 214/214/20 f 107/107/21 106/106/21 214/214/21 215/215/21 f 108/108/22 107/107/22 215/215/22 216/216/22 f 55/55/23 108/108/23 216/216/23 163/163/23 +#group 4 f 1/1/67 55/55/67 163/163/67 109/109/67 +#group 5 f 56/56/68 2/2/68 110/110/68 164/164/68 diff --git a/assets/opencvpart_grp.obj b/assets/opencvpart_grp.obj deleted file mode 100644 index 388524f..0000000 --- a/assets/opencvpart_grp.obj +++ /dev/null @@ -1,724 +0,0 @@ -# Blender 3.5.0 -# www.blender.org -o Circle -v 0.000000 0.000000 -1.000000 -v -0.881921 0.000000 -0.471397 -v -0.923880 0.000000 -0.382683 -v -0.956940 0.000000 -0.290285 -v -0.980785 0.000000 -0.195090 -v -0.995185 0.000000 -0.098017 -v -1.000000 0.000000 0.000000 -v -0.995185 0.000000 0.098017 -v -0.980785 0.000000 0.195090 -v -0.956940 0.000000 0.290285 -v -0.923880 0.000000 0.382683 -v -0.881921 0.000000 0.471397 -v -0.831470 0.000000 0.555570 -v -0.773010 0.000000 0.634393 -v -0.707107 0.000000 0.707107 -v -0.634393 0.000000 0.773010 -v -0.555570 0.000000 0.831470 -v -0.471397 0.000000 0.881921 -v -0.382683 0.000000 0.923880 -v -0.290285 0.000000 0.956940 -v -0.195090 0.000000 0.980785 -v -0.098017 0.000000 0.995185 -v 0.000000 0.000000 1.000000 -v 0.098017 0.000000 0.995185 -v 0.195090 0.000000 0.980785 -v 0.290285 0.000000 0.956940 -v 0.382683 0.000000 0.923880 -v 0.471397 0.000000 0.881921 -v 0.555570 0.000000 0.831470 -v 0.634393 0.000000 0.773010 -v 0.707107 0.000000 0.707107 -v 0.773010 0.000000 0.634393 -v 0.831470 0.000000 0.555570 -v 0.881921 0.000000 0.471397 -v 0.923880 0.000000 0.382683 -v 0.956940 0.000000 0.290285 -v 0.980785 0.000000 0.195090 -v 0.995185 0.000000 0.098017 -v 1.000000 0.000000 0.000000 -v 0.995185 0.000000 -0.098017 -v 0.980785 0.000000 -0.195090 -v 0.956940 0.000000 -0.290285 -v 0.923880 0.000000 -0.382683 -v 0.881921 0.000000 -0.471397 -v 0.831470 0.000000 -0.555570 -v 0.773010 0.000000 -0.634393 -v 0.707107 0.000000 -0.707107 -v 0.634393 0.000000 -0.773010 -v 0.555570 0.000000 -0.831470 -v 0.471397 0.000000 -0.881921 -v 0.382683 0.000000 -0.923880 -v 0.290285 0.000000 -0.956940 -v 0.195090 0.000000 -0.980785 -v 0.098017 0.000000 -0.995185 -v 0.000000 0.000000 -0.604589 -v -0.533200 0.000000 -0.285001 -v -0.558567 0.000000 -0.231366 -v -0.578555 0.000000 -0.175503 -v -0.592972 0.000000 -0.117949 -v -0.601677 0.000000 -0.059260 -v -0.604589 0.000000 0.000000 -v -0.601677 0.000000 0.059260 -v -0.592972 0.000000 0.117949 -v -0.578555 0.000000 0.175503 -v -0.558567 0.000000 0.231366 -v -0.533200 0.000000 0.285001 -v -0.502697 0.000000 0.335892 -v -0.467353 0.000000 0.383547 -v -0.427509 0.000000 0.427509 -v -0.383547 0.000000 0.467353 -v -0.335892 0.000000 0.502697 -v -0.285001 0.000000 0.533200 -v -0.231366 0.000000 0.558567 -v -0.175503 0.000000 0.578555 -v -0.117949 0.000000 0.592972 -v -0.059260 0.000000 0.601677 -v 0.000000 0.000000 0.604589 -v 0.059260 0.000000 0.601677 -v 0.117949 0.000000 0.592972 -v 0.175503 0.000000 0.578555 -v 0.231366 0.000000 0.558567 -v 0.285001 0.000000 0.533200 -v 0.335892 0.000000 0.502697 -v 0.383547 0.000000 0.467353 -v 0.427509 0.000000 0.427509 -v 0.467353 0.000000 0.383547 -v 0.502697 0.000000 0.335892 -v 0.533200 0.000000 0.285001 -v 0.558567 0.000000 0.231366 -v 0.578555 0.000000 0.175503 -v 0.592972 0.000000 0.117949 -v 0.601677 0.000000 0.059260 -v 0.604589 0.000000 0.000000 -v 0.601677 0.000000 -0.059260 -v 0.592972 0.000000 -0.117949 -v 0.578555 0.000000 -0.175503 -v 0.558567 0.000000 -0.231366 -v 0.533200 0.000000 -0.285001 -v 0.502697 0.000000 -0.335892 -v 0.467353 0.000000 -0.383547 -v 0.427509 0.000000 -0.427509 -v 0.383547 0.000000 -0.467353 -v 0.335892 0.000000 -0.502697 -v 0.285001 0.000000 -0.533200 -v 0.231366 0.000000 -0.558567 -v 0.175503 0.000000 -0.578555 -v 0.117949 0.000000 -0.592972 -v 0.059260 0.000000 -0.601677 -v 0.000000 0.300000 -1.000000 -v -0.881921 0.300000 -0.471397 -v -0.923880 0.300000 -0.382683 -v -0.956940 0.300000 -0.290285 -v -0.980785 0.300000 -0.195090 -v -0.995185 0.300000 -0.098017 -v -1.000000 0.300000 0.000000 -v -0.995185 0.300000 0.098017 -v -0.980785 0.300000 0.195090 -v -0.956940 0.300000 0.290285 -v -0.923880 0.300000 0.382683 -v -0.881921 0.300000 0.471397 -v -0.831470 0.300000 0.555570 -v -0.773010 0.300000 0.634393 -v -0.707107 0.300000 0.707107 -v -0.634393 0.300000 0.773010 -v -0.555570 0.300000 0.831470 -v -0.471397 0.300000 0.881921 -v -0.382683 0.300000 0.923880 -v -0.290285 0.300000 0.956940 -v -0.195090 0.300000 0.980785 -v -0.098017 0.300000 0.995185 -v 0.000000 0.300000 1.000000 -v 0.098017 0.300000 0.995185 -v 0.195090 0.300000 0.980785 -v 0.290285 0.300000 0.956940 -v 0.382683 0.300000 0.923880 -v 0.471397 0.300000 0.881921 -v 0.555570 0.300000 0.831470 -v 0.634393 0.300000 0.773010 -v 0.707107 0.300000 0.707107 -v 0.773010 0.300000 0.634393 -v 0.831470 0.300000 0.555570 -v 0.881921 0.300000 0.471397 -v 0.923880 0.300000 0.382683 -v 0.956940 0.300000 0.290285 -v 0.980785 0.300000 0.195090 -v 0.995185 0.300000 0.098017 -v 1.000000 0.300000 0.000000 -v 0.995185 0.300000 -0.098017 -v 0.980785 0.300000 -0.195090 -v 0.956940 0.300000 -0.290285 -v 0.923880 0.300000 -0.382683 -v 0.881921 0.300000 -0.471397 -v 0.831470 0.300000 -0.555570 -v 0.773010 0.300000 -0.634393 -v 0.707107 0.300000 -0.707107 -v 0.634393 0.300000 -0.773010 -v 0.555570 0.300000 -0.831470 -v 0.471397 0.300000 -0.881921 -v 0.382683 0.300000 -0.923880 -v 0.290285 0.300000 -0.956940 -v 0.195090 0.300000 -0.980785 -v 0.098017 0.300000 -0.995185 -v 0.000000 0.300000 -0.604589 -v -0.533200 0.300000 -0.285001 -v -0.558567 0.300000 -0.231366 -v -0.578555 0.300000 -0.175503 -v -0.592972 0.300000 -0.117949 -v -0.601677 0.300000 -0.059260 -v -0.604589 0.300000 0.000000 -v -0.601677 0.300000 0.059260 -v -0.592972 0.300000 0.117949 -v -0.578555 0.300000 0.175503 -v -0.558567 0.300000 0.231366 -v -0.533200 0.300000 0.285001 -v -0.502697 0.300000 0.335892 -v -0.467353 0.300000 0.383547 -v -0.427509 0.300000 0.427509 -v -0.383547 0.300000 0.467353 -v -0.335892 0.300000 0.502697 -v -0.285001 0.300000 0.533200 -v -0.231366 0.300000 0.558567 -v -0.175503 0.300000 0.578555 -v -0.117949 0.300000 0.592972 -v -0.059260 0.300000 0.601677 -v 0.000000 0.300000 0.604589 -v 0.059260 0.300000 0.601677 -v 0.117949 0.300000 0.592972 -v 0.175503 0.300000 0.578555 -v 0.231366 0.300000 0.558567 -v 0.285001 0.300000 0.533200 -v 0.335892 0.300000 0.502697 -v 0.383547 0.300000 0.467353 -v 0.427509 0.300000 0.427509 -v 0.467353 0.300000 0.383547 -v 0.502697 0.300000 0.335892 -v 0.533200 0.300000 0.285001 -v 0.558567 0.300000 0.231366 -v 0.578555 0.300000 0.175503 -v 0.592972 0.300000 0.117949 -v 0.601677 0.300000 0.059260 -v 0.604589 0.300000 0.000000 -v 0.601677 0.300000 -0.059260 -v 0.592972 0.300000 -0.117949 -v 0.578555 0.300000 -0.175503 -v 0.558567 0.300000 -0.231366 -v 0.533200 0.300000 -0.285001 -v 0.502697 0.300000 -0.335892 -v 0.467353 0.300000 -0.383547 -v 0.427509 0.300000 -0.427509 -v 0.383547 0.300000 -0.467353 -v 0.335892 0.300000 -0.502697 -v 0.285001 0.300000 -0.533200 -v 0.231366 0.300000 -0.558567 -v 0.175503 0.300000 -0.578555 -v 0.117949 0.300000 -0.592972 -v 0.059260 0.300000 -0.601677 -vn -0.0000 -1.0000 -0.0000 -vn -0.0000 1.0000 -0.0000 -vn -0.9040 -0.0000 -0.4276 -vn -0.9415 -0.0000 -0.3369 -vn -0.9700 -0.0000 -0.2430 -vn -0.9892 -0.0000 -0.1467 -vn -0.9988 -0.0000 -0.0491 -vn -0.9988 -0.0000 0.0491 -vn -0.9892 -0.0000 0.1467 -vn -0.9700 -0.0000 0.2430 -vn -0.9415 -0.0000 0.3369 -vn -0.9040 -0.0000 0.4276 -vn -0.8577 -0.0000 0.5141 -vn -0.8032 -0.0000 0.5957 -vn -0.7410 -0.0000 0.6716 -vn -0.6716 -0.0000 0.7410 -vn -0.5957 -0.0000 0.8032 -vn -0.5141 -0.0000 0.8577 -vn -0.4276 -0.0000 0.9040 -vn -0.3369 -0.0000 0.9415 -vn -0.2430 -0.0000 0.9700 -vn -0.1467 -0.0000 0.9892 -vn -0.0491 -0.0000 0.9988 -vn 0.0491 -0.0000 0.9988 -vn 0.1467 -0.0000 0.9892 -vn 0.2430 -0.0000 0.9700 -vn 0.3369 -0.0000 0.9415 -vn 0.4276 -0.0000 0.9040 -vn 0.5141 -0.0000 0.8577 -vn 0.5957 -0.0000 0.8032 -vn 0.6716 -0.0000 0.7410 -vn 0.7410 -0.0000 0.6716 -vn 0.8032 -0.0000 0.5957 -vn 0.8577 -0.0000 0.5141 -vn 0.9040 -0.0000 0.4276 -vn 0.9415 -0.0000 0.3369 -vn 0.9700 -0.0000 0.2430 -vn 0.9892 -0.0000 0.1467 -vn 0.9988 -0.0000 0.0491 -vn 0.9988 -0.0000 -0.0491 -vn 0.9892 -0.0000 -0.1467 -vn 0.9700 -0.0000 -0.2430 -vn 0.9415 -0.0000 -0.3369 -vn 0.9040 -0.0000 -0.4276 -vn 0.8577 -0.0000 -0.5141 -vn 0.8032 -0.0000 -0.5957 -vn 0.7410 -0.0000 -0.6716 -vn 0.6716 -0.0000 -0.7410 -vn 0.5957 -0.0000 -0.8032 -vn 0.5141 -0.0000 -0.8577 -vn 0.4276 -0.0000 -0.9040 -vn 0.3369 -0.0000 -0.9415 -vn 0.2430 -0.0000 -0.9700 -vn 0.1467 -0.0000 -0.9892 -vn 0.0491 -0.0000 -0.9988 -vn -0.0491 -0.0000 -0.9988 -vn -0.1467 -0.0000 -0.9892 -vn -0.2430 -0.0000 -0.9700 -vn -0.3369 -0.0000 -0.9415 -vn -0.4276 -0.0000 -0.9040 -vn -0.5141 -0.0000 -0.8577 -vn -0.5957 -0.0000 -0.8032 -vn -0.6716 -0.0000 -0.7410 -vn -0.7410 -0.0000 -0.6716 -vn -0.8032 -0.0000 -0.5957 -vn -0.8577 -0.0000 -0.5141 -vn -1.0000 -0.0000 -0.0000 -vn 0.4714 -0.0000 -0.8819 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -s 0 -#group 0 -f 47/47/1 46/46/1 100/100/1 101/101/1 -f 21/21/1 20/20/1 74/74/1 75/75/1 -f 48/48/1 47/47/1 101/101/1 102/102/1 -f 22/22/1 21/21/1 75/75/1 76/76/1 -f 49/49/1 48/48/1 102/102/1 103/103/1 -f 23/23/1 22/22/1 76/76/1 77/77/1 -f 50/50/1 49/49/1 103/103/1 104/104/1 -f 24/24/1 23/23/1 77/77/1 78/78/1 -f 51/51/1 50/50/1 104/104/1 105/105/1 -f 25/25/1 24/24/1 78/78/1 79/79/1 -f 52/52/1 51/51/1 105/105/1 106/106/1 -f 26/26/1 25/25/1 79/79/1 80/80/1 -f 53/53/1 52/52/1 106/106/1 107/107/1 -f 27/27/1 26/26/1 80/80/1 81/81/1 -f 54/54/1 53/53/1 107/107/1 108/108/1 -f 28/28/1 27/27/1 81/81/1 82/82/1 -f 1/1/1 54/54/1 108/108/1 55/55/1 -f 29/29/1 28/28/1 82/82/1 83/83/1 -f 3/3/1 2/2/1 56/56/1 57/57/1 -f 30/30/1 29/29/1 83/83/1 84/84/1 -f 4/4/1 3/3/1 57/57/1 58/58/1 -f 31/31/1 30/30/1 84/84/1 85/85/1 -f 5/5/1 4/4/1 58/58/1 59/59/1 -f 32/32/1 31/31/1 85/85/1 86/86/1 -f 6/6/1 5/5/1 59/59/1 60/60/1 -f 33/33/1 32/32/1 86/86/1 87/87/1 -f 7/7/1 6/6/1 60/60/1 61/61/1 -f 34/34/1 33/33/1 87/87/1 88/88/1 -f 8/8/1 7/7/1 61/61/1 62/62/1 -f 35/35/1 34/34/1 88/88/1 89/89/1 -f 9/9/1 8/8/1 62/62/1 63/63/1 -f 36/36/1 35/35/1 89/89/1 90/90/1 -f 10/10/1 9/9/1 63/63/1 64/64/1 -f 37/37/1 36/36/1 90/90/1 91/91/1 -f 11/11/1 10/10/1 64/64/1 65/65/1 -f 38/38/1 37/37/1 91/91/1 92/92/1 -f 12/12/1 11/11/1 65/65/1 66/66/1 -f 39/39/1 38/38/1 92/92/1 93/93/1 -f 13/13/1 12/12/1 66/66/1 67/67/1 -f 40/40/1 39/39/1 93/93/1 94/94/1 -f 14/14/1 13/13/1 67/67/1 68/68/1 -f 41/41/1 40/40/1 94/94/1 95/95/1 -f 15/15/1 14/14/1 68/68/1 69/69/1 -f 42/42/1 41/41/1 95/95/1 96/96/1 -f 16/16/1 15/15/1 69/69/1 70/70/1 -f 43/43/1 42/42/1 96/96/1 97/97/1 -f 17/17/1 16/16/1 70/70/1 71/71/1 -f 44/44/1 43/43/1 97/97/1 98/98/1 -f 18/18/1 17/17/1 71/71/1 72/72/1 -f 45/45/1 44/44/1 98/98/1 99/99/1 -f 19/19/1 18/18/1 72/72/1 73/73/1 -f 46/46/1 45/45/1 99/99/1 100/100/1 -f 20/20/1 19/19/1 73/73/1 74/74/1 -#group 1 -f 155/155/2 209/209/2 208/208/2 154/154/2 -f 129/129/2 183/183/2 182/182/2 128/128/2 -f 156/156/2 210/210/2 209/209/2 155/155/2 -f 130/130/2 184/184/2 183/183/2 129/129/2 -f 157/157/2 211/211/2 210/210/2 156/156/2 -f 131/131/2 185/185/2 184/184/2 130/130/2 -f 158/158/2 212/212/2 211/211/2 157/157/2 -f 132/132/2 186/186/2 185/185/2 131/131/2 -f 159/159/2 213/213/2 212/212/2 158/158/2 -f 133/133/2 187/187/2 186/186/2 132/132/2 -f 160/160/2 214/214/2 213/213/2 159/159/2 -f 134/134/2 188/188/2 187/187/2 133/133/2 -f 161/161/2 215/215/2 214/214/2 160/160/2 -f 135/135/2 189/189/2 188/188/2 134/134/2 -f 162/162/2 216/216/2 215/215/2 161/161/2 -f 136/136/2 190/190/2 189/189/2 135/135/2 -f 109/109/2 163/163/2 216/216/2 162/162/2 -f 137/137/2 191/191/2 190/190/2 136/136/2 -f 111/111/2 165/165/2 164/164/2 110/110/2 -f 138/138/2 192/192/2 191/191/2 137/137/2 -f 112/112/2 166/166/2 165/165/2 111/111/2 -f 139/139/2 193/193/2 192/192/2 138/138/2 -f 113/113/2 167/167/2 166/166/2 112/112/2 -f 140/140/2 194/194/2 193/193/2 139/139/2 -f 114/114/2 168/168/2 167/167/2 113/113/2 -f 141/141/2 195/195/2 194/194/2 140/140/2 -f 115/115/2 169/169/2 168/168/2 114/114/2 -f 142/142/2 196/196/2 195/195/2 141/141/2 -f 116/116/2 170/170/2 169/169/2 115/115/2 -f 143/143/2 197/197/2 196/196/2 142/142/2 -f 117/117/2 171/171/2 170/170/2 116/116/2 -f 144/144/2 198/198/2 197/197/2 143/143/2 -f 118/118/2 172/172/2 171/171/2 117/117/2 -f 145/145/2 199/199/2 198/198/2 144/144/2 -f 119/119/2 173/173/2 172/172/2 118/118/2 -f 146/146/2 200/200/2 199/199/2 145/145/2 -f 120/120/2 174/174/2 173/173/2 119/119/2 -f 147/147/2 201/201/2 200/200/2 146/146/2 -f 121/121/2 175/175/2 174/174/2 120/120/2 -f 148/148/2 202/202/2 201/201/2 147/147/2 -f 122/122/2 176/176/2 175/175/2 121/121/2 -f 149/149/2 203/203/2 202/202/2 148/148/2 -f 123/123/2 177/177/2 176/176/2 122/122/2 -f 150/150/2 204/204/2 203/203/2 149/149/2 -f 124/124/2 178/178/2 177/177/2 123/123/2 -f 151/151/2 205/205/2 204/204/2 150/150/2 -f 125/125/2 179/179/2 178/178/2 124/124/2 -f 152/152/2 206/206/2 205/205/2 151/151/2 -f 126/126/2 180/180/2 179/179/2 125/125/2 -f 153/153/2 207/207/2 206/206/2 152/152/2 -f 127/127/2 181/181/2 180/180/2 126/126/2 -f 154/154/2 208/208/2 207/207/2 153/153/2 -f 128/128/2 182/182/2 181/181/2 127/127/2 -#group 2 -f 2/2/3 3/3/3 111/111/3 110/110/3 -f 3/3/4 4/4/4 112/112/4 111/111/4 -f 4/4/5 5/5/5 113/113/5 112/112/5 -f 5/5/6 6/6/6 114/114/6 113/113/6 -f 6/6/7 7/7/7 115/115/7 114/114/7 -f 7/7/8 8/8/8 116/116/8 115/115/8 -f 8/8/9 9/9/9 117/117/9 116/116/9 -f 9/9/10 10/10/10 118/118/10 117/117/10 -f 10/10/11 11/11/11 119/119/11 118/118/11 -f 11/11/12 12/12/12 120/120/12 119/119/12 -f 12/12/13 13/13/13 121/121/13 120/120/13 -f 13/13/14 14/14/14 122/122/14 121/121/14 -f 14/14/15 15/15/15 123/123/15 122/122/15 -f 15/15/16 16/16/16 124/124/16 123/123/16 -f 16/16/17 17/17/17 125/125/17 124/124/17 -f 17/17/18 18/18/18 126/126/18 125/125/18 -f 18/18/19 19/19/19 127/127/19 126/126/19 -f 19/19/20 20/20/20 128/128/20 127/127/20 -f 20/20/21 21/21/21 129/129/21 128/128/21 -f 21/21/22 22/22/22 130/130/22 129/129/22 -f 22/22/23 23/23/23 131/131/23 130/130/23 -f 23/23/24 24/24/24 132/132/24 131/131/24 -f 24/24/25 25/25/25 133/133/25 132/132/25 -f 25/25/26 26/26/26 134/134/26 133/133/26 -f 26/26/27 27/27/27 135/135/27 134/134/27 -f 27/27/28 28/28/28 136/136/28 135/135/28 -f 28/28/29 29/29/29 137/137/29 136/136/29 -f 29/29/30 30/30/30 138/138/30 137/137/30 -f 30/30/31 31/31/31 139/139/31 138/138/31 -f 31/31/32 32/32/32 140/140/32 139/139/32 -f 32/32/33 33/33/33 141/141/33 140/140/33 -f 33/33/34 34/34/34 142/142/34 141/141/34 -f 34/34/35 35/35/35 143/143/35 142/142/35 -f 35/35/36 36/36/36 144/144/36 143/143/36 -f 36/36/37 37/37/37 145/145/37 144/144/37 -f 37/37/38 38/38/38 146/146/38 145/145/38 -f 38/38/39 39/39/39 147/147/39 146/146/39 -f 39/39/40 40/40/40 148/148/40 147/147/40 -f 40/40/41 41/41/41 149/149/41 148/148/41 -f 41/41/42 42/42/42 150/150/42 149/149/42 -f 42/42/43 43/43/43 151/151/43 150/150/43 -f 43/43/44 44/44/44 152/152/44 151/151/44 -f 44/44/45 45/45/45 153/153/45 152/152/45 -f 45/45/46 46/46/46 154/154/46 153/153/46 -f 46/46/47 47/47/47 155/155/47 154/154/47 -f 47/47/48 48/48/48 156/156/48 155/155/48 -f 48/48/49 49/49/49 157/157/49 156/156/49 -f 49/49/50 50/50/50 158/158/50 157/157/50 -f 50/50/51 51/51/51 159/159/51 158/158/51 -f 51/51/52 52/52/52 160/160/52 159/159/52 -f 52/52/53 53/53/53 161/161/53 160/160/53 -f 53/53/54 54/54/54 162/162/54 161/161/54 -f 54/54/55 1/1/55 109/109/55 162/162/55 -#group 3 -f 57/57/35 56/56/35 164/164/35 165/165/35 -f 58/58/36 57/57/36 165/165/36 166/166/36 -f 59/59/37 58/58/37 166/166/37 167/167/37 -f 60/60/38 59/59/38 167/167/38 168/168/38 -f 61/61/39 60/60/39 168/168/39 169/169/39 -f 62/62/40 61/61/40 169/169/40 170/170/40 -f 63/63/41 62/62/41 170/170/41 171/171/41 -f 64/64/42 63/63/42 171/171/42 172/172/42 -f 65/65/43 64/64/43 172/172/43 173/173/43 -f 66/66/44 65/65/44 173/173/44 174/174/44 -f 67/67/45 66/66/45 174/174/45 175/175/45 -f 68/68/46 67/67/46 175/175/46 176/176/46 -f 69/69/47 68/68/47 176/176/47 177/177/47 -f 70/70/48 69/69/48 177/177/48 178/178/48 -f 71/71/49 70/70/49 178/178/49 179/179/49 -f 72/72/50 71/71/50 179/179/50 180/180/50 -f 73/73/51 72/72/51 180/180/51 181/181/51 -f 74/74/52 73/73/52 181/181/52 182/182/52 -f 75/75/53 74/74/53 182/182/53 183/183/53 -f 76/76/54 75/75/54 183/183/54 184/184/54 -f 77/77/55 76/76/55 184/184/55 185/185/55 -f 78/78/56 77/77/56 185/185/56 186/186/56 -f 79/79/57 78/78/57 186/186/57 187/187/57 -f 80/80/58 79/79/58 187/187/58 188/188/58 -f 81/81/59 80/80/59 188/188/59 189/189/59 -f 82/82/60 81/81/60 189/189/60 190/190/60 -f 83/83/61 82/82/61 190/190/61 191/191/61 -f 84/84/62 83/83/62 191/191/62 192/192/62 -f 85/85/63 84/84/63 192/192/63 193/193/63 -f 86/86/64 85/85/64 193/193/64 194/194/64 -f 87/87/65 86/86/65 194/194/65 195/195/65 -f 88/88/66 87/87/66 195/195/66 196/196/66 -f 89/89/3 88/88/3 196/196/3 197/197/3 -f 90/90/4 89/89/4 197/197/4 198/198/4 -f 91/91/5 90/90/5 198/198/5 199/199/5 -f 92/92/6 91/91/6 199/199/6 200/200/6 -f 93/93/7 92/92/7 200/200/7 201/201/7 -f 94/94/8 93/93/8 201/201/8 202/202/8 -f 95/95/9 94/94/9 202/202/9 203/203/9 -f 96/96/10 95/95/10 203/203/10 204/204/10 -f 97/97/11 96/96/11 204/204/11 205/205/11 -f 98/98/12 97/97/12 205/205/12 206/206/12 -f 99/99/13 98/98/13 206/206/13 207/207/13 -f 100/100/14 99/99/14 207/207/14 208/208/14 -f 101/101/15 100/100/15 208/208/15 209/209/15 -f 102/102/16 101/101/16 209/209/16 210/210/16 -f 103/103/17 102/102/17 210/210/17 211/211/17 -f 104/104/18 103/103/18 211/211/18 212/212/18 -f 105/105/19 104/104/19 212/212/19 213/213/19 -f 106/106/20 105/105/20 213/213/20 214/214/20 -f 107/107/21 106/106/21 214/214/21 215/215/21 -f 108/108/22 107/107/22 215/215/22 216/216/22 -f 55/55/23 108/108/23 216/216/23 163/163/23 -#group 4 -f 1/1/67 55/55/67 163/163/67 109/109/67 -#group 5 -f 56/56/68 2/2/68 110/110/68 164/164/68 diff --git a/include/OBJ.hpp b/include/OBJ.hpp index 96e30fc..cfd8fc7 100644 --- a/include/OBJ.hpp +++ b/include/OBJ.hpp @@ -7,10 +7,9 @@ struct OBJ { std::vector vertices; std::vector faces; - std::unordered_map> face_groups; + std::unordered_map> smoothing_groups; - void load_obj(std::string path, bool enable_group = false); + void load_obj(std::string path, bool grouped = false); void draw_obj(); void draw_obj_smooth(); - void draw_obj_group_smooth(); // TODO }; diff --git a/src/Game.cpp b/src/Game.cpp index db17c20..41e244c 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -5,14 +5,12 @@ #include "OBJ.hpp" #include -#include struct Game::Private { // P-IMPL pattern glm::mat4x4 viewMat; glm::mat4x4 projMat; std::vector ocvLogo; - OBJ monkey; }; Game::Game() : m_private(std::make_unique()), m_window(nullptr) {} @@ -36,7 +34,7 @@ void Game::set_window(GLFWwindow *window) { void Game::initialize() { OBJ ocvpart; - ocvpart.load_obj(OPENGLTUTOR_HOME "assets/opencvpart_grp.obj", true); + ocvpart.load_obj(OPENGLTUTOR_HOME "assets/opencvpart.obj", true); for (size_t i = 0; i < 3; ++i) { m_private->ocvLogo.push_back(ocvpart); @@ -76,9 +74,6 @@ void Game::initialize() { } } - //m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/monkey.obj"); - //m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/cube.obj"); - CHECK_GL(glEnable(GL_DEPTH_TEST)); CHECK_GL(glEnable(GL_MULTISAMPLE)); CHECK_GL(glEnable(GL_BLEND)); diff --git a/src/OBJ.cpp b/src/OBJ.cpp index 8ce070a..e7faea6 100644 --- a/src/OBJ.cpp +++ b/src/OBJ.cpp @@ -5,9 +5,8 @@ #include #include #include -#include -void OBJ::load_obj(std::string path, bool enable_group) { +void OBJ::load_obj(std::string path, bool grouped) { std::ifstream file(path); if (!file.is_open()) { std::cerr << "Failed to open file: " << path << '\n'; @@ -15,7 +14,7 @@ void OBJ::load_obj(std::string path, bool enable_group) { } std::string line; - int current_group = -1, grouped_face = 0; + unsigned int current_group = 0; while (std::getline(file, line)) { if (line.substr(0, 2) == "v ") { @@ -37,21 +36,18 @@ void OBJ::load_obj(std::string path, bool enable_group) { glm::uvec3 face = glm::uvec3(indices[0], indices[i - 1], indices[i]); faces.push_back(face); - if (!enable_group && current_group >= 0) continue; - face_groups[current_group].push_back(faces.size() - 1); - grouped_face++; + smoothing_groups[current_group].push_back(faces.size() - 1); } } else if (line.substr(0, 7) == "#group ") { std::istringstream s(line.substr(7)); unsigned int group; s >> group; - current_group = group; + if (grouped) current_group = group; } } file.close(); std::cout << "Loaded " << vertices.size() << " vertices, " << faces.size() << " faces.\n"; - std::cout << grouped_face << " faces grouped.\n"; } static glm::vec3 perspective_divide(glm::vec4 pos) { @@ -79,13 +75,12 @@ static glm::vec3 compute_contrib_normal(glm::vec3 v0, glm::vec3 v1, glm::vec3 v2 return glm::normalize(norm) * contrib_w; } -void OBJ::draw_obj() { +static void object_draw_flat_pass(OBJ const& obj) { glBegin(GL_TRIANGLES); - - for (auto face : faces) { - auto const &a = vertices.at(face[0]); - auto const &b = vertices.at(face[1]); - auto const &c = vertices.at(face[2]); + for (auto face : obj.faces) { + auto const& a = obj.vertices.at(face[0]); + auto const& b = obj.vertices.at(face[1]); + auto const& c = obj.vertices.at(face[2]); glm::vec3 norm = compute_normal(a, b, c); glNormal3fv(glm::value_ptr(norm)); @@ -94,38 +89,37 @@ void OBJ::draw_obj() { glVertex3fv(glm::value_ptr(b)); glVertex3fv(glm::value_ptr(c)); } - CHECK_GL(glEnd()); } -void OBJ::draw_obj_smooth() { - std::vector vertexNormalBuffer(vertices.size()); - - // NormalComputePass - for (auto& face : faces) { - auto const& a = vertices.at(face[0]); - auto const& b = vertices.at(face[1]); - auto const& c = vertices.at(face[2]); - - vertexNormalBuffer[face[0]] += compute_contrib_normal(a, b, c, 0); - vertexNormalBuffer[face[1]] += compute_contrib_normal(a, b, c, 1); - vertexNormalBuffer[face[2]] += compute_contrib_normal(a, b, c, 2); +static void normal_compute_pass(OBJ const& obj, std::vector const& face_indices, std::vector& vertex_normal_buffer) { + for (auto const& index : face_indices) { + auto const& face = obj.faces.at(index); + auto const& a = obj.vertices.at(face[0]); + auto const& b = obj.vertices.at(face[1]); + auto const& c = obj.vertices.at(face[2]); + + vertex_normal_buffer[face[0]] += compute_contrib_normal(a, b, c, 0); + vertex_normal_buffer[face[1]] += compute_contrib_normal(a, b, c, 1); + vertex_normal_buffer[face[2]] += compute_contrib_normal(a, b, c, 2); } - for (auto& vn : vertexNormalBuffer) { + for (auto& vn : vertex_normal_buffer) { vn = glm::normalize(vn); } +} - // ObjectDrawPass +static void object_draw_smooth_pass(OBJ const& obj, std::vector const& face_indices, std::vector const& vertex_normal_buffer) { glBegin(GL_TRIANGLES); - for (auto const& face : faces) { - auto const& a = vertices.at(face[0]); - auto const& b = vertices.at(face[1]); - auto const& c = vertices.at(face[2]); - - auto const& n0 = vertexNormalBuffer.at(face[0]); - auto const& n1 = vertexNormalBuffer.at(face[1]); - auto const& n2 = vertexNormalBuffer.at(face[2]); - + for (auto const& index : face_indices) { + auto const& face = obj.faces.at(index); + auto const& a = obj.vertices.at(face[0]); + auto const& b = obj.vertices.at(face[1]); + auto const& c = obj.vertices.at(face[2]); + + auto const& n0 = vertex_normal_buffer.at(face[0]); + auto const& n1 = vertex_normal_buffer.at(face[1]); + auto const& n2 = vertex_normal_buffer.at(face[2]); + glNormal3fv(glm::value_ptr(n0)); glVertex3fv(glm::value_ptr(a)); glNormal3fv(glm::value_ptr(n1)); @@ -136,6 +130,14 @@ void OBJ::draw_obj_smooth() { CHECK_GL(glEnd()); } -void OBJ::draw_obj_group_smooth() { - // TODO +void OBJ::draw_obj() { + object_draw_flat_pass(*this); +} + +void OBJ::draw_obj_smooth() { + for (auto const& [i, group] : smoothing_groups) { + std::vector vert_norm_buffer(vertices.size(), glm::vec3(0.0f)); + normal_compute_pass(*this, group, vert_norm_buffer); + object_draw_smooth_pass(*this, group, vert_norm_buffer); + } }