Pixi๊ฐ SVG์ ๊ทธ๋ํฝ ๊ณ์ธต ํํ์ ์์ฑํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค(ํ์ฌ์ ๊ฐ์ ํ ์ค์ฒ๋ฅผ ๋ก๋ํ๋ ๊ฒ ๋ฟ๋ง ์๋๋ผ).
@psyrendust ^ ์๋ ํ์ธ์, Pixi๋ก ๋ง๋ ๊ฒ์ ํ๋ณดํ ์ ์์ต๋๊น? :๋
๋ด๊ฐ ๋ง๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ธํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
https://github.com/bigtimebuddy/pixi-svg
https://bigtimebuddy.github.io/pixi-svg/example/
Pixi์์ ๊ทธ๋ฆฌ๊ธฐ์ ์ ํ์ผ๋ก ์ธํด ๋ชจ๋ svg ๊ธฐ๋ฅ์ด ์ง์๋๋ ๊ฒ์ ์๋๋๋ค.
@trusktr ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? ๊ทธ๋ฃน์ ์ปจํ ์ด๋๋ก, ํ๋ฆฌ๋ฏธํฐ๋ธ ์ธํธ๋ฅผ ์คํ๋ผ์ดํธ๋ก ๊ฐ๋ ๊ฒ์ ์๋ฏธํฉ๋๊น?
์ด๊ฒ์ ๋ด๊ฐ ์๊ฐํ ๊ฒ์ ๋๋ค. ํ ์ค์ฒ ์ํ๋ผ์ค๋ฅผ ๋ง๋ค๊ณ SVG์์ ๋ณํ ๋ฐ ํ์ ์ ์ฌ์ฉํ์ฌ Sprite์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํ ์ ์์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์์ ๋ณผ ์ ์๋ ํ ๊ฐ์ง ๋ฌธ์ ๋ ์ต์ปค์ ๋๋ค(๋ฌด์ธ๊ฐ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ๋ ค๋ ๊ฒฝ์ฐ). ์๋ฅผ ๋ค์ด Inkscape๋ ์ต์ปค๋ฅผ ์ฌ์ฉ์ ์ ์ ์์ฑ์ผ๋ก ์ถ๊ฐํ์ง๋ง ํ์ค afaik์๋ ์์ต๋๋ค. ๋ด๊ฐ ์๋ฏธํ๋ ๋ฐ์ ์:
์ธ ๊ฒฝ๋ก ๊ทธ๋ฃน์ ์ต์ปค(ํ๋์ ์ฌ๊ฐํ์ ์ผ์ชฝ ์๋จ)๋ 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
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
์ด ๋ฌธ์ ๋ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ค๋๋ ๊ฒ์ผ๋ก ํ์๋์์ต๋๋ค. ๋ ์ด์ ํ๋์ด ์์ผ๋ฉด ํ์๋ฉ๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ด ์ค๋ ๋๋ ๋ซํ ํ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ ๊ฒผ์ต๋๋ค. ๊ด๋ จ ๋ฒ๊ทธ์ ๋ํ ์ ๋ฌธ์ ๋ฅผ ์ฌ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ์ด๊ฒ์ด webpack์ ์ฌ์ฉํ์ฌ ์ํ๋ ๊ฒ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
https://github.com/blunt1337/pixi-svg-loader