Computer Graphics Project 3: Bvh Viewer
์ ์ถ ๊ธฐํ: 2025๋
6์ 6์ผ (23:59)
(๊ธฐํ ์ด๊ณผ ์ ์ถ์ ์ ์ ์์)
- LMS ์ฝ์ค ํ > Weekly Learning (์ฃผ์ฐจ๋ณ ํ์ต) > Week 11 > Project 3
- ํ์ผ์ zip์ผ๋ก ์์ถํ์ฌ ๋ค์๊ณผ ๊ฐ์ ํ์์ ํ์ผ๋ช
์ ์ฌ์ฉํ์ธ์.
- ํ์ผ๋ช ์ ์์ ๋กญ๊ฒ ์ง์ ํด๋ ๋ฉ๋๋ค.
submission.zip
โโ main.py
โโ ...
โโ report.pdf
- ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ ๊ฐ์ Python ์์ค ํ์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค.
ํ์ง๋งmain.py๊ฐ ๋ฉ์ธ ๋ชจ๋์ด์ด์ผ ํ๋ฉฐ, ์คํ ๋ช ๋ น์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
python3 main.py
1. ๊ตฌํ ๋ด์ฉ
์์ ๋ง์ bvh ๋ทฐ์ด๋ฅผ ๊ตฌํํ์ธ์.
๋จ์ผ ํ๋ก๊ทธ๋จ์์ ๋ชจ๋ ์๊ตฌ์ฌํญ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
์ด Project๋ ๋ณ๋์ ํ๋ก๊ทธ๋จ์ผ๋ก ์๊ตฌํ์ง ์์ต๋๋ค.์ฐฝ์ ํด์๋๋
(800, 800)์ผ ํ์๋ ์์ต๋๋ค.
์ธ๋ถ์ฌํญ์ด ์ ๋ณด์ด๋๋ก ์ถฉ๋ถํ ํฐ ํด์๋๋ฅผ ์ฌ์ฉํ์ธ์.
C. OpenGL 3.3 Core Profile์ ์ฌ์ฉํด์ผ ํฉ๋๋ค
- Python ์ฝ๋์ ๋ค์์ ๋ฐ๋์ ํฌํจํ์ธ์:
glfw.window_hint(GLFW_CONTEXT_VERSION_MAJOR, 3)
glfw.window_hint(GLFW_CONTEXT_VERSION_MINOR, 3)
glfw.window_hint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)
- ์์ด๋ ์ฝ๋์ ์ฒซ ์ค์ ๋ฐ๋์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค:
#version 330 core
- OpenGL 3.3 Core Profile์ ์ฌ์ฉํ์ง ์์ผ๋ฉด (์์ธ: ๋ฆฌํฌํธ๋ง ์ ์ถ ์) ์ด ํ๋ก์ ํธ์ ๋ํ ์ ์๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
2. Requirements
A. ์นด๋ฉ๋ผ ์กฐ์ (10์ )
- Project1์์ ๊ตฌํํ ๋ฐฉ์๋๋ก ์นด๋ฉ๋ผ๋ฅผ ์กฐ์ํ์ธ์.
- ๋ ํผ๋ฐ์ค ๊ทธ๋ฆฌ๋ ํ๋ฉด๋ ํจ๊ป ๊ทธ๋ฆฌ์ธ์.
B. bvh ํ์ผ ๋ถ๋ฌ์ค๊ธฐ ๋ฐ ๋ ๋๋ง (80์ )
๋ทฐ์ด ์ฐฝ์ bvh ํ์ผ์ ๋๋๊ทธ ์ค ๋๋กญํ๋ฉด ํ๋์ ํ์ผ๋ง ๋ก๋ฉ๋์ด์ผ ํฉ๋๋ค.
- ์ฌ๋ฌ ๊ฐ๋ฅผ ๋์์ ๋๋กญํด๋ ์ฒซ ๋ฒ์งธ ํ์ผ๋ง ๋ก๋๋์ด์ผ ํฉ๋๋ค.
bvh ํ์ผ์ ์ฝ๊ณ skeleton (์ ์ง ํฌ์ฆ)๋ง ๋ ๋๋งํ์ธ์ (10์ )
ํ์ผ์ ์ด ๋ ์บ๋ฆญํฐ๋ฅผ ์๋์ผ๋ก ์ ๋๋ฉ์ด์ ํ์ง ๋ง์ธ์.
- skeleton (์ ์ง ํฌ์ฆ)๋ง ๋ ๋๋งํ์ธ์.
HIERARCHY ์น์ ์ ๋ฐ์ดํฐ๋ง ์ฌ์ฉํด์ ์บ๋ฆญํฐ๋ฅผ ๊ทธ๋ฆฌ์ธ์.
- translation์
(0,0,0), rotation์ ์๋๋ก (๋จ์ ํ๋ ฌ)
- translation์
๋ฐ์ค ๋ ๋๋ง(box rendering) ์ฌ์ฉ
- ์ ์ด๋ ์ ์ด ์๋๋ผ ๋ฐ์ค๋ก ๋ ๋๋ง
- ์กฐ๋ช ์ Phong shading ์ฌ์ฉ
- "End Site" ๋งํฌ๋ ์ค์ ๊ด์ ์ด ์๋๋ฏ๋ก ๋ฌด์ํ์ธ์
์์ ์ด๋ฏธ์ง๋ก๋
sample-walk.bvh์ ์ ์ง ํฌ์ฆ๊ฐ ์ ๊ณต๋ฉ๋๋ค.
iii. ์คํ์ด์ค๋ฐ๋ก ์ ๋๋ฉ์ด์ (30์ )
์คํ์ด์ค๋ฐ๋ฅผ ๋๋ฅด๋ฉด ๋ชจ์ ์ ์ฌ์ํ์ธ์.
- ๊ฐ ํ๋ ์์ด ์ง๋๊ฐ ๋๋ง๋ค ๋ค์ ํฌ์ฆ๋ฅผ ๋ฐ์ค๋ก ํ์
- ๋ฃจํ๋ง๋ค ํ๋ ์์ ํ๋์ฉ๋ง ์งํ
- ๋ง์ง๋ง ํ๋ ์์ด ์ง๋๋ฉด ๋ค์ ์ฒซ ํ๋ ์๋ถํฐ ๋ฐ๋ณต
- ๋ฐ์ค ๋ ๋๋ง ์ ์ง
iv. bvh ํ์ผ ๋ก๋ ์ stdout(์ฝ์)์ ๋ค์ ์ ๋ณด ์ถ๋ ฅ (10์ )
- ํ์ผ ์ด๋ฆ
- ํ๋ ์ ์
- FPS (1/frameTime)
- ๊ด์ ์ (root ํฌํจ)
- ๋ชจ๋ ๊ด์ ์ด๋ฆ ๋ฆฌ์คํธ
C. OBJ ๋ ๋๋ง ๋ชจ๋ ์ ๊ณต (30์ )
Tํค๋ฅผ ๋๋ฅด๋ฉด OBJ ๋ ๋๋ง ๋ชจ๋ ์ง์๊ฐ ๋งํฌ๋ ๋ณ๋์ OBJ ํ์ผ๋ก๋ถํฐ ๋ฉ์ฌ๋ก ๋ ๋๋ง
- ๋์ผํ OBJ ํ์ผ์ ๋ฐ๋ณต ์ฌ์ฉํ๋ฉด ์๋จ
Tํค๊ฐ ๋๋ ธ์ ๋:- ๋ฏธ๋ฆฌ ์ ์๋ BVH ํ์ผ (์:
run.bvh)์ ๋ถ๋ฌ์ค๊ณ - ๊ฐ ๋งํฌ์ ํด๋นํ๋ OBJ ํ์ผ๋ก ๋ ๋๋ง
- ๋งํฌ ์ด๋ฆ๊ณผ ๊ณ์ธต ๊ตฌ์กฐ๋ BVH๋ง๋ค ๋ค๋ฅผ ์ ์์
- ๋ฏธ๋ฆฌ ์ ์๋ BVH ํ์ผ (์:
.bvh์.objํ์ผ์ Python ์์ค์ ๊ฐ์ ํด๋์ ๋์ธ์os.path.join()์ฌ์ฉ ๊ถ์ฅ
# ์ฌ๋ฐ๋ฅธ ๋ฐฉ์
file = open(os.path.join('data', 'run.bvh'))
- OBJ ๋ฉ์ฌ๋ ์กฐ๋ช ์ Phong shading ์ฌ์ฉ
3. Report (15์ )
- ์ต๋ 2ํ์ด์ง ๋ถ๋์ docx ํ์ ๋ฌธ์ ์ ์ถ
B. ๋ฆฌํฌํธ์ ํฌํจํ ๊ฒ
- ๊ตฌํํ ์๊ตฌ์ฌํญ ๋ช ์ (5์ )
- ๋น๋์ค ๋งํฌ ์ฒจ๋ถ (10์ )
์ ํ๋ธ, Vimeo ๋ฑ
์ ๋๋ฉ์ด์ ๋๋ skeleton ๋ชจ๋ธ์ ์บก์ฒํ ์์
๋ค์ ์ฌ์ดํธ๋ค์์ bvh ํ์ผ ๋ค์ด๋ก๋ ๊ฐ๋ฅ:
- http://motion.hahasoha.net/
- http://mocap.cs.sfu.ca/
- http://dancebci.eu/main/performances
**์์ ํ์ผ(sample bvh)**์ ์ด ํญ๋ชฉ์์ ์ฌ์ฉ ๋ถ๊ฐ
์์์ ๊ณต๊ฐ ์ ๊ทผ ๊ฐ๋ฅํด์ผ ์ ์ ๋ถ์ฌ
- ๋ฆฌํฌํธ๋ ๊ฐ๊ฒฐํ๊ฒ ์์ฑ (์์ด ๋๋ ํ๊ตญ์ด)
4. ์คํ ํ๊ฒฝ
Python 3.8์์ ์คํ ๊ฐ๋ฅํด์ผ ํ๋ฉฐ,
์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋์ ๋ค์์ผ๋ก ์ ํ๋จ:- NumPy
- PyOpenGL
- glfw
- PyGLM
๊ธฐํ Python ๋ชจ๋ ์ฌ์ฉ ๋ถ๊ฐ
glfw๋ง ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐ OpenGL context ์ฉ๋๋ก ์ฌ์ฉ
์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฉด TA PC์์ ์คํ๋์ง ์์ผ๋ฏ๋ก
๋ฆฌํฌํธ๋ฅผ ์ ์ธํ ๋ชจ๋ ์ ์๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
5. ํ ์คํธ์ฉ ํ์ผ
sample-walk.bvh: ๊ฑท๋ ๋ชจ์ sample-spin.bvh: ์์ง์ถ ์ค์ฌ ํ์
6. ์ ์ถ๋ฌผ ๋ชฉ๋ก (์์ถ๋ zip ํ์ผ)
.pyํ์ผ (main.py ํฌํจ).pdf๋ฆฌํฌํธ.bvh,.objํ์ผ (OBJ ๋ ๋๋ง์ฉ).pdf๋ฆฌํฌํธ
7. ์ถ๊ฐ ์ ๋ณด
A. drop_callback ํจ์ ์ฃผ์์ฌํญ
glfwPython ๋ฐ์ธ๋ฉ์์๋ C ๋ฒ์ ๊ณผ ๋ค๋ฅด๊ฒdrop_callback(window, paths)๋ก๋ง ํธ์ถ๋จ
(paths๋ ํ์ผ ๊ฒฝ๋ก ๋ฆฌ์คํธ)
B. ๋ฌธ์์ด ์ฒ๋ฆฌ ํ
- Python์
split()๋ฑ ๋ฌธ์์ด ์ฒ๋ฆฌ ํจ์๋
bvh ํ์ฑ ์ ๋งค์ฐ ์ ์ฉํจ

