Pixi.js: ์‹ค์ œ SVG ์ง€์›

์— ๋งŒ๋“  2017๋…„ 06์›” 29์ผ  ยท  30์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pixijs/pixi.js

Pixi๊ฐ€ SVG์˜ ๊ทธ๋ž˜ํ”ฝ ๊ณ„์ธต ํ‘œํ˜„์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํ˜„์žฌ์™€ ๊ฐ™์€ ํ…์Šค์ฒ˜๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ).

@psyrendust ^ ์•ˆ๋…•ํ•˜์„ธ์š”, Pixi๋กœ ๋งŒ๋“  ๊ฒƒ์„ ํ™๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? :๋””

Stale ๐Ÿ™ Feature Request

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ์ด๊ฒƒ์ด webpack์„ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฒƒ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
https://github.com/blunt1337/pixi-svg-loader

๋ชจ๋“  30 ๋Œ“๊ธ€

๋‚ด๊ฐ€ ๋งŒ๋“ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/bigtimebuddy/pixi-svg
https://bigtimebuddy.github.io/pixi-svg/example/

Pixi์—์„œ ๊ทธ๋ฆฌ๊ธฐ์˜ ์ œํ•œ์œผ๋กœ ์ธํ•ด ๋ชจ๋“  svg ๊ธฐ๋Šฅ์ด ์ง€์›๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@trusktr ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฃน์„ ์ปจํ…Œ์ด๋„ˆ๋กœ, ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ์„ธํŠธ๋ฅผ ์Šคํ”„๋ผ์ดํŠธ๋กœ ๊ฐ–๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…์Šค์ฒ˜ ์•„ํ‹€๋ผ์Šค๋ฅผ ๋งŒ๋“ค๊ณ  SVG์—์„œ ๋ณ€ํ™˜ ๋ฐ ํšŒ์ „์„ ์‚ฌ์šฉํ•˜์—ฌ Sprite์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ์•ต์ปค์ž…๋‹ˆ๋‹ค(๋ฌด์–ธ๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ). ์˜ˆ๋ฅผ ๋“ค์–ด Inkscape๋Š” ์•ต์ปค๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ ํ‘œ์ค€ afaik์—๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์˜ ์˜ˆ:

2017-07-01 08_56_56-_new document 1 - inkscape

์„ธ ๊ฒฝ๋กœ ๊ทธ๋ฃน์˜ ์•ต์ปค(ํŒŒ๋ž€์ƒ‰ ์‚ฌ๊ฐํ˜•์˜ ์™ผ์ชฝ ์ƒ๋‹จ)๋Š” inkscape:transform-center-x ๋ฐ inkscape:transform-center-y ๋ฉ๋‹ˆ๋‹ค.

    <g
       id="g4512"
       inkscape:transform-center-x="-65.892627"
       inkscape:transform-center-y="43.567609"
       transform="rotate(-5.9407468,27.740957,88.735118)">
      <path
         inkscape:connector-curvature="0"
         id="rect4485"
         d="m 24.502618,78.898505 h 50.619309 c 3.986749,0 7.196297,3.209548 7.196297,7.196296 v 70.274069 c 0,3.98675 -3.209548,7.1963 -7.196297,7.1963 H 24.502618 c -3.986748,0 -7.196296,-3.20955 -7.196296,-7.1963 V 86.094801 c 0,-3.986748 3.209548,-7.196296 7.196296,-7.196296 z"
         style="opacity:1;fill:#005e92;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
      <path
         inkscape:connector-curvature="0"
         id="rect4485-4"
         d="m 66.160572,123.8869 h 50.619318 c 3.98675,0 7.1963,3.20955 7.1963,7.1963 v 70.27406 c 0,3.98675 -3.20955,7.19631 -7.1963,7.19631 H 66.160572 c -3.986734,0 -7.196284,-3.20956 -7.196284,-7.19631 V 131.0832 c 0,-3.98675 3.20955,-7.1963 7.196284,-7.1963 z"
         style="opacity:1;fill:#920000;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
      <path
         inkscape:connector-curvature="0"
         id="rect4485-3"
         d="m 106.60403,73.994048 h 50.61931 c 3.98675,0 7.1963,3.209548 7.1963,7.196296 v 70.274066 c 0,3.98675 -3.20955,7.19631 -7.1963,7.19631 h -50.61931 c -3.98675,0 -7.196288,-3.20956 -7.196288,-7.19631 V 81.190344 c 0,-3.986748 3.209538,-7.196296 7.196288,-7.196296 z"
         style="opacity:1;fill:#009228;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke" />
    </g>

@bigtimebuddy ์˜ ๋…ธ๋ ฅ์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ

์ด๊ฒƒ๋„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค:
https://css-tricks.com/rendering-svg-paths-in-webgl/

๋‚˜๋Š” ์ด๊ฒƒ์ด webpack์„ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฒƒ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
https://github.com/blunt1337/pixi-svg-loader

@OSUblake ์ฟจ, ์‹ค์ œ๋กœ ๋‚ด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘

@bigtimebuddy ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ๊ฑฐ๊ธฐ์—์„œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด Pixi ์žฅ๋ฉด ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@RanzQ

@trusktr ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฃน์„ ์ปจํ…Œ์ด๋„ˆ๋กœ, ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ์„ธํŠธ๋ฅผ ์Šคํ”„๋ผ์ดํŠธ๋กœ ๊ฐ–๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ, ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์š”์†Œ๋Š” ์Šคํ”„๋ผ์ดํŠธ๊ฐ€ ์•„๋‹Œ Graphics ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ์•ต์ปค์ž…๋‹ˆ๋‹ค(๋ฌด์–ธ๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ). ์˜ˆ๋ฅผ ๋“ค์–ด Inkscape๋Š” ์•ต์ปค๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ ํ‘œ์ค€ afaik์—๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์˜ ์˜ˆ:

๋น„ํ‘œ์ค€ ํ•ญ๋ชฉ์„ ์ง€์›ํ•˜์ง€ ์•Š์•„๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ํ™”๋œ API๋งŒ์œผ๋กœ ์‚ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‰ํฌ์Šค์ผ€์ดํ”„ ๊ด€๋ จ ํ•ญ๋ชฉ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์‰ฝ๊ฒŒ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@bigtimebuddy ์˜ ๋…ธ๋ ฅ์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ

์ •ํ™•ํžˆ ์™œ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

@OSUblake

๋‚˜๋Š” ์ด๊ฒƒ์ด webpack์„ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฒƒ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
https://github.com/blunt1337/pixi-svg-loader

Webpack์œผ๋กœ ์ œํ•œ๋˜๊ณ  ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์œผ๋กœ ์ œํ•œ๋œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋งค์šฐ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„(๋นŒ๋“œ ์‹œ๊ฐ„ ์•„๋‹˜)์— Pixi.js์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€(์ œ ์ƒ๊ฐ์—๋Š” ๊ฐ€์žฅ ์ „๋ฌธ์ ์ธ Pixi.js ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ค๋ฅธ ๊ฒƒ์ด ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€์ง€ ์กฐ์–ธํ•˜์‹ญ์‹œ์˜ค) ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ SVG DOM๊ณผ ๋™์ผํ•œ ๊ตฌ์กฐ์ธ DisplayObject ์žฅ๋ฉด ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ์—์„œ ํ”ฝ์‹œ ํŠธ๋ฆฌ. ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ ํ•˜๋‚˜์˜ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ(์ˆ˜๋ฐฑ ๋˜๋Š” ์ˆ˜์ฒœ ์ค‘์—์„œ)๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ•˜๊ธฐ ์œ„ํ•ด ๋งค ํ”„๋ ˆ์ž„ ์ „์ฒด SVG๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•  ํ•„์š” ์—†์ด ์กฐ์ž‘ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์— ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋‚ด๊ฐ€ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ @bigtimebuddy ์˜ pixi-svg ๋˜๋Š” @saschagehlich ์˜ pixi-svg-graphics๋ฅผ ๊ฐ€์ ธ์™€ ์ˆ˜์ •(๋˜๋Š” ์œ ์‚ฌํ•œ ๊ฐœ๋… ์‚ฌ์šฉ)ํ•˜์—ฌ Pixi Graphics ํŠธ๋ฆฌ๋Š” ๋‹จ์ผ Graphics ๊ฐœ์ฒด์— ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ SVG ํŠธ๋ฆฌ๋ฅผ ๋ฏธ๋Ÿฌ๋งํ•ฉ๋‹ˆ๋‹ค.

@trusktr ๊ธฐ๋ณธ ๊ธฐ๋ฐ˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๊ฒฝ์šฐ Sprites ๋Œ€์‹  Graphics ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์†”๋ฃจ์…˜์€ ๊ฐ„๋‹จํ•œ SVG์˜ ๊ฒฝ์šฐ Graphics ๋ฐ ๋” ๋ณต์žกํ•œ SVG์˜ ๊ฒฝ์šฐ Sprites ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•œ ์ด์œ ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ SVG ๋ Œ๋”๋Ÿฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋งŽ์€ ๋…ธ๋ ฅ์ด ์žˆ์—ˆ๊ณ  ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ํ•ญ์ƒ ์ง€์›๋˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์˜ ์ด TODO ๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š”์ง€ ์•Œ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„ํ‹ฐ์ŠคํŠธ์—๊ฒŒ๋Š” ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ข‹์€ SVG ๋ Œ๋”๋Ÿฌ์ธ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ SVG์— ํšจ๊ณผ๊ฐ€ ์—†๋Š” ๋‹จ์ˆœํ•œ ๊ธฐ๋ณธ ์š”์†Œ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด Graphics ๊ฐœ์ฒด๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์Šคํ”„๋ผ์ดํŠธ๊ฐ€ ๋” ์ž˜ ์ž‘๋™ํ•˜๋Š” ์˜ˆ ๋Š” ๋งต์ด ๋งค์šฐ ๋ฐ”์‚ญํ•ด๋ณด์ด๊ณ (์•คํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ์ด ๋ˆ„๋ฝ๋œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Œ) ๊ฒฝ๋กœ๊ฐ€ ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์บ”๋ฒ„์Šค 2d์™€ Path2D API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SVG์—์„œ ํ…์Šค์ฒ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

var path = new Path2D("M10 10 h 80 v 80 h -80 Z");
context.fill(path);

๊ฒฝ๋กœ ๋ชจํ•‘ ๋ฐ๋ชจ
https://codepen.io/osublake/pen/oWzVvb

Google์˜ ํด๋ฆฌํ•„์ด ๋ณต์žกํ•œ SVG ๊ฒฝ๋กœ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋” ๋‚˜์€ ํด๋ฆฌํ•„์„ ์ž‘์—…ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/google/canvas-5-polyfill

@RanzQ

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ข‹์€ SVG ๋ Œ๋”๋Ÿฌ์ธ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๋Š๋ฆฝ๋‹ˆ๋‹ค. GPU ๋˜๋Š” CPU์—์„œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ๊ฒฝํ—˜ํ•œ ์„ฑ๋Šฅ์€ ์˜ˆ๋ฅผ ๋“ค์–ด Pixi.js๋กœ ๊ทธ๋ฆฐ ์œ ์‚ฌํ•œ ๊ฒƒ๋“ค์˜ ์†๋„์™€ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ SVG ์—”์ง„์ด ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Canvas 2d๋„ WebGL์— ๋น„ํ•ด ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ WebGL๊ณผ Canvas์˜ ์ฐจ์ด์ ์„ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค: http://pixijs.github.io/pixi-particles-editor/ (WebGL๊ณผ Canvas ๋ Œ๋”๋ง ์‚ฌ์ด๋ฅผ ํ† ๊ธ€ํ•˜๋ ค๋ฉด ์•„๋ž˜๋กœ ์Šคํฌ๋กค

SVG๋ฅผ ๊ทธ๋ฆฌ๊ณ  ์ตœ๋Œ€ํ•œ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ ์–ด๋„ ๊ฐœ๋…์ ์œผ๋กœ๋Š” Pixi.js ๋˜๋Š” Two.js์™€ ๊ฐ™์€ WebGL API๋กœ SVG๋ฅผ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ์ผํ•œ ๋‹จ์ ์€ ๋ชจ๋“  SVG ๊ธฐ๋Šฅ์ด ์™„์ „ํžˆ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@OSUblake

์บ”๋ฒ„์Šค 2d์™€ Path2D API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SVG์—์„œ ํ…์Šค์ฒ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

Canvas 2D๋Š” ์—ฌ์ „ํžˆ WebGL๋ณด๋‹ค ๋ˆˆ์— ๋„๊ฒŒ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ๋‘ ๋‹จ๋ฝ์„ ์—ฐ๊ฒฐํ•œ ๋ฐ๋ชจ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ฒฝ๋กœ ๋ชจํ•‘ ๋ฐ๋ชจ
https://codepen.io/osublake/pen/oWzVvb

๋ฉ‹์ง„ ๋ฐ๋ชจ! ์ด ๊ฒฝ์šฐ PathProxy์—์„œ ๊ฐ„๋‹จํ•œ ๊ฒฝ๋กœ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ์œ ์Šค ์ผ€์ด์Šค์— ์ถฉ๋ถ„ํžˆ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ SVG์— 100๊ฐœ์˜ ๋…ธ๋“œ์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋‘ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•œ ๋‹ค์Œ ํ•ด๋‹น ์ „์ฒด๋ฅผ ๊ตฌ๋ฅผ ๋‘˜๋Ÿฌ์‹ธ๋Š” ํ…์Šค์ฒ˜๋กœ ์›ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

๋˜๋Š” ํ•ด๋‹น ๋ฐ๋ชจ์˜ ์ž…์ž๊ฐ€ SVG๋กœ ์ˆ˜ํ–‰๋˜๊ณ  SVG DOM ๋…ธ๋“œ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•œ ๋‹ค์Œ ์บ”๋ฒ„์Šค์—์„œ drawImage ๊ฐ€ ์žˆ๋Š” ํ…์Šค์ฒ˜๋กœ ๋ Œ๋”๋ง์„ ์ทจํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ 3D webgl ์•ฑ์˜ ์ฟผ๋“œ์— ๋ฐฐ์น˜ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋„ˆ๋ฌด ๋Š๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์ž…์ž ์• ๋‹ˆ๋ฉ”์ด์…˜์ด Pixi๋ฅผ ํ†ตํ•ด WebGL์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ๋ชจ๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค.

Pixi๋กœ SVG๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด ์ง€์›๋˜๋Š” ๊ธฐ๋Šฅ์ด๊ณ  SVG ๊ณ„์ธต์„ ๋ฏธ๋Ÿฌ๋งํ•˜๋Š” ๊ณ„์ธต์ด ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ display:none <svg> ์š”์†Œ( display:none ๋ Œ๋”๋งํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €์˜ SVG ์—”์ง„์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ).

React, Angular ๋“ฑ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” DOM์˜ ํŽธ๋ฆฌํ•จ์„ ์ œ๊ณตํ•˜๋ฉด์„œ Pixi๊ฐ€ ๋” ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด SVG๋ฅผ ๊ทธ๋ฆฌ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” SVG DOM ํŠธ๋ฆฌ๋ฅผ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์˜ ๋Š๋ฆฐ SVG ์—”์ง„๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ์š”๊ตฌํ•˜๊ณ  ์žˆ๋Š”์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ์˜ ๊ธฐ์ˆ ๋กœ๋Š” SVG ๋ Œ๋”๋ง์ด ์ผ๋ฐ˜์ ์ธ ํ‘œ์ค€์— ๋น„ํ•ด ๋„ˆ๋ฌด ๋Š๋ฆฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ €ํฌ๋Š” ๊ฒŒ์ž„ ์—”์ง„ ์†๋„๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค).

@trusktr

ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๋Š๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ ๋ง์€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SVG ํ…์Šค์ฒ˜๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Š๋ฆฌ์ง€๋งŒ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋Ÿฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…์Šค์ฒ˜ ์•„ํ‹€๋ผ์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋‚˜์ค‘์— ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 2D ์ฒ™์ถ” ์บ๋ฆญํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์ถ”๊ตฌํ•˜๋Š” ๊ฒƒ์˜ ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค: https://github.com/bodymovin/bodymovin/issues/184

์ž‘์—…์€ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์œผ๋ฉฐ ์˜ˆ๋ฅผ ๋“ค์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์Šคํ”„๋ผ์ดํŠธ ๊ธฐ๋ฐ˜์˜ Pixi ์žฅ๋ฉด์„ ์ž˜ ์žฌ์ƒํ•˜๋Š” ์˜ค๋ž˜๋œ Android ํœด๋Œ€ํฐ์—์„œ ๋Š๋ฆฌ๊ฒŒ ์žฌ์ƒํ•  ๋งŒํผ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. SVG์™€ Pixi ๋ฒ„์ „์—์„œ ์ฐจ์ด์ ์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ตœ์ ํ™” ๋ฌธ์ œ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ๋„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค: https://www.gatherdigital.co.uk/community/post/high-performance-webgl/78

๋”ฐ๋ผ์„œ ์ œ ์ƒ๊ฐ์—๋Š” SVG์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. SVG ๊ธฐ๋Šฅ์ด ๋” ์ ์€ ํ•˜๋‚˜๋Š” ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋กœ ๋ถ„ํ• ๋˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ Œ๋”๋ง๋œ ์•„ํ‹€๋ผ์Šค๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด ์Šคํ”„๋ผ์ดํŠธ๋Š” <g> ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ SVG๋ณด๋‹ค ๋” ๋‚˜์€ ์ƒํ˜ธ ์šด์šฉ ๊ฐ€๋Šฅํ•œ ํ˜•์‹์ด๋‚˜ ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ์šฉ ๋„๊ตฌ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ์›ํ•œ๋‹ค๋ฉด SVG๋Š” @RanzQ๊ฐ€ ์ด๋ฏธ ๋ช…์‹œ๋˜์–ด ์žˆ๋Š” ์ด์œ ๋กœ

์ œ๊ฐ€ ์ถ”์ฒœํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ PixiAnimate(https://github.com/jiborobot/pixi-animate-extension)์ž…๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๊ทธ๋ž˜ํ”ฝ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ž˜ ์ˆ˜ํ–‰ํ•˜๋Š” Adobe Animate์šฉ ๊ธฐ๋ณธ ํ™•์žฅ(๋ฉด์ฑ… ์กฐํ•ญ, ์ œ๊ฐ€ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค)์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ค‘์ฒฉ๋œ ์‹ฌ๋ณผ๊ณผ ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@bigtimebuddy Animate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ์—์„œ ํ…์Šค์ฒ˜ ์•„ํ‹€๋ผ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์›Œํฌํ”Œ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ €๋Š” Pixi ์žฅ๋ฉด์„ UI ์ง€์›์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์›Œํฌํ”Œ๋กœ๋ฅผ ์ฐพ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Animate์˜ ์ƒˆ๋กœ์šด ๋ฆด๋ฆฌ์Šค์—์„œ ์•„ํ‹€๋ผ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ํ™•์žฅ์„ ์‹œ๋„ํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? http://blogs.adobe.com/contentcorner/2017/07/03/create-a-texture-atlas-with -animate-cc-for-your-favorite-game-engines/

@RanzQ , ์˜ˆ, PixiAnimate๋Š” TexturePackers ์•„ํ‹€๋ผ์Šค ํ˜•์‹์œผ๋กœ ๋ณ„๋„์˜ ์ด๋ฏธ์ง€ ๋˜๋Š” ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฒกํ„ฐ ๋ชจ์–‘์€ ์ž๋™์œผ๋กœ ํ…์Šค์ฒ˜๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Animate์—์„œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด "๋น„ํŠธ๋งต์œผ๋กœ ๋ณ€ํ™˜"์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@trusktr

์ž…์ž ์• ๋‹ˆ๋ฉ”์ด์…˜์ด Pixi๋ฅผ ํ†ตํ•ด WebGL์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ๋ชจ๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค.

์ •ํ™•ํžˆ. ๋‚˜๋Š” ์บ”๋ฒ„์Šค๋ฅผ ๋ฉ”์ธ ๋ Œ๋”๋Ÿฌ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ํ…์Šค์ฒ˜/์Šคํ”„๋ผ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ถฉ๋ถ„ํžˆ ๋นจ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Two.js๊ฐ€ WebGL์—์„œ ๊ฒฝ๋กœ ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Path2D ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋ฒกํ„ฐ๋ฅผ ์บ์‹œํ•˜๋ฏ€๋กœ ์บ”๋ฒ„์Šค ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์บ”๋ฒ„์Šค ์ปจํ…์ŠคํŠธ์™€ ํ•ด์ƒ๋„๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•œ ๊ฒฝ๋กœ ๊ฐœ์ฒด๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@OSUblake

์ •ํ™•ํžˆ. ๋‚˜๋Š” ์บ”๋ฒ„์Šค๋ฅผ ๋ฉ”์ธ ๋ Œ๋”๋Ÿฌ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ํ…์Šค์ฒ˜/์Šคํ”„๋ผ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ถฉ๋ถ„ํžˆ ๋นจ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Two.js๊ฐ€ WebGL์—์„œ ๊ฒฝ๋กœ ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด <circle> ์š”์†Œ์—์„œ ์ˆ˜์ •๋˜๋Š” ์œ ์ผํ•œ ์†์„ฑ์ด cx ๋ฐ cy ๊ฒฝ์šฐ ์ด๋Š” ์ตœ์ ํ™”๊ฐ€ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ๋ฉ”์‹œ ๋˜๋Š” ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฒƒ.

๋‹ค์Œ์€ Pixi, Two ๋ฐ ๊ธฐ๋ณธ SVG๋ฅผ ๋น„๊ตํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Pixi๊ฐ€ ๋ˆˆ์— ๋„๊ฒŒ ๋Š๋ฆฐ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐ(๋‹ค์‹œ ํ…Œ์‚ด๋ ˆ์ด์…˜ ๋˜๋Š” ๋‹ค์‹œ ๋ž˜์Šคํ„ฐํ™”)ํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๊ฐ€์š”?

Two.js์—์„œ Circle์€ x, y ๋ฐ ๋ฐ˜๊ฒฝ ์†์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด x์™€ y๋งŒ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์›์„ ๋‹ค์‹œ ํ…Œ์…€๋ ˆ์ด์…˜/์žฌ๋ž˜์Šคํ„ฐํ™”ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ตœ์ ํ™”๊ฐ€ Pixi์˜ ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น ์Šคํƒ€์ผ๋กœ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@trusktr

Pixi๊ฐ€ ๋ˆˆ์— ๋„๊ฒŒ ๋Š๋ฆฐ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐ(๋‹ค์‹œ ํ…Œ์‚ด๋ ˆ์ด์…˜ ๋˜๋Š” ๋‹ค์‹œ ๋ž˜์Šคํ„ฐํ™”)ํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๊ฐ€์š”?

์•„๋‹ˆ์š”. ์‚ผ๊ฐํ˜•์ด ๋งŽ์ด ์ƒ์„ฑ๋˜์–ด GPU ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค. ์„  ์Šคํƒ€์ผ์ด ์—†๋Š” ์ง์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฌ๋ฉด ์ฐจ์ด๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ผ์ดํŠธ๋กœ ๋ Œ๋”๋งํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ํ›จ์”ฌ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. 10,000๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•.
https://codepen.io/osublake/pen/PjrbWq/

๋ž˜์Šคํ„ฐํ™”๋ฅผ ์œ„ํ•ด ๋””์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๊นŒ? ๋„ˆ๋ฌด ๋งŽ์ด ํ™•๋Œ€ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธ€๊ผด๊ณผ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ๋ฐ์ดํ„ฐ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
https://github.com/Tw1ddle/WebGL-Distance-Fields/tree/master/sdf

https://www.shadertoy.com/view/ltXSDB

JSBin์ด for ๋ฃจํ”„์—์„œ ์ผ์ฐ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ์˜ˆ์ œ๋Š” ์™„์ „ํžˆ ๋ถ€์ •ํ™•ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ Macbook Pro์—์„œ๋Š” 500๊ฐœ์˜ ์›๋งŒ ๋ Œ๋”๋งํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค( n ๋ฅผ 10000 ). ์˜ˆ์ œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ JSBin์˜ ๋ฃจํ”„ ์ค‘๋‹จ ์—†์ด ๋ชจ๋‘ 2000๊ฐœ์˜ ์›์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

SVG ์˜ˆ์ œ๋Š” ๋ฐ˜๊ฒฝ์ด ์•„๋‹Œ ์› ์œ„์น˜๋งŒ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ•  ๋•Œ ์—ฌ์ „ํžˆ ๊ฐ€์žฅ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Two.js์™€ SVG๋„ ๋ฐ˜๊ฒฝ์— ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์ค๋‹ˆ๋‹ค.

Non-radius-animation ๋ฒ„์ „์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชฐ๋ผ์„œ Pixi.js ๋ฒ„์ „์„ ํฌํ•จํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฐ˜๊ฒฝ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํฌํ•จํ•˜๋„๋ก Pixi.js ๋ฅผ ์—†๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฒ„์ „์„ ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ฐ˜๊ฒฝ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํฌํ•จํ•˜๋„๋ก Pixi.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๊ฒฝ์ด ์—†๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฒ„์ „์„ ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์„ฑ๋Šฅ์€ ์—ฌ๊ธฐ์—์„œ ์‹ค์ œ๋กœ ๊ธ‰๊ฐ•ํ•˜ํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ์žฌ์„ค์ •ํ•˜๋Š” ๊ทธ๋ž˜ํ”ฝ ๊ฐœ์ฒด๋ฅผ ์ง€์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
https://codepen.io/osublake/pen/8217810e590672c5a5327596e33c4b1a?editors=0010

์ด์ œ ์บ”๋ฒ„์Šค 2d๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์Šค์ฒ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ด ๋ฐ๋ชจ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”. ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ๊ฒฌ๊ณ ํ•œ 60fps๋กœ ์‹คํ–‰๋˜๋Š” 3,000๊ฐœ์˜ ์›์ด ์žˆ์Šต๋‹ˆ๋‹ค.
https://codepen.io/osublake/full/MoMeMg/

๊ธ€์Ž„์š”, ์–ด์จŒ๋“ , ์˜ˆ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด์— ๋Œ€ํ•œ ์ข‹์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” WebGL์—์„œ ํ›จ์”ฌ ๋” ๋น ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@OSUblake ์›์Šค, ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ƒˆ๋กœ์šด ๋Œ€๋‹ต์„ ๋ณด๊ธฐ ์ „์— ๋งˆ์ง€๋ง‰์œผ๋กœ ๋Œ€๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์€ ์—ฌ๊ธฐ์—์„œ ์‹ค์ œ๋กœ ๊ธ‰๊ฐ•ํ•˜ํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ์žฌ์„ค์ •ํ•˜๋Š” ๊ทธ๋ž˜ํ”ฝ ๊ฐœ์ฒด๋ฅผ ์ง€์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
https://codepen.io/osublake/pen/8217810e590672c5a5327596e33c4b1a?editors=0010

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ๋‘๋ ค์›Œํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ SVG ์†๋„ ์ €ํ•˜์— ์ ‘๊ทผํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์บ”๋ฒ„์Šค 2d๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์Šค์ฒ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ด ๋ฐ๋ชจ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”. ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ๊ฒฌ๊ณ ํ•œ 60fps๋กœ ์‹คํ–‰๋˜๋Š” 3,000๊ฐœ์˜ ์›์ด ์žˆ์Šต๋‹ˆ๋‹ค.
https://codepen.io/osublake/full/MoMeMg/

์  ์žฅ, ์™€์šฐ! ๊ดœ์ฐฎ์•„! ์ž, ์ด์ œ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค(3000 <canvas> ๋„ ํฌํ•จ)!

์™œ ๊ทธ๋ ‡๊ฒŒ ๋” ๋น ๋ฆ…๋‹ˆ๊นŒ? ๋„ค์ดํ‹ฐ๋ธŒ SVG ๊ตฌํ˜„์ž๋Š” ์ด๊ฒƒ(Pixi.js ๋ฐ Two.js๋„ ํฌํ•จ)์—์„œ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Pixi.js์—์„œ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ถฉ๋Œ/์„ ํƒ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋ฉ”์‰ฌ ๋Œ€์‹  ์ง์‚ฌ๊ฐํ˜• ํ…์Šค์ฒ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@trusktr ๋น ๋ฅธ ์ด์œ ๋Š” ์บ”๋ฒ„์Šค์— ํ•œ ๋ฒˆ

๊ทธ๋ž˜ํ”ฝ ๊ฐœ์ฒด( cacheAsBitmap )๋ฅผ ์บ์‹ฑํ•˜์—ฌ Pixi์˜ ๊ทธ๋ฆฌ๊ธฐ API๋กœ ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ํ•œ ๋ฒˆ ๊ทธ๋ฆฌ๊ณ  ์บ์‹œ์—์„œ ๋น ๋ฅด๊ฒŒ ๋‹ค์‹œ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์˜ˆ์—๋Š” 4px ๋‹จ๊ณ„๋กœ ๋ฐ˜์˜ฌ๋ฆผ๋œ ๊ฐ ๋ฐ˜๊ฒฝ์— ๋Œ€ํ•ด ์ƒ์„ฑ๋œ ๋ณ„๋„์˜ ํ…์Šค์ฒ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์ œ๋Œ€๋กœ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ๐Ÿ˜„)

์‹ค์ œ๋กœ๋Š” 0.25 ์ฆ๋ถ„์œผ๋กœ ๋ฐ˜์˜ฌ๋ฆผ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ํ•˜์œ„ ํ”ฝ์…€ ์ •ํ™•๋„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒŒ ์žฌ๋ฏธ์žˆ๋‹ค๋ฉด Pixi์˜ CanvasTinter๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋˜๋Š” ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹. ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ๋Œ€๊ฐ€๋กœ ์•ฝ๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํฌ์ƒํ•˜๊ณ  ์ข‹์€ ์บ์‹ฑ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”ฝ ๊ฐœ์ฒด(cacheAsBitmap)๋ฅผ ์บ์‹ฑํ•˜์—ฌ Pixi์˜ ๊ทธ๋ฆฌ๊ธฐ API๋กœ ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ํ•œ ๋ฒˆ ๊ทธ๋ฆฌ๊ณ  ์บ์‹œ์—์„œ ๋น ๋ฅด๊ฒŒ ๋‹ค์‹œ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”ฝ์— ์•จ๋ฆฌ์–ด์‹ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— cacheAsBitmap์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•คํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ๋œ ๊ทธ๋ž˜ํ”ฝ์„ ์–ป์œผ๋ ค๋ฉด generateCanvasTexture๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–ด๋Š ์ชฝ์ด๋“  ์บ”๋ฒ„์Šค๋กœ ๋๋‚˜์ง€๋งŒ Pixi์˜ ๊ทธ๋ž˜ํ”ฝ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํš์˜ ์„  ๋Œ€์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”ฝ ๊ฐœ์ฒด(cacheAsBitmap)๋ฅผ ์บ์‹ฑํ•˜์—ฌ Pixi์˜ ๊ทธ๋ฆฌ๊ธฐ API๋กœ ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•คํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ๋œ ๊ทธ๋ž˜ํ”ฝ์„ ์–ป์œผ๋ ค๋ฉด generateCanvasTexture๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ @OSUblake ์˜ˆ์ œ์™€ ๊ฐ™์ด ๋ฐ˜๊ฒฝ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

(๊ทธ๋Ÿฐ๋ฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ์ƒ์ƒํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋ Œ๋”๋ง ๊ธฐ์ˆ ์— ๋ˆˆ์„ ๋œจ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

@trusktr ์˜ˆ, ๋ฐ˜๊ฒฝ์ด ๋‹ค๋ฅธ ๋งŽ์€ Graphics ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์ƒ์„ฑ๋œ ํ…์Šค์ฒ˜์˜ ๋งต์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ๊ฐ ๋ฐ˜๊ฒฝ์— ๋Œ€ํ•ด ์บ์‹œ๋œ ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ). cacheAsBitmap ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ…์Šค์ฒ˜ ๋Œ€์‹  Graphics ๊ฐœ์ฒด๋ฅผ ๋งคํ•‘ํ•˜์ง€๋งŒ @OSUblake๊ฐ€ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์•คํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ ์• ๋‹ˆ๋ฉ”์ด์…˜์ž…๋‹ˆ๋‹ค. ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ํ…์Šค์ฒ˜ ์บ์‹ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›์˜ ํš๋„ ์Šค์ผ€์ผ๋ง๋˜๋Š” ๊ฒƒ์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ฐ„๋‹จํ•œ ์Šค์ผ€์ผ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์บ”๋ฒ„์Šค๊ฐ€ ๋” ๋‚˜์€ ๊ทธ๋ฆฌ๊ธฐ API๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. SVG์˜ ๊ฒฝ์šฐ pixi-svg-loader ์ฒ˜๋Ÿผ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์•„ํ‹€๋ผ์Šค๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ œ ์ƒ๊ฐ์—๋Š”?). ๋˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ฐ™์€ ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์บ”๋ฒ„์Šค์— ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ƒํƒœ๋ฅผ ๊ทธ๋ ค๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Pixi.js์—์„œ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ถฉ๋Œ/์„ ํƒ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋ฉ”์‰ฌ ๋Œ€์‹  ์ง์‚ฌ๊ฐํ˜• ํ…์Šค์ฒ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ฆฌ๊ณค๋งŒํผ ๋น ๋ฅด์ง€๋Š” ์•Š์ง€๋งŒ ์บ”๋ฒ„์Šค์—๋Š” isPointInPath ๊ฒฝ๋กœ์—์„œ ์ ์ค‘ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ง€๋„์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์‹ญ์‹œ์˜ค.
https://codepen.io/osublake/pen/dzYzab/?editors=0010

three.js์— svgloader๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ pixi.js์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://github.com/mrdoob/three.js/blob/master/examples/js/loaders/SVGLoader.js

์ด ๋ฌธ์ œ๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํ™œ๋™์ด ์—†์œผ๋ฉด ํ์‡„๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋Š” ๋‹ซํžŒ ํ›„ ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰