지난번에 .obj 파일을 파싱하여 다음과 같은 오브젝트를 그리는 데 성공했었다.
이번에는 이 오브젝트에 다음과 같은 작업을 진행하였다.
const static float objectSpeed = 0.025f;
glmath::vec3 move(0.0f);
// S, W 를 누르면 cameraFront 방향으로 objectSpeed 만큼 이동
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
move = move + objectSpeed * m_cameraFront;
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
move = move - objectSpeed * m_cameraFront;
// A, D 를 누르면 cameraRight 방향으로 objectSpeed 만큼 이동
glmath::vec3 cameraRight = glmath::normalize(glmath::cross(m_cameraFront, m_cameraUp));
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
move = move + objectSpeed * cameraRight;
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
move = move - objectSpeed * cameraRight;
// Q, E 를 누르면 cameraUp 방향으로 objectSpeed 만큼 이동
glmath::vec3 cameraUp = glmath::normalize(glmath::cross(cameraRight, m_cameraFront));
if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS)
move = move + objectSpeed * cameraUp;
if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS)
move = move - objectSpeed * cameraUp;
// m_move 값 변경
m_move = m_move + move;
const static float rotateSpeed = 0.5f;
float degree = 0.0f;
// R 입력시 rotateSpeed 만큼 회전
if (glfwGetKey(window, GLFW_KEY_R) == GLFW_PRESS)
degree = rotateSpeed;
// m_degree 값 변경
m_degree = m_degree + degree;
if (m_degree > 360.0f) { m_degree -= 360.0f; }
glmath::mat4 model = glmath::translate(glmath::mat4(1.0f), m_modelPos + m_move) *
glmath::rotate(glmath::mat4(1.0f), glmath::radians(m_degree), glmath::vec3(0.0f, 1.0f, 0.0f)) *
glmath::scale(glmath::mat4(1.0f), glmath::vec3(1.0f)) *
glmath::translate(glmath::mat4(1.0f), -1 * m_modelPos);
struct Vertex {
glmath::vec3 pos;
glmath::vec2 texCoord;
glmath::vec3 color; // 추가
};
void Model::setColor(std::vector<Vertex>& vertices) {
static std::random_device rd;
static std::mt19937 gen(rd());
static std::uniform_real_distribution<float> dis(0.0f, 1.0f);
for (int i = 0; i < vertices.size() / 3; i++) {
glmath::vec3 color(dis(gen), dis(gen), dis(gen));
vertices[3 * i].color = color;
vertices[3 * i + 1].color = color;
vertices[3 * i + 2].color = color;
}
}
m_vertexArray->setAttribute(0, 3, sizeof(Vertex), offsetof(Vertex, pos));
m_vertexArray->setAttribute(1, 2, sizeof(Vertex), offsetof(Vertex, texCoord));
// location = 2에 color 값 추가
m_vertexArray->setAttribute(2, 3, sizeof(Vertex), offsetof(Vertex, color));
objInfo->vertexInfo.vPosInfo.push_back(Pos(v[0], v[1], v[2]));
objInfo->vertexInfo.vTexInfo.push_back(TexCoord(v[0], v[1]));
float pi = 3.141592f;
float r = std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
if (r == 0) r = 1.0f;
float theta = std::atan2(v[2], v[0]);
float phi = std::asin(v[1] / r);
float U = (phi + pi / 2) / pi;
float V = (theta + pi) / (2.0f * pi);
objInfo->vertexInfo.vTexInfo.push_back(TexCoord(V, U));
objInfo->vertexInfo.vPosInfo.push_back(Pos(v[0], v[1], v[2]));
void main() {
// texture color + base color
fragColor = texture(tex, texCoord) * texRatio + vec4(color, 1.0f) * (1 - texRatio);
}
static float transSpeed = -0.01;
static bool keyTPressed = false;
if (glfwGetKey(window, GLFW_KEY_T) == GLFW_PRESS) {
if (!keyTPressed) {
transSpeed = -transSpeed;
keyTPressed = true;
}
} else {
keyTPressed = false;
}
이로써 SCOP 과제의 기본 구현 사항을 모두 완료하였다! 오브젝트의 이동과 회전, 프리미티브별 색상 적용, 그리고 텍스처 전환까지 성공적으로 구현하였다.
앞으로는 보너스 기능이나 추가적인 개선 사항을 고려해 볼 계획이다.
SCOP: 프로젝트를 하며 느낀 점 - (9) (1) | 2024.10.01 |
---|---|
SCOP: 자연스러운 텍스처 매핑을 위한 UV 좌표계 경계 처리 - (8) (0) | 2024.10.01 |
SCOP : 기능별 클래스로 리팩토링하기 - (6) (0) | 2024.09.23 |
SCOP : BMP 이미지 파싱과 텍스처 매핑 구현 - (5) (0) | 2024.09.23 |
SCOP : GLM을 대체하는 GLMath 라이브러리 구현 - (4) (0) | 2024.09.20 |