ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
Built a 3D Batman Themed Portfolio ๐Ÿฆ‡๐ŸŽ๏ธ
Dev.toDev.to
Frontend

Built a 3D Batman Themed Portfolio ๐Ÿฆ‡๐ŸŽ๏ธ

๊ฐœ๋ฐœ์ž๊ฐ€ Three.js์™€ Vanilla JS๋กœ 3D ๋ฐฐํŠธ๋งจ ํ…Œ๋งˆ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๊ตฌ์ถ•ํ•ด ๋ชจ๋ฐ”์ผ์—์„œ 60FPS ์„ฑ๋Šฅ ๋‹ฌ์„ฑ

Sai Akshith Akshintala2026๋…„ 3์›” 25์ผ3๋ถ„intermediate

Context

๋Œ€๋ถ€๋ถ„์˜ ํฌํŠธํด๋ฆฌ์˜ค๋Š” ํ‰๋ฉด์  ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ œํ•œ์ ์ด๋‹ค. ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์„ฑ๋Šฅ์˜ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ 3D ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค.

Technical Solution

  • Three.js(WebGL) ๊ธฐ๋ฐ˜ 3D ์—”์ง„์œผ๋กœ ์ปค์Šคํ…€ Batmobile ๋ชจ๋ธ๊ณผ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์”ฌ ๊ตฌํ˜„
  • Vanilla JavaScript๋ฅผ ์‚ฌ์šฉํ•ด ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์†์„ฑ ์ œ๊ฑฐํ•˜๊ณ  Zero bloat ์œ ์ง€
  • lerp(์„ ํ˜• ๋ณด๊ฐ„) ํ•จ์ˆ˜๋กœ ์นด๋ฉ”๋ผ๋ฅผ ์„น์…˜ ๊ฐ„์— ์ ์ง„์ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ์นด๋ฉ”๋ผ ์Šค๋ฌด๋”ฉ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ์…ฐ์ด๋” ์ตœ์ ํ™”์™€ ํŒŒํ‹ฐํด ๊ฐœ์ˆ˜ ์ œํ•œ์œผ๋กœ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐฉ์ง€
  • ์‚ฌ์šฉ์ž์˜ ์Šคํฌ๋กค ๊นŠ์ด๋ฅผ 3D ์”ฌ์˜ ์†๋„(๊ฐ€์†๋„) ์ƒํƒœ์— ๋™๊ธฐํ™”ํ•˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ตฌํ˜„
  • Dark mode์™€ ๊ณ ๋ช…๋„ ๊ธˆ/ํŒŒ๋ž€์ƒ‰ ์กฐํ•ฉ, ์ ˆ์ฐจ์  ๊ธฐํ•˜ํ•™(procedural geometries)์œผ๋กœ Turbo ๋„ค๋น„๊ฒŒ์ด์…˜ ์‹œ๊ฐํ™”

Impact

๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ 60FPS ์„ฑ๋Šฅ ๋‹ฌ์„ฑ์œผ๋กœ ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋น„ ์ตœ์†Œํ™”

Key Takeaway

ํฌํŠธํด๋ฆฌ์˜ค์™€ ๊ฐ™์€ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ Three.js ๊ฐ™์€ 3D ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ €์ˆ˜์ค€ ์„ฑ๋Šฅ ์ตœ์ ํ™”(์…ฐ์ด๋” ์ตœ์ ํ™”, ์นด๋ฉ”๋ผ ์Šค๋ฌด๋”ฉ)๋ฅผ ์กฐํ•ฉํ•˜๋ฉด ๋ชจ๋ฐ”์ผ๊นŒ์ง€ ์•„์šฐ๋ฅด๋Š” ๊ณ ์„ฑ๋Šฅ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๊ฒฝํ—˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.


์›น ๊ธฐ๋ฐ˜ 3D ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ Three.js์—์„œ ์ ˆ์ฐจ์  ๊ธฐํ•˜ํ•™๊ณผ ํŒŒํ‹ฐํด ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ๋•Œ, ๋ Œ๋”๋ง ๊ฐœ์ˆ˜ ์ œํ•œ๊ณผ ์…ฐ์ด๋” ์ตœ์ ํ™”๋ฅผ ๋จผ์ € ์ ์šฉํ•˜๋ฉด ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ๋„ 60FPS๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ˜์‘ํ˜• ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

์›๋ฌธ ์ฝ๊ธฐ