humangl 8

HumanGL - 7. ImGui 추가

이번에는 ImGui를 이용해 사람 모델의 각 파츠를 실시간으로 조정할 수 있는 인터페이스를 추가했다. 이제 각 파츠의 계층적 구조를 더 직관적으로 확인할 수 있게 되었고, 다양한 조정이 가능해졌다. ImGui 추가하기렌더링 함수에 ImGui를 추가하면서, 사람 모델의 각 파츠의 변형 값을 실시간으로 조정할 수 있도록 했다. Context::Render() 함수에서 ImGui 위젯을 사용해 각 파츠의 스케일, 색상, 회전 등을 다룰 수 있는 슬라이더와 버튼을 배치했다.void Context::Render() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); // ImGui 인터페이스 추가 if ..

HumanGL - 6. Animation 적용

이제 사람 모델에 애니메이션 기능을 적용했다. 각 파트의 움직임에 맞춰 회전 축(피벗)을 설정하고, 애니메이션 동작을 적용한 것이 주요 변경 사항이다.피벗 설정 및 Transform 계산 변경사람의 몸을 그리는 과정에서 파츠마다 회전할 때 피벗 위치가 달라야 했다. 그래서 각 파트에 맞는 회전 중심을 계산해 적용했다.DrawNode 함수 변경void Human::DrawNode(const Node& node, const Mesh* mesh, const Program* program, const sglm::mat4& transform) { sglm::vec3 rotationPivot; if (node.part->name == "body") { rotationPivot = sglm::..

HumanGL - 5. transform 행렬 계산식 변경

전에 발견한 문제를 해결하기 위해 transform 행렬 계산식을 수정했다. 이전 방식에서는 스케일이 translate에 영향을 주어 직관적이지 않았고, 이를 독립적으로 계산하려 했던 것이 문제의 원인이었다.문제 원인 분석기존에는 transform 계산식을 다음과 같이 적용했다:transform = projection * view * modelmodel = translate * rotate * scale그런데 상속을 받을 때, 스케일을 translate과 독립적으로 적용하려다 보니 다음과 같은 방식으로 계산했다:model = 부모 translate * 자식 translate * 부모 rotate * 자식 rotate * 부모 scale * 자식 scale이 방식으로는 부모와 자식의 좌표계가 서로 독립적으..

HumanGL - 4. 문제 발견

사람을 그리고 테스트하자마자 문제가 발생했다. static float scale = 1.0f;static float dir = 0.01f;scale += dir;if (scale >= 2.0f) dir = -0.01f;if (scale 렌더링될 때마다 스케일을 변하게 해줬는데, 영상에서 볼 수 있듯이 각각의 오브젝트가 동시에 커졌다. 자세히 살펴보면 위치는 고정된 상태로 크기만 변하는 걸 확인할 수 있다.이 현상이 꽤 이상해서 돌려봤는데...sglm::mat4 rotateModel = sglm::mat4(1.0f);static float angle = 0.0f;angle += 1.0f;if (angle >= 360.0f) angle = 0.0f;rotateModel = sglm::rotate(..

HumanGL - 3. 사람 그리기

이제 상자의 스케일을 조정하고, 몸의 각 파트를 계층적으로 나누어 사람을 그려주었다. 하위 단계의 값들은 상위 단계의 값을 계승하며, 각 파트는 부모의 상대 좌표를 기반으로 계산된다. 이렇게 계층 구조로 설정된 방식은 게임 엔진의 트리 구조와 비슷하게 동작한다.Human 초기화먼저 사람의 각 신체 부위를 초기화하는 작업부터 시작했다. 몸통을 중심으로 머리, 팔, 다리 등 모든 부위를 트리 구조로 정리해주었다. 각 파트는 위치(translate), 회전(rotate), 크기(scale), 색상(color) 정보를 가지며, 이 값들은 계층적으로 상위 값을 계승한다.void Human::Init() { m_body = {sglm::vec3(0.0f, 0.0f, 0.0f), sglm::vec3(0.0f, ..

HumanGL - 2. Scale 적용 해보기

사람을 그리기 전에 먼저 해야 할 일이 있다. 바로 상자를 늘리고 줄이는 작업이다! 이를 위해 sglm에 scale 함수를 추가하고, 이를 적용해 보았다.sglm::mat4 scale(const sglm::mat4& m, const sglm::vec3& v) { sglm::mat4 result(1.0f); result[0][0] = v.x; result[1][1] = v.y; result[2][2] = v.z; return result * m;}위와 같은 방식으로 scale 함수를 구현했고, 이를 적용해 모델의 크기를 조정했다.model = sglm::scale(model, sglm::vec3(1.0f, 1.2f, 0.5f));   아주 잘 동작한다. 이 상자는 이제 바디가 될..

HumanGL - 1. 초기 설정, 상자 띄우기

https://github.com/ksro0128/OpenglTuto GitHub - ksro0128/OpenglTutoContribute to ksro0128/OpenglTuto development by creating an account on GitHub.github.com기존에 OpenGL을 공부하던 코드를 가져와 과제에 맞게 초기 설정을 해주었다. 이번 과제에서는 텍스처 적용을 하지 않을 계획이라 불필요한 라이브러리들을 제거했다. assimp, stb, glm과 같은 라이브러리를 모두 날리고, 상자만 띄우는 데 집중했다.필요 없는 요소들을 정리하고 상자만 띄운 모습은 다음과 같다.  SCOP 과제에서 사용하던 sglm 라이브러리를 그대로 썼는데, 여기서 문제가 생겼다. 바로 lookat 계산식에..

HumanGL - 0. 과제 해석

이번 HumanGL 과제는 OpenGL을 사용하여 계층적 모델링과 매트릭스 스택 조작을 학습하기 위한 중요한 프로젝트이다. 특히, 이 과제는 OpenGL 4.0 이상의 버전을 사용하여 자체 매트릭스 연산을 구현하는 것을 요구하며, 기본적인 GPU 렌더링과 모델 애니메이션의 개념을 깊이 있게 탐구하도록 설계되었다. 과제의 주요 내용과 세부 사항은 다음과 같다.프로젝트 개요목적:이 프로젝트의 궁극적인 목표는 OpenGL을 사용하여 각기 다른 신체 부위들이 논리적으로 연결되고, 매트릭스 스택을 통해 함께 움직이도록 구현하는 것이다. 이를 통해 각각의 부위는 독립적으로 조작될 수 있으며, 상호 간에 적절히 연결된 애니메이션을 만들어 낼 수 있다. 각 부위의 크기나 위치를 수정할 때 관련된 다른 부위들도 자동으로..