이번에는 ImGui를 이용해 사람 모델의 각 파츠를 실시간으로 조정할 수 있는 인터페이스를 추가했다. 이제 각 파츠의 계층적 구조를 더 직관적으로 확인할 수 있게 되었고, 다양한 조정이 가능해졌다.
0
ImGui 추가하기
렌더링 함수에 ImGui를 추가하면서, 사람 모델의 각 파츠의 변형 값을 실시간으로 조정할 수 있도록 했다. Context::Render()
함수에서 ImGui 위젯을 사용해 각 파츠의 스케일, 색상, 회전 등을 다룰 수 있는 슬라이더와 버튼을 배치했다.
void Context::Render() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
// ImGui 인터페이스 추가
if (ImGui::Begin("Human Control")) {
ImGui::Text("Animation");
ImGui::Checkbox("Animation", &m_animation);
if (ImGui::Button("Reset")) {
m_human->Initialize();
}
ImGui::Text("Body");
ImGui::SliderFloat3("Body Scale", &m_human->m_body.scale[0], 0.1f, 2.0f);
ImGui::SliderFloat3("Body Size", &m_human->m_body.size[0], 0.1f, 2.0f);
ImGui::ColorEdit3("Body Color", &m_human->m_body.color[0]);
ImGui::Text("Head");
ImGui::SliderFloat3("Translate Head", &m_human->m_head.translate[0], -5.0f, 5.0f);
ImGui::SliderFloat3("Rotate Head", &m_human->m_head.rotate[0], -180.0f, 180.0f);
ImGui::SliderFloat3("Scale Head", &m_human->m_head.scale[0], 0.1f, 2.0f);
ImGui::SliderFloat3("Size Head", &m_human->m_head.size[0], 0.1f, 2.0f);
ImGui::ColorEdit3("Color Head", &m_human->m_head.color[0]);
// 다른 파츠들도 마찬가지로 설정
// ...
}
ImGui::End();
// 기존 렌더링 코드
sglm::vec4 tmp =
sglm::rotate(sglm::mat4(1.0f), sglm::radians(m_cameraYaw), sglm::vec3(0.0f, 1.0f, 0.0f)) *
sglm::rotate(sglm::mat4(1.0f), sglm::radians(m_cameraPitch), sglm::vec3(1.0f, 0.0f, 0.0f)) *
sglm::vec4(0.0f, 0.0f, -1.0f, 0.0f);
m_cameraFront = sglm::vec3(tmp.x, tmp.y, tmp.z);
auto projection = sglm::perspective(sglm::radians(45.0f), (float)m_width / (float)m_height, 0.01f, 100.0f);
auto view = sglm::lookAt(m_cameraPos, m_cameraPos + m_cameraFront, m_cameraUp);
sglm::mat4 translateModel = sglm::translate(sglm::mat4(1.0f), m_modelTranslate);
sglm::mat4 rotateModel = sglm::rotate(sglm::mat4(1.0f), sglm::radians(m_modelRotate.x), sglm::vec3(1.0f, 0.0f, 0.0f));
rotateModel = sglm::rotate(rotateModel, sglm::radians(m_modelRotate.y), sglm::vec3(0.0f, 1.0f, 0.0f));
rotateModel = sglm::rotate(rotateModel, sglm::radians(m_modelRotate.z), sglm::vec3(0.0f, 0.0f, 1.0f));
sglm::mat4 scaleModel = sglm::scale(sglm::mat4(1.0f), m_modelScale);
auto transform = projection * view * translateModel * rotateModel * scaleModel;
if (m_animation) {
m_human->Update();
}
m_human->Draw(m_box.get(), m_program.get(), transform);
}
추가한 ImGui 기능
- 애니메이션 제어:
Animation
체크박스를 통해 애니메이션을 활성화하거나 비활성화할 수 있다.Reset
버튼을 눌러 사람 모델의 초기 상태로 되돌릴 수도 있다. - 각 파츠의 조정: 몸통, 머리, 팔, 다리 등 각 파츠에 대해 위치(
Translate
), 회전(Rotate
), 크기(Scale
), 사이즈(Size
), 색상(Color
)을 개별적으로 조정할 수 있다. 슬라이더를 통해 값을 변경하면 즉시 반영되기 때문에, 다양한 설정을 손쉽게 시도해볼 수 있다. - 계층적 구조 확인: ImGui를 통해 각 파츠의 변화를 실시간으로 조정하면서 부모-자식 관계를 반영한 계층적 구조를 눈으로 확인할 수 있다. 예를 들어, 팔의 크기를 조절하면 하위에 있는 팔뚝도 영향을 받는 모습을 쉽게 확인할 수 있다.
ImGui 적용 이유
이 기능을 추가한 주된 이유는 평가 시 사람 모델의 각 파츠가 계층적 구조에 따라 제대로 설정되었는지를 명확하게 보여주기 위해서였다. ImGui를 통해 실시간으로 조정하면서 구조와 동작을 시각적으로 검증할 수 있어 설명하는 데에 도움이 크게 될 것 같다.
이제 HumanGL의 필수적인 작업은 모두 마무리되었다! 평가를 마치고 나면 평가 후기를 작성할 수도 있겠지만, 일단 HumanGL에 대한 글은 여기서 마무리짓도록 하겠다.
'Computer Graphics > HumanGL' 카테고리의 다른 글
HumanGL - 6. Animation 적용 (0) | 2024.10.23 |
---|---|
HumanGL - 5. transform 행렬 계산식 변경 (0) | 2024.10.18 |
HumanGL - 4. 문제 발견 (0) | 2024.10.17 |
HumanGL - 3. 사람 그리기 (0) | 2024.10.17 |
HumanGL - 2. Scale 적용 해보기 (1) | 2024.10.17 |