Skip to content

Commit 5e20e6d

Browse files
committed
homework2, shade smooth
1 parent 9773b0b commit 5e20e6d

File tree

3 files changed

+43
-3
lines changed

3 files changed

+43
-3
lines changed

include/OBJ.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ struct OBJ {
99

1010
void load_obj(std::string path);
1111
void draw_obj();
12+
void draw_obj_smooth();
1213
};

src/Game.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -115,17 +115,17 @@ void Game::render() {
115115
model = glm::rotate(glm::mat4(1.0f), glm::radians(motionAngle), motionAxis);
116116
CHECK_GL(glLoadMatrixf(glm::value_ptr(view * model)));
117117
glColor3f(1.0f, 0.0f, 0.0f);
118-
m_private->ocvLogo.at(0).draw_obj();
118+
m_private->ocvLogo.at(0).draw_obj_smooth();
119119

120120
model = glm::rotate(glm::mat4(1.0f), glm::radians(motionAngle), motionAxis);
121121
CHECK_GL(glLoadMatrixf(glm::value_ptr(view * model)));
122122
glColor3f(0.0f, 1.0f, 0.0f);
123-
m_private->ocvLogo.at(1).draw_obj();
123+
m_private->ocvLogo.at(1).draw_obj_smooth();
124124

125125
model = glm::rotate(glm::mat4(1.0f), glm::radians(motionAngle), motionAxis);
126126
CHECK_GL(glLoadMatrixf(glm::value_ptr(view * model)));
127127
glColor3f(0.0f, 0.0f, 1.0f);
128-
m_private->ocvLogo.at(2).draw_obj();
128+
m_private->ocvLogo.at(2).draw_obj_smooth();
129129

130130
motionAngle += motionDelta;
131131
}

src/OBJ.cpp

+39
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,42 @@ void OBJ::draw_obj() {
7070

7171
CHECK_GL(glEnd());
7272
}
73+
74+
void OBJ::draw_obj_smooth() {
75+
std::vector<glm::vec3> faceNormalBuffer;
76+
std::vector<glm::vec3> vertexNormalBuffer(vertices.size());
77+
78+
for (auto& face : faces) {
79+
auto const& a = vertices.at(face[0]);
80+
auto const& b = vertices.at(face[1]);
81+
auto const& c = vertices.at(face[2]);
82+
83+
glm::vec3 fn = compute_normal(a, b, c);
84+
faceNormalBuffer.push_back(fn);
85+
vertexNormalBuffer[face[0]] += fn;
86+
vertexNormalBuffer[face[1]] += fn;
87+
vertexNormalBuffer[face[2]] += fn;
88+
}
89+
for (auto& vn : vertexNormalBuffer) {
90+
vn = glm::normalize(vn);
91+
}
92+
93+
glBegin(GL_TRIANGLES);
94+
for (auto const& face : faces) {
95+
auto const& a = vertices.at(face[0]);
96+
auto const& b = vertices.at(face[1]);
97+
auto const& c = vertices.at(face[2]);
98+
99+
auto const& n1 = vertexNormalBuffer.at(face[0]);
100+
auto const& n2 = vertexNormalBuffer.at(face[1]);
101+
auto const& n3 = vertexNormalBuffer.at(face[2]);
102+
103+
glNormal3fv(glm::value_ptr(n1));
104+
glVertex3fv(glm::value_ptr(a));
105+
glNormal3fv(glm::value_ptr(n2));
106+
glVertex3fv(glm::value_ptr(b));
107+
glNormal3fv(glm::value_ptr(n3));
108+
glVertex3fv(glm::value_ptr(c));
109+
}
110+
CHECK_GL(glEnd());
111+
}

0 commit comments

Comments
 (0)