Computer Graphics/SCOP

SCOP - 1. 오브젝트 이동, 회전 구현

surkim 2024. 9. 25. 16:14

OpenGL 지금까지 공부한 코드를 그대로 가져와 내 입맛대로 변경하여 과제를 완료하려고 한다.

github commit상 09-03에 해당하는 코드를 가져왔다.

https://surkim.tistory.com/32

 

OpenGL 정리 - 17. 오브젝트 로더 구현 (Assimp)

Objective박스 외의 오브젝트를 렌더링해보자. 실제 게임 등에 사용되는 오브젝트를 렌더링하기 위해 어떤 작업을 해야 할까?3D Modeling Tool을 이용해 3D 모델을 디자인.3D 모델 파일 포맷으로 저장.저

surkim.tistory.com

 

과제에서는 이벤트 입력과 창 띄우는 거 외에 모든 라이브러리를 사용해선 안 된다고 했지만, 일단 모든 라이브러리를 사용해 프로젝트를 완성하고 그 라이브러리들을 대체해 나가는 방식으로 접근할 계획이다. 이번 포스트에서는 우선 오브젝트 이동과 회전 기능을 구현한 부분에 대해 설명하겠다.

1. 오브젝트 이동 구현

오브젝트 이동은 키보드 입력에 따라 물체가 x, y, z 축을 기준으로 전후좌우, 상하로 움직이도록 구현했다. 사용자는 W, A, S, D, Q, E 키를 통해 물체를 자유롭게 이동시킬 수 있다. 이 동작은 glfwGetKey 함수를 사용해 키 입력을 감지하고, 해당 키가 눌릴 때마다 물체의 위치 값인 m_objectPos를 조정해 구현되었다.

if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
    m_objectPos.y += moveSpeed;
}
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {
    m_objectPos.y -= moveSpeed;
}
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) {
    m_objectPos.x += moveSpeed;
}
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {
    m_objectPos.x -= moveSpeed;
}
if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS) {
    m_objectPos.z += moveSpeed;
}
if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS) {
    m_objectPos.z -= moveSpeed;
}

// render
auto projection = glm::perspective(glm::radians(45.0f), (float)m_width / (float)m_height, 0.1f, 100.0f);
auto view = glm::lookAt(m_cameraPos, m_cameraPos + m_cameraFront, m_cameraUp);
auto model = glm::mat4(1.0f);  // 모델 행렬 (초기 위치)
model = glm::translate(model, m_objectPos);  // 모델 이동

이 코드에서 moveSpeed는 물체가 한 번의 입력에 따라 이동하는 속도를 나타내며, W/S 키로 y축 이동, A/D 키로 x축 이동, Q/E 키로 z축 이동을 제어할 수 있도록 했다. 이러한 이동 구현을 통해 사용자는 물체를 3D 공간 내에서 자유롭게 조작할 수 있다.

2. 오브젝트 회전 구현

회전 기능은 space 키를 눌러 토글하는 방식으로 구현되었다. 회전 기능이 활성화되면 물체가 중심 축을 기준으로 지속적으로 회전하게 된다. 이 과정에서 물체의 회전 각도를 일정하게 증가시키는 방식으로 회전이 구현되었으며, glm::rotate 함수를 사용해 물체의 모델 행렬에 회전을 적용했다.

// 스페이스바를 눌러 회전 활성화/비활성화 토글
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS && !m_rotateToggled) {
    m_rotate = !m_rotate;  // 회전 상태 토글
    m_rotateToggled = true;
}
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_RELEASE) {
    m_rotateToggled = false;  // 키를 떼면 다시 토글 가능
}


// render
static float angle = 0.0f;
if (m_rotate) {
    angle += 0.5f;  // 회전 각도 증가
}
model = glm::rotate(model, glm::radians(angle), glm::vec3(0.0f, 1.0f, 0.0f));  // y축 기준 회전

위 코드에서는 space 키를 누를 때마다 회전 기능을 켜고 끌 수 있도록 m_rotate 플래그를 사용해 토글 방식으로 처리했다. 또한, angle 값을 증가시켜 회전 속도를 제어하고, glm::rotate 함수를 통해 y축을 기준으로 물체가 회전하게 했다. 이러한 방식으로 오브젝트는 사용자의 입력에 따라 부드럽게 회전하며, 언제든지 회전을 중단할 수 있다.


3. 결과

0

 

다음 포스트에서는 텍스처 적용 및 자연스러운 전환 효과에 대해 다룰 예정이다.