• Mindscape ๐Ÿ”ฅ
    • Playlist ๐ŸŽง
  • Algorithm

    • 1018๋ฒˆ: ์ฒด์ŠคํŒ ๋‹ค์‹œ ์น ํ•˜๊ธฐ
    • 1966๋ฒˆ: ํ”„๋ฆฐํ„ฐ ํ
    • Python ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ํŒ
    • C++ std::vector ์‚ฌ์šฉ๋ฒ• ์ •๋ฆฌ
    • Vim ์‚ฌ์šฉ ๋งค๋‰ด์–ผ
  • Ubuntu

    • ๋ฆฌ๋ˆ…์Šค ์šฐ๋ถ„ํˆฌ GRUB ํฐํŠธ ๋ณ€๊ฒฝ
    • ์šฐ๋ถ„ํˆฌ ์ด๋ฏธ์ง€ ๋น„๋””์˜ค ์ธ๋„ค์ผ(๋ฏธ๋ฆฌ๋ณด๊ธฐ) ์•ˆ ๋ณด์ž„ ๋ฌธ์ œ ํ•ด๊ฒฐ
    • Wine ํ™˜๊ฒฝ์—์„œ ์นด์นด์˜คํ†ก ์‹คํ–‰ ์‹œ explorer.exe ๋œจ์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๋ฒ•
    • ์šฐ๋ถ„ํˆฌ Wine ์นด์นด์˜คํ†ก ์‚ฌ์ง„ ์ด๋ฏธ์ง€ ์Šคํฌ๋ฆฐ์ƒท ๋ถ™์—ฌ๋„ฃ๊ธฐ
    • Wine ์นด์นด์˜คํ†ก ์ด๋ชจ์ง€ ๊นจ์ง ๋ฌธ์ œ ํ•ด๊ฒฐ
    • Ubuntu ์œˆ๋„์šฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋„๊ธฐ
  • Wellness

    • ์ฐจ์ „์žํ”ผ (Psyllium Husk)
    • ์—‘์ŠคํŠธ๋ผ ๋ฒ„์ง„ ์˜ฌ๋ฆฌ๋ธŒ์œ  (Extra Virgin Olive Oil)
    • ์ž๊ฐ€๋น„๊ฐ•์„ธ์ฒ™ (Nasal Irrigation)
    • QCY HT08 (MeloBuds Pro Plus)
    • ์ฝ˜์„œํƒ€ (Concerta)
    • ์ธ๋ฐ๋†€ (Inderal)
    • ์„คํŠธ๋ž„๋ฆฐ (Sertraline)
    • ๋ฉœ๋ผํ† ๋‹Œ (Melatonin)
    • ์น˜๊ฒฝ๋ถ€ ๋งˆ๋ชจ์ฆ
    • ๋ฐ”๋ฒจ ์Šค์ฟผํŠธ (Barbell Squat)
  • Humanities

    • Nordvik, Russia
    • North Sentinel Island
    • ๋กฑ๊ณ ๋กฑ๊ณ (Rongorongo)
    • ๋ฐ”๋กœํฌ ์Œ์•… (Baroque Music)
  • Design

    • ๊ตฌ๊ธ€์˜ ์•„์ด์ฝ˜ ๋Œ€๊ฐœํŽธ โ€” 6๋…„ ๋งŒ์˜ ์‹ค์ˆ˜ ์ธ์ •
    • ์ œ๋Ÿด๋“œ ์  ํƒ€ โ€” ๋Ÿญ์…”๋ฆฌ ์Šคํฌ์ธ  ์›Œ์น˜์˜ ์ฐฝ์‹œ์ž
    • ๋ฐ”์šฐํ•˜์šฐ์Šค โ€” ํ˜„๋Œ€ ๋””์ž์ธ์˜ ์›์ 
  • Brands

    • NOMOS Glashรผtte
    • Frรฉdรฉrique Constant
    • KZ (Knowledge Zenith)
    • ์—์ŠคํŠธ๋ผ (AESTURA)
    • JINHAO (้‡‘่ฑช)
    • Herman Miller
    • ๋ฐ์Šค์ปค (DESKER)
    • ๋ฌด์‹ ์‚ฌ ์Šคํƒ ๋‹ค๋“œ (Musinsa Standard)
  • Finance

    • ํ˜„๋Œ€์นด๋“œ ZERO โ€” Edition2 vs Edition3 ๋น„๊ต
    • ์‹ ํ•œ์นด๋“œ ์ฒ˜์Œ
    • S&P 500 ETF ํˆฌ์ž ๊ฐ€์ด๋“œ
    • ํŒŒํ‚นํ†ต์žฅ vs CMA ํ†ต์žฅ
    • ๋ฒ„ํฌ์…” ํ•ด์„œ์›จ์ด (Berkshire Hathaway)
    • ๋น„ํŠธ์ฝ”์ธ(Bitcoin)
  • Products

    • ์˜ค๋””์˜ค ์ธํ„ฐํŽ˜์ด์Šค (Audio Interface)
    • ์ฟ ๋ฃจํ† ๊ฐ€ (KURUTOGA)
    • CX31993 DAC ๋™๊ธ€
    • ํด๋ Œ์ง• ๋ฐ€ํฌ (Cleansing Milk)
    • ํ”ผ์ ฏ ํ† ์ด (Fidget Toy)
    • ThinkPad
  • Programming Languages

    • 8.0. Statement Level Control Structures
    • 8. Subprogram
    • 9. Implementing Subprogram
    • 10.1. Abstract Data Types and Encapsulation Constructs
    • 10.2. Support for Object Oriented Programming
    • 11. Concurrency
    • 12. FPL (1)
    • 13. FPL (2)
    • 14. Exception Handling and Event Handling
    • Final Exam

Computer Graphics Project 2: Obj viewer

์ž‘์„ฑ 2026. 6. 12.ยท์ˆ˜์ • 2026. 6. 12.

Handed out: April 24, 2025
Due: 2025๋…„ 5์›” 14์ผ 23:59 (๊ธฐํ•œ ์ดˆ๊ณผ ์ œ์ถœ์€ 0์  ์ฒ˜๋ฆฌ๋จ)


  • LMS ๊ฐ•์˜์‹ค > ์ฃผ์ฐจํ•™์Šต > 8์ฃผ์ฐจ > Project 2
  • ์ œ์ถœ ํŒŒ์ผ์€ ์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด zip ํŒŒ์ผ๋กœ ์••์ถ•ํ•˜์„ธ์š”. zip ํŒŒ์ผ ์ด๋ฆ„์€ ์ž์œ ๋กญ๊ฒŒ ์ง€์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ: submission.zip
      • main.py
      • ...
      • report.pdf
  • ํ”„๋กœ๊ทธ๋žจ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Python ์†Œ์Šค ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋‚˜, ์ง„์ž…์ ์€ ๋ฐ˜๋“œ์‹œ main.py ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
python main.py

1. ๊ณผ์ œ ๋ชฉํ‘œ: ์—ฌ๋Ÿฌ ๊ฐœ์˜ obj ๋ฉ”์‰ฌ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” obj ํŒŒ์ผ ๋ทฐ์–ด ๊ตฌํ˜„

  • ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ชจ๋“  ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ณ„๋„์˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ตฌํ˜„ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • ์ฐฝ ํฌ๊ธฐ๋Š” (800, 800)์ผ ํ•„์š”๋Š” ์—†์œผ๋ฉฐ, ๋ฉ”์‰ฌ๊ฐ€ ์ž˜ ๋ณด์ผ ์ •๋„๋กœ ์ถฉ๋ถ„ํžˆ ํฌ๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • OpenGL 3.3 Core Profile์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ๋‹ค์Œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
    • Python ์ฝ”๋“œ์— ๋‹ค์Œ ์„ค์ • ํฌํ•จ
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3)
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)
  • ์…ฐ์ด๋” ์ฝ”๋“œ์˜ ์ฒซ ์ค„:
#version 330 core
  • ์œ„ ์กฐ๊ฑด์„ ์ง€ํ‚ค์ง€ ์•Š์œผ๋ฉด, ๋ฆฌํฌํŠธ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์— ์ ์ˆ˜๊ฐ€ ๋ถ€์—ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ : 110์ 

2. ๊ตฌํ˜„ ์š”๊ตฌ์‚ฌํ•ญ

A. ์นด๋ฉ”๋ผ ์กฐ์ž‘ (10์ )

  • Project 1์—์„œ ์‚ฌ์šฉํ•œ ์นด๋ฉ”๋ผ ์กฐ์ž‘ ๋ฐฉ์‹ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ

B. obj ํŒŒ์ผ ๋กœ๋”ฉ ๋ฐ ๋ Œ๋”๋ง (์ด 70์ )

  • Drag & Drop ๊ธฐ๋Šฅ ๊ตฌํ˜„ (ํ•„์ˆ˜)

    • glfw์˜ glfwSetDropCallback ์‚ฌ์šฉ
    • ์ฐธ๊ณ : drop_callback ๋ฌธ์„œ
    • ์ด ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์œผ๋ฉด โ€œLoad and render multiple obj filesโ€์— ๋Œ€ํ•œ ์ ์ˆ˜ ์—†์Œ
  • ํŒŒ์ผ ๋กœ๋“œ ํ›„ ๋‹ค์Œ ์ •๋ณด ์ถœ๋ ฅ (10์ )

    • ํŒŒ์ผ ์ด๋ฆ„
    • ์ด face ๊ฐœ์ˆ˜
    • ์ •์  3๊ฐœ์ธ face ๊ฐœ์ˆ˜
    • ์ •์  4๊ฐœ์ธ face ๊ฐœ์ˆ˜
    • ์ •์  4๊ฐœ ์ดˆ๊ณผ์ธ face ๊ฐœ์ˆ˜
  • ํŒŒ์ผ ํŒŒ์‹ฑ ๋ฐ ๋ฉ”์‰ฌ ๋ Œ๋”๋ง (40์ )

    • vertex position, vertex normal, face ์ •๋ณด๋งŒ ํŒŒ์‹ฑ
    • vt, mtllib, usemtl, o, s ํƒœ๊ทธ๋Š” ๋ฌด์‹œ
    • ๋‹ค์Œ obj ํŒŒ์ผ๋“ค์„ ๋ฌธ์ œ์—†์ด ๋กœ๋”ฉ ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ:
      • cube-tri.obj
      • sphere-tri.obj
      • cylinder-tri.obj
  • ๋‹ค์ค‘ obj ํŒŒ์ผ ์ง€์› (10์ )

    • ์ด๋ฏธ ๋ Œ๋”๋ง ์ค‘์ธ A.obj์— ๋Œ€ํ•ด, B.obj๋ฅผ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญํ•˜๋ฉด X์ถ• +2 ๋‹จ์œ„๋กœ ๋–จ์–ด์ง„ ์œ„์น˜์— ๋ฐฐ์น˜
      • ์˜ˆ: x ์œ„์น˜ 0 โ†’ 2 โ†’ 4 โ†’ ...
  • ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ polygon ์ง€์› (10์ )

    • ์‚ผ๊ฐํ˜•, ์‚ฌ๊ฐํ˜•, 4๊ฐœ ์ดˆ๊ณผ ์ •์  polygon ํ˜ผํ•ฉ๋œ ๊ฒฝ์šฐ ๋ Œ๋”๋ง ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ
    • glDrawArrays() ๋˜๋Š” glDrawElements() ์‚ฌ์šฉ
    • ๋ฐ˜๋“œ์‹œ triangulation ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ ํ•„์š”
    • ๋‹ค์Œ ํŒŒ์ผ๋“ค์ด ๋กœ๋”ฉ ๋ฐ ๋ Œ๋”๋ง ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ:
      • cube-tri-quad.obj
      • sphere-tri-quad.obj
      • cylinder-tri-quad-n.obj

C. ์กฐ๋ช… ๋ฐ ๊ธฐํƒ€ ํšจ๊ณผ (20์ )

  • Phong Illumination + Phong Shading ๊ตฌํ˜„ ํ•„์ˆ˜
    • ์กฐ๋ช… ๋ฐ ์žฌ์งˆ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ž์œ ๋กญ๊ฒŒ ์„ ํƒ

3. ๋ฆฌํฌํŠธ ์ œ์ถœ (10์ )

  • ์ตœ๋Œ€ 2ํŽ˜์ด์ง€์˜ pdf ํ˜•์‹
  • Word๋กœ ์ž‘์„ฑ ๊ถŒ์žฅ
  • ๋ฐ˜๋“œ์‹œ ์•„๋ž˜ ๋‚ด์šฉ ํฌํ•จ:
    • ๊ตฌํ˜„ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ๋ชฉ๋ก (5์ )
    • ์ƒ˜ํ”Œ obj ํŒŒ์ผ์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž obj ํŒŒ์ผ๋กœ ๋ Œ๋”๋งํ•œ ๊ฒฐ๊ณผ ์Šคํฌ๋ฆฐ์ƒท ๋ช‡ ์žฅ (5์ )

๊ธธ๊ฒŒ ์ž‘์„ฑํ•  ํ•„์š” ์—†์Œ. ์œ„ ํ•ญ๋ชฉ๋งŒ ๊ฐ„๋‹จํžˆ ์ž‘์„ฑํ•˜๋ฉด ๋จ. ํ•œ๊ตญ์–ด/์˜์–ด ๋ชจ๋‘ ํ—ˆ์šฉ.

4. ์‹คํ–‰ ํ™˜๊ฒฝ

  • Python 3.8 ํ™˜๊ฒฝ์—์„œ ๋‹ค์Œ ํŒจํ‚ค์ง€๋งŒ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•จ:
    • NumPy, PyOpenGL, glfw, PyGLM
  • ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐ OpenGL context๋Š” ๋ฐ˜๋“œ์‹œ glfw๋งŒ ์‚ฌ์šฉ
  • glut ์‚ฌ์šฉ ๊ธˆ์ง€
  • ์ด ์กฐ๊ฑด์„ ์ง€ํ‚ค์ง€ ์•Š์œผ๋ฉด ๋ฆฌํฌํŠธ๋ฅผ ์ œ์™ธํ•œ ์ฑ„์  ๋ถˆ๊ฐ€

5. ์ œ์ถœํ•  ํ•ญ๋ชฉ

  • zip ํŒŒ์ผ ์•ˆ์— ํฌํ•จ๋˜์–ด์•ผ ํ•  ํ•ญ๋ชฉ:
    • .py ํŒŒ์ผ๋“ค (์ง„์ž…์ ์€ main.py)
    • .pdf ๋ฆฌํฌํŠธ ํŒŒ์ผ

6. ์ƒ˜ํ”Œ obj ํŒŒ์ผ ์„ค๋ช…

ํŒŒ์ผ๋ช…์„ค๋ช…
cube-tri.obj์‚ผ๊ฐํ˜•๋งŒ ํฌํ•จ๋œ ํ๋ธŒ
cube-tri-quad.obj์‚ผ๊ฐํ˜• + ์‚ฌ๊ฐํ˜• ํฌํ•จ ํ๋ธŒ
sphere-tri.obj์‚ผ๊ฐํ˜•๋งŒ ํฌํ•จ๋œ ๊ตฌ
sphere-tri-quad.obj์‚ผ๊ฐํ˜• + ์‚ฌ๊ฐํ˜• ํฌํ•จ ๊ตฌ
cylinder-tri.obj์‚ผ๊ฐํ˜•๋งŒ ํฌํ•จ๋œ ์›๊ธฐ๋‘ฅ
cylinder-tri-quad-n.obj์‚ผ๊ฐํ˜•, ์‚ฌ๊ฐํ˜•, ๊ทธ ์™ธ polygon ํฌํ•จ ์›๊ธฐ๋‘ฅ

7. ์ถ”๊ฐ€ ์ฐธ๊ณ  ์‚ฌํ•ญ

  • Python์šฉ glfw์—์„œ drop_callback์€ ์ธ์ž๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค:
def drop_callback(window, paths):  # paths๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ
  • obj ํฌ๋งท ์ฐธ๊ณ : Wavefront .obj ํŒŒ์ผ ํฌ๋งท ์œ„ํ‚ค๋ฐฑ๊ณผ
  • Python์˜ ๋ฌธ์ž์—ด ๋ฉ”์„œ๋“œ ์ค‘ split()์ด ํŒŒ์‹ฑ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

GLFW ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ & ํ”„๋กœ์ ํŠธ ์ฑ„์  ๊ด€๋ จ ๊ณต์ง€

GLFW์—์„œ, ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ์ ์— modifiers (ctrl, alt, shift)์˜ ๋ˆŒ๋ฆฐ ์ƒํƒœ ํ™•์ธ์€ mouse button callback ํ•จ์ˆ˜์˜ mods ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ํ•˜๊ฑฐ๋‚˜, glfwGetKey ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•ด์„œ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

key callback ํ•จ์ˆ˜์˜ mods ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด modifier ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ํ‚ค ์ž…๋ ฅ์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ modifier์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. modifier key๋งŒ ์ž…๋ ฅํ•  ๋•Œ key callback์˜ mods ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด mods ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์—…๋ฐ์ดํŠธ ์‹œ์ ์ด ์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฑ„์  ์šด์˜์ฒด์ œ (ubuntu)์—์„œ์˜ ๋™์ž‘์ด ์—ฌ๋Ÿฌ๋ถ„์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ์šด์˜์ฒด์ œ์—์„œ์˜ ๋™์ž‘๊ณผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ 1์˜ ์„ฑ์ ๊ณผ ๋Œ“๊ธ€์„ ํ™•์ธํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ์œ„ ๋ฌธ์ œ๋กœ ์ธํ•ด ๊ฐ์ ์„ ๋ฐ›์€ ๊ฒฝ์šฐ, ์•„๋ž˜ ์ด๋ฉ”์ผ๋กœ ๊ฐœ๋ณ„์ ์œผ๋กœ ์—ฐ๋ฝํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค: [email protected]
์ด ์˜ˆ์™ธ์‚ฌํ•ญ์€ ํ”„๋กœ์ ํŠธ 1์— ํ•œํ•ด์„œ๋งŒ ์ธ์ •๋˜๋ฉฐ, ํ”„๋กœ์ ํŠธ 2๋ถ€ํ„ฐ๋Š” ๋™์ผํ•œ ์‚ฌ๋ก€๋ฅผ ์˜ค๋ฅ˜๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ๊ฐ์  ์ฒ˜๋ฆฌํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์‚ฌํ•ญ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์˜๋Š” Project 2 ์ œ์ถœ ๋งˆ๊ฐ ์ „ ๊นŒ์ง€๋งŒ ๋ฐ›๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ ์ˆ˜์ •: 26. 6. 12. ์˜คํ›„ 3:28
Contributors: kmbzn, Claude Sonnet 4.6

BUILT WITH

CloudflareNode.jsGitHubGitVue.jsJavaScriptVSCodenpm

All trademarks and logos are property of their respective owners.
ยฉ 2026 kmbzn ยท MIT License