Skip to content

Commit 9773b0b

Browse files
committed
homework2, draw opencv 3d logo in motion with opengl compat.
1 parent 9962a2e commit 9773b0b

File tree

3 files changed

+73
-17
lines changed

3 files changed

+73
-17
lines changed

src/Game.cpp

Lines changed: 71 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@
44
#include <glm/ext.hpp>
55
#include "OBJ.hpp"
66

7+
#include <vector>
8+
79
struct Game::Private { // P-IMPL pattern
810
glm::mat4x4 viewMat;
911
glm::mat4x4 projMat;
1012

11-
OBJ monkey;
13+
std::vector<OBJ> ocvLogo;
1214
};
1315

14-
Game::Game() : m_private(std::make_unique<Private>()) {}
16+
Game::Game() : m_private(std::make_unique<Private>()), m_window(nullptr) {}
1517

1618
Game::~Game() = default;
1719

@@ -31,11 +33,52 @@ void Game::set_window(GLFWwindow *window) {
3133
#endif
3234

3335
void Game::initialize() {
34-
/* m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/opencvpart.obj"); */
35-
m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/monkey.obj");
36-
/* m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/cube.obj"); */
36+
OBJ ocvpart;
37+
ocvpart.load_obj(OPENGLTUTOR_HOME "assets/opencvpart.obj");
38+
39+
for (size_t i = 0; i < 3; ++i) {
40+
m_private->ocvLogo.push_back(ocvpart);
41+
}
42+
constexpr float short_side = 0.65f;
43+
glm::vec3 tri_sides = {short_side, 2 * short_side, short_side * sqrtf(3)};
44+
45+
auto C0 = glm::vec3(0.0f, tri_sides.y, 0.0f);
46+
auto C1 = glm::vec3(-tri_sides.z, -tri_sides.x, 0.0f);
47+
auto C2 = glm::vec3(tri_sides.z, -tri_sides.x, 0.0f);
48+
49+
std::vector<glm::mat4x4> cvLogoModel;
50+
51+
auto model = glm::mat4x4(1.0f);
52+
model = glm::translate(model, C0);
53+
model = glm::rotate(model, glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f));
54+
model = glm::rotate(model, glm::radians(150.0f), glm::vec3(0.0f, 1.0f, 0.0f));
55+
cvLogoModel.push_back(model);
56+
57+
model = glm::mat4x4(1.0f);
58+
model = glm::translate(model, C1);
59+
model = glm::rotate(model, glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f));
60+
model = glm::rotate(model, glm::radians(-90.0f), glm::vec3(0.0f, 1.0f, 0.0f));
61+
cvLogoModel.push_back(model);
62+
63+
model = glm::mat4x4(1.0f);
64+
model = glm::translate(model, C2);
65+
model = glm::rotate(model, glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f));
66+
model = glm::rotate(model, glm::radians(-30.0f), glm::vec3(0.0f, 1.0f, 0.0f));
67+
cvLogoModel.push_back(model);
68+
69+
for (size_t i = 0; i < m_private->ocvLogo.size(); ++i) {
70+
auto& ocvPart = m_private->ocvLogo.at(i);
71+
auto& ocvPartModel = cvLogoModel.at(i);
72+
for (auto& vert : ocvPart.vertices) {
73+
vert = ocvPartModel * glm::vec4(vert, 1.0f);
74+
}
75+
}
76+
77+
//m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/monkey.obj");
78+
//m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/cube.obj");
79+
3780
CHECK_GL(glEnable(GL_DEPTH_TEST));
38-
CHECK_GL(glDisable(GL_MULTISAMPLE));
81+
CHECK_GL(glEnable(GL_MULTISAMPLE));
3982
CHECK_GL(glEnable(GL_BLEND));
4083
CHECK_GL(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
4184
CHECK_GL(glEnable(GL_LIGHTING));
@@ -44,6 +87,7 @@ void Game::initialize() {
4487
CHECK_GL(glEnable(GL_CULL_FACE));
4588
CHECK_GL(glCullFace(GL_BACK));
4689
CHECK_GL(glFrontFace(GL_CCW));
90+
CHECK_GL(glShadeModel(GL_SMOOTH));
4791
}
4892

4993
void Game::render() {
@@ -57,19 +101,31 @@ void Game::render() {
57101

58102
CHECK_GL(glMatrixMode(GL_PROJECTION));
59103
CHECK_GL(glLoadMatrixf(glm::value_ptr(projection)));
60-
104+
61105
auto view = m_inputCtl.get_view_matrix();
62-
106+
63107
glm::mat4x4 model(1.0f);
108+
109+
static float motionAngle = 0.0f;
110+
static constexpr glm::vec3 motionAxis = { 0.0f, 1.0f, 0.0f };
111+
static constexpr float motionDelta = 1.2f;
64112

65-
static float angle = 0.0f;
66-
model = glm::rotate(model, glm::radians(angle), glm::vec3(0.0f, 1.0f, 0.0f));
67-
model = glm::translate(model, glm::vec3(0.0f, 0.12f * glm::sin(glm::radians(angle) * 2.718f), 0.0f));
68-
angle += 0.5f;
69-
70113
CHECK_GL(glMatrixMode(GL_MODELVIEW));
114+
115+
model = glm::rotate(glm::mat4(1.0f), glm::radians(motionAngle), motionAxis);
116+
CHECK_GL(glLoadMatrixf(glm::value_ptr(view * model)));
117+
glColor3f(1.0f, 0.0f, 0.0f);
118+
m_private->ocvLogo.at(0).draw_obj();
119+
120+
model = glm::rotate(glm::mat4(1.0f), glm::radians(motionAngle), motionAxis);
121+
CHECK_GL(glLoadMatrixf(glm::value_ptr(view * model)));
122+
glColor3f(0.0f, 1.0f, 0.0f);
123+
m_private->ocvLogo.at(1).draw_obj();
124+
125+
model = glm::rotate(glm::mat4(1.0f), glm::radians(motionAngle), motionAxis);
71126
CHECK_GL(glLoadMatrixf(glm::value_ptr(view * model)));
127+
glColor3f(0.0f, 0.0f, 1.0f);
128+
m_private->ocvLogo.at(2).draw_obj();
72129

73-
glColor3f(0.9f, 0.6f, 0.1f);
74-
m_private->monkey.draw_obj();
130+
motionAngle += motionDelta;
75131
}

src/InputCtl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ static auto glfw_input_callback(FpFn fpFn) {
2626

2727
struct CameraState {
2828
/* glm::mat4x4 transformation; */
29-
glm::vec3 eye = {0, 0, 5};
29+
glm::vec3 eye = {0, 0, 10};
3030
glm::vec3 lookat = {0, 0, 0};
3131
glm::vec3 up_vector = {0, 1, 0};
3232
glm::vec3 keep_up_axis = {0, 1, 0};

src/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ int main() {
4040
}
4141

4242
// Create main window
43-
constexpr char title[] = "Example";
43+
constexpr char title[] = "Homework2: OpenCV 3D Logo";
4444
GLFWwindow *window = glfwCreateWindow(1024, 768, title, NULL, NULL);
4545

4646
// Test if window creation succeed

0 commit comments

Comments
 (0)