ååæã ã¯ã¹ãããã¢ãŒã·ã§ã³ã¢ãã¡ãŒã·ã§ã³ã®ã°ã©ããè»éã®è©±ããããŠä»æ¥ãããè¡åã«ã€ããŠã«ãªããŸããCSSãSVGãWebGLã§åºæ¬çãªå€æãæ§ç¯ããæ¹æ³ãThree.jsãªã©ã®ããŒã«ã§å¹³è¡ç·ãæãæ¹æ³ãèªåã®æã§ç»é¢ã«è¡šç€ºããæ¹æ³ãç解ããåçã®ãã£ã«ã¿ãŒãè©ŠããŠäœãç解ãããã説æããŸãããã®ãããªéæ³ã¯åœŒãã®æ žå¿ã«ããããã§ãã
ãã®äžé£ã®èšäºã§ã¯ãã¬ã€ã¢ãŠãèšèšè ãæããããæ°åŠã®åéã®ããŸããŸãªããšãç¥ã£ãŠããŸãããäœæ¥äžã®åé¡ã®è§£æ±ºã«ã¯åœ¹ç«ã€å¯èœæ§ãããããšãæãåºããŠãã ãããããã³ããšã³ãã§ã®å®çšåã«éç¹ã眮ããŠãäžå¿ èŠãªçè«åãé¿ããæã§ã®åçã説æãåªå ããããã«ããŠããŸãããã®ç¹ã§ãããã€ãã®å Žæã§ã®å®åŒåã¯ãæ°åŠã®èŠ³ç¹ããå®å šã«æ£ç¢ºã§ã¯ãªãããå®å šã§ã¯ãªãå¯èœæ§ããããŸãããã®èšäºã®ç®çã¯ãäœãèµ·ãããäœããèµ·ãã£ãå Žåã«ã©ãããå§ããã¹ããã«ã€ããŠã®äžè¬çãªèããäžããããšã§ãã
ãã®äžé£ã®èšäºã®ã¹ã¿ã€ã«ã§ç»åãçæããããã®ã¹ã¯ãªããã¯GitHubã«ããã®ã§ãåãããšãç解ãããå Žåã¯ãäœããã¹ãããç¥ã£ãŠããŸãã
ããã€ãã®å®çŸ©
æ°åŠã®è¡åã¯ãã®ãããªæœè±¡åã§ãããããæå³ã§ã¯ããŒã¿åã§ãããé·æ¹åœ¢ã®è¡šã®åœ¢ã§èšè¿°ããŠãããšèšããŸããåãšè¡ã®æ°ã¯äœã§ãããŸããŸããããWebã§ã¯ãã»ãšãã©ã®å Žåã2x2ã3x3ã4x4ãããã³5x5ã®æ£æ¹åœ¢ã®è¡åãæ±ã£ãŠããŸãã
ãã¯ãã«ãªã©ã®å®çŸ©ãå¿ èŠã§ããåŠæ ¡ã®å¹ŸäœåŠããããé·ãããšãæ¹åããšããèšèã«é¢é£ããå®çŸ©ãæãåºãããšãã§ãããšæããŸãããäžè¬ã«æ°åŠã§ã¯ãå€ãã®ãã®ããã¯ãã«ãšåŒã¶ããšãã§ããŸããç¹ã«ããã¯ãã«ãé åºä»ããããå€ã®ã»ãããšããŠèª¬æããŸããããšãã°ãïŒxãyïŒãŸãã¯ïŒxãyãzïŒã®åœ¢åŒã®åº§æšããŸãã¯ïŒrãgãbïŒãŸãã¯ïŒhãsãlãaïŒã®åœ¢åŒã®è²ãªã©ã§ãããã®ãããªã»ããã«å«ãŸããèŠçŽ ã®æ°ã«å¿ããŠã1ã€ã®æ¬¡å ãŸãã¯å¥ã®æ¬¡å ã®ãã¯ãã«ã«ã€ããŠèª¬æããŸãã2ã€ã®èŠçŽ ã2次å ã®å Žåã3ã€ã¯3次å ã®å Žåãªã©ã§ãããŸããæ€èšäžã®ãããã¯ã®ãã¬ãŒã ã¯ãŒã¯å ã§ããã¯ãã«ããµã€ãº1x2ã1x3ã1x4ãªã©ã®ãããªãã¯ã¹ãšèãããšäŸ¿å©ãªå ŽåããããŸããæè¡çã«ã¯ãããããªãã¯ã¹ããšããçšèªã ãã«éå®ããããšãã§ããŸãããããã§ãããã¯ãã«ããšããçšèªã䜿çšããŠãããã2ã€ã®æŠå¿µãäºãã«åé¢ããŸããå°ãªããšãè«ççãªæå³ã§ã¯ã
è¡åã®å Žåãããã³ãã¯ãã«ã®å Žåããããã䜿çšããŠå®è¡ã§ããããŸããŸãªæäœãå®çŸ©ãããŠããŸããç¹ã«ãä¹ç®ãç§ãã¡ã¯åžžã«ããããèªåãã¡ã®éã§å¢ãããŠããŸããä¹ç®ã¢ã«ãŽãªãºã èªäœã¯ããã»ã©è€éã§ã¯ãããŸããããå°ãæ··ä¹±ããŠããããã«èŠãããããããŸããã
function multiplyMatrices(a, b) {
const m = new Array(a.length);
for (let row = 0; row < a.length; row++) {
m[row] = new Array(b[0].length);
for (let column = 0; column < b[0].length; column++) {
m[row][column] = 0;
for (let i = 0; i < a[0].length; i++) {
m[row][column] += a[row][i] * b[i][column];
}
}
}
return m;
}
ããããå®éãç§ãã¡ã«ãšã£ãŠãæ¥åžžã®åé¡ã解決ããéã«ããã®åäœã®åçãåžžã«èŠããŠããããšã¯ããã»ã©éèŠã§ã¯ãããŸãããããã§ã¯ãå®å šãæãããã«ããã«ã€ããŠèšåãããããªãäŸã®ã³ã³ããã¹ããæäŸããŸãã
æ°åŠã§è€éãªãšã³ãã£ãã£ãæäœããå Žåãæœè±¡åãããšéåžžã«äŸ¿å©ã§ããããã«ããããã«ãä¹ç®ã«ã€ããŠãã話ããŸãããããã§ã©ã®ãããªçš®é¡ã®ç®è¡æŒç®ãã©ã®ãããªé åºã§çºçãããã«ã€ããŠã¯æ³šæãæããŸãããä¹ç®ãå®çŸ©ãããŠããããšã¯ããã£ãŠããŸãããããã§ååã§ãã
éåžžã«ç¹å®ã®åé¡ã®ã»ããã§ã®ã¿æ£æ¹åœ¢ã®è¡åã䜿çšãããããåçŽãªã«ãŒã«ã®ã»ããã§ååã§ãã
- åã次å ã®è¡åã®ã¿ãä¹ç®ã§ããŸãã
- è¡åã«è¡åãæããŸã-è¡åãååŸããŸãã
- è¡åã«ãã¯ãã«ãæããããšãã§ããŸã-ãã¯ãã«ãååŸããŸãã
- ä¹ç®ã®é åºã¯éèŠã§ãã
ããç¥ããã説æã«é©ããŠãããããäž»ã«å·Šããå³ãžã®ä¹ç®ã䜿çšããŸãããäžéšã®æ¬ãã©ã€ãã©ãªã§ã¯ãå³ããå·Šãžã®è¡šèšã«åºãããããã¹ãŠã®è¡åãæãã«ãã©ãŒãªã³ã°ãããŸããããã¯ãè¡ãããæäœã®æ¬è³ªã«ãŸã£ãã圱é¿ãäžããªããããããã«ã€ããŠã¯è©³ãã説æããŸããããäœããã³ããŒããŠè²Œãä»ããå Žåã¯æ³šæãå¿ èŠã§ãã
ãŸããä»åŸã®äœæ¥ã«ã¯ãã¢ã€ãã³ãã£ãã£ãããªãã¯ã¹ãªã©ã®æŠå¿µãå¿ èŠã«ãªããŸããããã¯ãã¡ã€ã³ã®å¯Ÿè§ç·äžã«1ããããä»ã®ãã¹ãŠã®ã»ã«ã«0ããããããªãã¯ã¹ã§ããä¹ç®ã¢ã«ãŽãªãºã ã¯ãåäžæ§ãããªãã¯ã¹ã«å¥ã®ãããªãã¯ã¹ãä¹ç®ããããã«æ§ç¯ãããŠããŸããåããããªãã¯ã¹ãåŸãããŸãããŸãã¯ããã¯ãã«ã«ã€ããŠè©±ããŠããå Žåã¯ããã¯ãã«ãèšãæããã°ãã¢ã€ãã³ãã£ãã£ãããªãã¯ã¹ã¯ãéåžžã®æ°å€ã®ä¹ç®ã«ãããŠ1ã€ã®åœ¹å²ãæãããŸããããã¯ãä¹ç®ããŠããäœã«ã圱é¿ãäžããªããäžç«çãªãã®ã§ãã
ãããŠæåŸã«å¿ èŠãªã®ã¯äžã®åçã®äŸã§ããããã¯ããããªãã¯ã¹ã®æåŸã®è¡ããã¢ã€ãã³ãã£ãã£ãããªãã¯ã¹ã®äžéšãã§ããããã¯ãã«ã®æåŸã®èŠçŽ ã1ã«çããå Žåã«ããããªãã¯ã¹ã«ãã¯ãã«ãä¹ç®ããç¹æ®ãªã±ãŒã¹ã®ãããªãã®ã§ãã
ãã®äŸã§ã¯ãæåïŒxãyïŒã䜿çšããŠããŸãããæ³åã®ãšããã以äžã®èª¬æã§ã¯2Dã®åº§æšã«çŠç¹ãåœãŠãŸãããããããªã3çªç®ã®åº§æšãè¿œå ããŠã1ã€ã®ãŸãŸã«ããã®ã§ããããã- ããªããå°ãããå©äŸ¿æ§ãããã«ã¯å€çšéæ§ããã¹ãŠã§ããèšç®ãç°¡çŽ åããããã«+1座æšãè¿œå ããããšããããããŸããããšãã°ã2Dã§ã®äœæ¥ã¯3x3ãããªãã¯ã¹ã§ã3Dã§ã®äœæ¥ã¯4x4ãããªãã¯ã¹ã§ã4Dã§ã®äœæ¥ã¯ãããšãã°ã圢åŒïŒrãgãbãaïŒã®è²ã§ãããªãã¯ã¹ã䜿çšããŸã5x5ãäžèŠãããã¯ããããªã¢ã€ãã¢ã®ããã«èŠããŸãããåŸã§ãã¹ãŠã®æäœãçµ±åããæ¹æ³ãèŠãŠãããŸãããã®ãããã¯ããã詳现ã«ç解ãããå Žåã¯ããåäžãªåº§æšããšããè¡šçŸãã°ãŒã°ã«ã§æ€çŽ¢ã§ããŸãã
ããããååãªçè«ããããŸãã®ã§ãç·Žç¿ã«ç§»ããŸãããã
I.ã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ã®åºæ¬çãªå€æ
äžèšã®äŸããåŒãåãåºããŠããããªãã¯ã¹ã®ã³ã³ããã¹ãã®å€ã§ããããããã®ãŸãŸèŠãŠã¿ãŸãããã
newX = a*x + b*y + c
newY = d*x + e*y + f
ããã¯ãååãããããããã©ã¡ããªãã¯æ¹çšåŒãšèããããšãã§ããŸããããããŸãã¯ãããã®ä¿æ°ãèšå®ãããšã©ããªããŸããïŒæ¬¡ã®ãªãã·ã§ã³ããå§ããŸãããïŒ
newX = 1*x + 0*y + 0 = x
newY = 0*x + 1*y + 0 = y
ããã§ã¯äœãå€æŽãããŸãããæ°ãã座æšïŒxãyïŒã¯å€ã座æšãšåãã§ãããããã®ä¿æ°ããããªãã¯ã¹ã«ä»£å ¥ããŠããèŠããšãã¢ã€ãã³ãã£ãã£ãããªãã¯ã¹ãåŸãããŠããããšãããããŸãã
ä»ã®ä¿æ°ãåããšã©ããªããŸããïŒããšãã°ã次ã®ãšããã§ãã
newX = 1*x + 0*y + A = x + A
newY = 0*x + 1*y + 0 = y
X軞ã«æ²¿ã£ãŠãªãã»ãããååŸããŸãããããã§ä»ã«äœãèµ·ãã£ãå¯èœæ§ããããŸããïŒãããæããã§ãªãå Žåã¯ããã£ãŒããšä¿æ°ã«ã€ããŠèª¬æããæåã®éšåã«æ»ãããšããå§ãããŸãã
ãããã®6ã€ã®ä¿æ°ïŒaãbãcãdãeãfïŒãå€æŽããxãšyã®å€åã芳å¯ãããšãé ããæ©ãããå®çšã«äŸ¿å©ã§äŸ¿å©ãª4ã€ã®çµã¿åããã«ãªããŸããå ã®äŸã«æ»ã£ãŠãããã«ãããªãã¯ã¹ã®åœ¢ã§ããããæžããŸããã
ããããã®ãããªãã¯ã¹ã®ååã¯ããèªäœãç©èªã£ãŠããŸãããããã®è¡åã«ãããã€ãã®ãã€ã³ããã·ãŒã³äžã®ãªããžã§ã¯ããªã©ã®åº§æšãå«ããã¯ãã«ãä¹ç®ããå Žåããããã®æ°ãã座æšãååŸããŸããããã«ã移åãã¹ã±ãŒãªã³ã°ãå転ãåŸæãªã©ã®çŽæçãªå€æãæäœããä¿æ°ã«ãã£ãŠã察å¿ãã軞ã«æ²¿ã£ãç¹å®ã®å€æã®é倧床ã決ãŸããŸãã
è¡åã座æšãªã©ã®äœãã®å€æãšèãããšäŸ¿å©ãªããšããããããŸããããã¯æœè±¡åã«ã€ããŠã®å¥ã®èšèã§ãã
ãã©ã³ã¹ãã©ãŒã ã¯ã¹ã¿ãã¯ã§ããŸãããããªãã¯ã¹ã«é¢ããŠã¯ãä¹ç®æŒç®ã䜿çšããŸããããã¯å°ãæ··ä¹±ããå¯èœæ§ããããŸãããããã¯è©±ãèšèã®ãªãŒããŒãããã§ãããªããžã§ã¯ãã暪ã«ã·ããããŠå¢ããå¿ èŠãããå Žåã¯ãå€äœçšã®ãããªãã¯ã¹ãã¹ã±ãŒãªã³ã°çšã®ãããªãã¯ã¹ãååŸããŠãããããä¹ç®ã§ããŸããçµæã¯ããªãã»ãããšã¹ã±ãŒãªã³ã°ã®äž¡æ¹ãåæã«äžãããããªãã¯ã¹ã«ãªããŸãããªããžã§ã¯ãã®åãã€ã³ãããã®å©ããåããŠå€æããã ãã§ãã
CSSã®åºæ¬çãªå€æ
ãããããããã¯ãã¹ãŠèšèã§ããå®éã®ããã³ããšã³ãã§ã©ã®ããã«èŠãããèŠãŠã¿ãŸããããCSSã§ã¯ãïŒçªç¶ïŒãããªãã¯ã¹é¢æ°ããããŸããã³ãŒãã®ã³ã³ããã¹ãã§ã¯ã次ã®ããã«ãªããŸãã
.example {
transform: matrix(1, 0, 0, 1, 0, 0);
}
åããŠãããèŠãå€ãã®åå¿è ã¯è³ªåã«ãã£ãŠã«ããŒãããŸã-ãªã6ã€ã®ãã©ã¡ãŒã¿ãããã®ã§ããïŒããã¯å¥åŠã§ããããã¯4ã16ã ã£ãã§ããã-ããã¯ãŸã ã©ãã«ãè¡ããŸããã§ãããã6ïŒåœŒãã¯äœãããŠããŸããïŒ
ãããå®éã«ã¯ããã¹ãŠãåçŽã§ãããããã®6ã€ã®ãã©ã¡ãŒã¿ãŒã¯ãåºæ¬çãªå€æã®ãããªãã¯ã¹ãçµã¿ç«ãŠãã°ããã®ä¿æ°ã§ããããããäœããã®çç±ã§ãããã¯ç°ãªãé åºã§é 眮ãããŸããïŒ
CSSã«ãããããªãã¯ã¹ã䜿çšããŠ3Då€æãèšå®ããããã®é¢æ°matrix3dããããŸãã4x4ãããªãã¯ã¹ãäœæããããã«ããã§ã«16åã®ãã©ã¡ãŒã¿ãŒããããŸãïŒ+1次å ãè¿œå ããããšãå¿ããªãã§ãã ããïŒã
åºæ¬çãª3Då€æã®ãããªãã¯ã¹ã¯ã2Dã®å Žåãšåãæ¹æ³ã§äœæããã2ã€ã®åº§æšã§ã¯ãªãã3ã€ã®åº§æšã«é 眮ããããã«å¿ èŠãªä¿æ°ã¯ããã«å€ããªããŸããããããååã¯åãã§ãã
åœç¶ãCSSã§åçŽãªå€æãè¡ãå Žåããããªãã¯ã¹ããã§ã³ã¹ã§å²ã¿ãä¿æ°ã®æ£ããé 眮ãç£èŠããã®ã¯å¥åŠãªããšã§ããç§ãã¡ããã°ã©ããŒã¯éåžžãç§ãã¡ã®ç掻ã楜ã«ããããšããŸãããã®ãããCSSã«ã¯ãåå¥ã®å€æãäœæããããã®çãé¢æ°ïŒtranslateXãtranslateYãscaleXãªã©ïŒããããŸããéåžžã¯ãããã䜿çšããŸãããå éšã§èª¬æããã®ãšåããããªãã¯ã¹ãäœæããããã®ããã»ã¹ãå¥ã®æœè±¡åã¬ã€ã€ãŒã®èåŸã«é ããŠããããšãç解ããããšãéèŠã§ãã
SVGã«ã¯ãåãå€æãå転ãã¹ã±ãŒãªã³ã°ãã¹ãã¥ãŒå€æãããã³å€æãå®çŸ©ããããã®ãŠãããŒãµã«ãããªãã¯ã¹é¢æ°ããããŸããæ§æã¯å°ãç°ãªããŸãããæ¬è³ªã¯åãã§ããWebGLãªã©ã®3Dã°ã©ãã£ãã¯ã䜿çšããå Žåããåãå€æã䜿çšããŸããããããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãããä»ã§ã¯ãããããã©ãã«ã§ããããåãååã«åŸã£ãŠã©ãã§ãæ©èœããããšãç解ããããšãéèŠã§ãã
å°èš
äžèšãèŠçŽããŸãããïŒ
- ãããªãã¯ã¹ã¯ããã¯ãã«ã®å€æãç¹ã«ããŒãžäžã®äžéšã®ãªããžã§ã¯ãã®åº§æšã®å€æãšããŠäœ¿çšã§ããŸãã
- ã»ãšãã©ã®å Žåãæ£æ¹åœ¢ã®è¡åãæäœãã+ 1次å ãè¿œå ããŠãèšç®ãåçŽåããã³çµ±åããŸãã
- 4ã€ã®åºæ¬çãªå€æããããŸã-å€ââæãå転ãã¹ã±ãŒãªã³ã°ãã¹ãã¥ãŒããããã¯CSSããWebGLãŸã§ã©ãã§ã䜿çšãããã©ãã§ãåãããã«æ©èœããŸãã
IIãDIY3Dã·ãŒã³æ§ç¯
座æšå€æã«é¢ãããããã¯ã®è«ççãªå±éã¯ã3Dã·ãŒã³ã®æ§ç¯ãšããããç»é¢ã«è¡šç€ºããããšã§ããäœããã®åœ¢ã§ããã®ã¿ã¹ã¯ã¯éåžžããã¹ãŠã®ã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ã³ãŒã¹ã§èŠãããŸãããããã³ããšã³ãã³ãŒã¹ã§ã¯éåžžèŠãããŸãããå°ãç°¡ç¥åãããŠãããããããŸããããããŸããŸãªè¡šç€ºè§åºŠã§ã«ã¡ã©ãäœæããæ¹æ³ãç»é¢äžã®ãã¹ãŠã®ãªããžã§ã¯ãã®åº§æšãèšç®ããŠç»åãäœæããããã«å¿ èŠãªæäœãããã³æã人æ°ã®ããThree.jsãšã®å¹³è¡ç·ãæç»ããæ¹æ³ã®æ¬æ ŒçãªããŒãžã§ã³ã確èªããŸãã WebGLãæäœããããã®ããŒã«ã
ããã§åççãªè³ªåãçºçããã¯ãã§ã-ãªãã§ããïŒæ¢è£œã®ããŒã«ãæã£ãŠããã®ã«ããªãããªãã®æã§ãã¹ãŠãè¡ãããšãåŠã¶ã®ã§ããïŒçãã¯ããã©ãŒãã³ã¹ã®åé¡ã«ãããŸãã AwwwardsãCSS Design AwardsãFWAãªã©ã®ã³ã³ãã¹ãããããµã€ãã«ã¢ã¯ã»ã¹ããããšãããã§ããããããã©ãŒãã³ã¹ãµã€ãããããã®ã³ã³ãã¹ãã«ã©ã®ããã«åå ããŠãããèŠããŠããŸããïŒã¯ããããã«ããã»ãšãã©ãã¹ãŠã®äººãé床ãèœãšããããŒãæã«é ããŠãã©ããããããé£è¡æ©ã®ããã«ããã³ã°ãããŸãïŒã¯ãããã¡ãããäž»ãªçç±ã¯éåžžãè€éãªã·ã§ãŒããŒãŸãã¯DOMæäœãå€ãããããšã§ããã2çªç®ã¯ä¿¡ããããªãã»ã©ã®éã®ã¹ã¯ãªããã§ããããã¯ããã®ãããªãµã€ãã®ããŒãã«å£æ» çãªåœ±é¿ãåãŒããŸããéåžžããã¹ãŠã¯æ¬¡ã®ããã«è¡ãããŸããWebGLã§äœããè¡ãå¿ èŠããããŸããããçš®ã®3Dãšã³ãžã³ïŒ+ 500KBïŒãšãã®ãã©ã°ã€ã³ïŒ+ 500KBïŒã䜿çšããŸãããªããžã§ã¯ããèœäžãããããäœããé£ã°ãå¿ èŠããããŸã-ãããã¯ç©çãšã³ãžã³ïŒ+ 1MBããŸãã¯ãã以äžïŒãå¿ èŠãšããŸããããŒãžäžã®ããã€ãã®ããŒã¿ãæŽæ°ããå¿ èŠããããŸã-ãŸãã12åã®ãã©ã°ã€ã³ïŒ+ 500KBïŒãªã©ã䜿çšããŠSPAãã¬ãŒã ã¯ãŒã¯ãè¿œå ããŸãããã®ããã«ããŠãæ°ã¡ã¬ãã€ãã®ã¹ã¯ãªãããå ¥åãããŸããããã¯ãã¯ã©ã€ã¢ã³ããããŠã³ããŒãããå¿ èŠãããã ãã§ãªãïŒããã¯å€§ããªç»åã«è¿œå ãããŸãïŒãããŠã³ããŒãåŸã«ãã©ãŠã¶ãäœããå®è¡ããŸããã¹ã¯ãªããã¯åã«ããã«é£ã¶ã ãã§ã¯ãããŸãããããã«ã99ïŒ ã®å Žåãã¹ã¯ãªãããæ©èœãããŸã§ããŠãŒã¶ãŒã¯æåãã衚瀺ããå¿ èŠã®ãããã¹ãŠã®çŸãããèŠãããšãã§ããŸãããã¯ã©ã€ã¢ã³ããããŠã³ããŒãããå¿ èŠããããã®ïŒãããŠããã¯å€§ããªåçã«è¿œå ãããŸãïŒãªã®ã§ããã©ãŠã¶ã¯ããŒãåŸã«ãããã䜿ã£ãŠäœããããŸã-圌ãã¯çç±ã®ããã«åœŒã®ãšããã«æ¥ãã ãã§ã¯ãããŸãããããã«ã99ïŒ ã®å Žåãã¹ã¯ãªãããæ©èœãããŸã§ããŠãŒã¶ãŒã¯æåãã衚瀺ããå¿ èŠã®ãããã¹ãŠã®çŸãããèŠãããšãã§ããŸãããã¯ã©ã€ã¢ã³ããããŠã³ããŒãããå¿ èŠããããã®ïŒãããŠããã¯å€§ããªåçã«è¿œå ãããŸãïŒãªã®ã§ããã©ãŠã¶ã¯ããŒãåŸã«ãããã䜿ã£ãŠäœããããŸã-圌ãã¯çç±ã®ããã«åœŒã®ãšããã«æ¥ãã ãã§ã¯ãããŸãããããã«ã99ïŒ ã®å Žåãã¹ã¯ãªãããæ©èœãããŸã§ããŠãŒã¶ãŒã¯æåãã衚瀺ããå¿ èŠã®ãããã¹ãŠã®çŸãããèŠãããšãã§ããŸããã
666KBã®ã¹ã¯ãªãããæ¬çªç°å¢ã«ãããã³ã«ããŠãŒã¶ãŒããµã€ãéçºè ã次ã®å°çã®èŒªã«éãã®ã«ååãªæéã ãããŒãžã®èªã¿èŸŒã¿æéãé·ããªããšããã®ãäžè¬çãªèãã§ããæå°æ§æã®Three.jsã®ééã¯628KBã§ã...
ããã«ãå€ãã®å Žåãã¿ã¹ã¯ã¯è€éãªããŒã«ã®æ¥ç¶ãå¿ èŠãšããŸãããããšãã°ãWebGLã§ãã¯ã¹ãã£ã䜿çšããŠããã€ãã®å¹³é¢ã衚瀺ããããã€ãã®ã·ã§ãŒããŒãè¿œå ããŠãç»åãæ³¢ç¶ã«çºæ£ããããã«ããã«ã¯ãThree.jså šäœã¯å¿ èŠãããŸããããŸãããªããžã§ã¯ããèœäžãããããã«ãæ¬æ Œçãªç©çãšã³ãžã³ã¯å¿ èŠãããŸãããã¯ããç¹ã«æ £ããŠããå Žåã¯ãäœæ¥ãã¹ããŒãã¢ããããå¯èœæ§ããããŸããããŠãŒã¶ãŒã®æéã§æéãæ¯æãããšã«ãªããŸããããã§ã誰ããèªåã«ãšã£ãŠäœãããæçã§ããããèªåã§æ±ºå®ããŸãã
å€æãã§ãŒã³ã調æŽãã
å®éãç»é¢äžã«3Dã·ãŒã³ãæ§ç¯ããããã®åº§æšå€æã®æ¬è³ªã¯éåžžã«åçŽã§ãããããã§ã段éçã«åæããŸããã»ãšãã©ã®å Žåããã®ããã»ã¹ã¯å€ãã®ã¬ã€ã¢ãŠãèšèšè ã«ãšã£ãŠæ°ãããã®ã«ãªãã§ãããã
以äžã§ãããã¶ã€ããŒã3Dã¢ãã«ãæãããšããŸãããããããç«æ¹äœãšããŸãïŒäŸã§ã¯ãå³ãè€éã«ããªãããã«æãåçŽãªæ§é ã䜿çšããŸãïŒïŒ
ãã®ã¢ãã«ã¯ã©ã®ãããªãã®ã§ããïŒå®éãããã¯ãã座æšç³»ã®ç¹ã®ã»ããã§ããããããã®éã®é¢ä¿ã®ã»ããã§ãããããå¹³é¢ãé 眮ããå¿ èŠãããç¹ã®éã«æ±ºå®ã§ããŸãã WebGLã®ã³ã³ããã¹ãã§ã®å¹³é¢ã®åé¡ã¯ããã©ãŠã¶ãŒèªäœã®è©ã«ããã£ãŠããã座æšã¯ç§ãã¡ã«ãšã£ãŠéèŠã§ããããããå€æããæ¹æ³ãæ£ç¢ºã«ç解ããå¿ èŠããããŸãã
ç§ãã¡ãèšã£ãããã«ãã¢ãã«ã«ã¯åº§æšç³»ããããŸããã§ãæ®æ®µã¯ããããã®ã¢ãã«ã欲ããã®ã§ãäžç·ã«ã·ãŒã³ãäœãããã§ãã 3Dã®äžçã§ããã·ãŒã³ã«ã¯ãç¬èªã®ã°ããŒãã«åº§æšç³»ããããŸããã¢ãã«ã®åº§æšãã°ããŒãã«åº§æšãšããŠè§£éãããšãã¢ãã«ã¯ãäžçã®äžå¿ãã«ãããã®ããã«é 眮ãããŸããèšãæããã°ãäœãå€ãããŸãããããããç§ãã¡ã¯æ¬¡ã®ãããªå€ãã®ã¢ãã«ãç§ãã¡ã®äžçã®ããŸããŸãªå Žæã«è¿œå ããããšèããŠããŸãã
äœããã¹ããïŒåã ã®ã¢ãã«ã®åº§æšãã°ããŒãã«åº§æšã«å€æããå¿ èŠããããŸãã空éå ã®ã¢ãã«ã®äœçœ®ã¯ããªãã»ãããå転ãã¹ã±ãŒãªã³ã°ã«ãã£ãŠèšå®ãããŸãããããã®åºæ¬çãªå€æã«ã€ããŠã¯ãã§ã«èŠãŠããŸããã次ã«ãã¢ãã«ããšã«å€æãããªãã¯ã¹ãäœæããå¿ èŠããããŸãããã®ãããªãã¯ã¹ã«ã¯ãã¢ãã«ãäžçãšã®é¢ä¿ã§ã©ãã«ããããããã³ã¢ãã«ãã©ã®ããã«å転ãããã«é¢ãããã®æ å ±ãæ£ç¢ºã«æ ŒçŽãããŸãã
ããšãã°ããã¥ââãŒãã®å Žåããããã次ã®è¡åããããŸãã
// .
// « » .
const modelMatrix1 = [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]
];
// , X.
const modelMatrix2 = [
[1, 0, 0, 1.5],
[0, 1, 0, 0 ],
[0, 0, 1, 0 ],
[0, 0, 0, 1 ]
];
// , X .
const modelMatrix3 = [
[1, 0, 0, -1.5],
[0, 1, 0, 0 ],
[0, 0, 1, 0 ],
[0, 0, 0, 1 ]
];
ããã«ããããã次ã®ããã«è¡åããŸãã
{
= [ ] *
}
ãããã£ãŠãåã¢ãã«ã«ã¯ç¬èªã®ãããªãã¯ã¹ãå¿ èŠã§ãã
åæ§ã«ãããã€ãã®ãªããžã§ã¯ãã®ãã§ãŒã³ãäœæã§ããŸããé³¥ã矜ã°ããå¿ èŠãããå Žåã¯ã矜ã®ãã€ã³ãã®åº§æšãé³¥ã®åº§æšã«å€æããŠãããã°ããŒãã«ãªäžçã®åº§æšã«å€æããã®ãé©åã§ããã°ããŒãã«åº§æšã§ç¿Œã®è»éãããã«æšæž¬ããæ¹ãã¯ããã«ç°¡åã§ããã¡ãªã¿ã«ãããã¯ããã§ãã
次ã«ãç§ãã¡ãäžçãã©ã¡ãåŽã«èŠããã決ããå¿ èŠããããŸããã«ã¡ã©ãå¿ èŠã§ãã
ã«ã¡ã©ã¯ãç©ççãªã«ã¡ã©ã®æš¡å£ã®ãããªæœè±¡åã§ããã°ããŒãã«åº§æšã§ã®äœçœ®ãå®çŸ©ãã座æšãšããã€ãã®åŸæè§ããããŸããç§ãã¡ã®ä»äºã¯ãçŸåšã°ããŒãã«ãªåº§æšã®ã»ãããã«ã¡ã©ã®åº§æšç³»ã«å€æããããšã§ããåçã¯åã®äŸãšåãã§ãã
{
= [ ] *
}
, , . !
æ¡ä»¶ä»ãã«ã¡ã©ãããå Žæããã®ã·ãŒã³ãèŠãŠã¿ãŸãããã
ããã§ããã¹ãŠã®ãã€ã³ããã«ã¡ã©åº§æšç³»ã«å€æããã®ã§ãZ軞ãç Žæ£ããX軞ãšY軞ããæ°Žå¹³ããšãåçŽããšããŠè§£éã§ããŸããç»é¢äžã«ã¢ãã«ã®ãã¹ãŠã®ãã€ã³ããæç»ãããšãäŸã®ããã«ç»åã衚瀺ãããŸããé è¿æ³ããªããã·ãŒã³ã®ã©ã®éšåãå®éã«ãã¬ãŒã ã«åãŸãããç解ããã®ã¯å°é£ã§ããã«ã¡ã©ã¯å šæ¹åã«ç¡éã®ãµã€ãºã®ãããªãã®ã§ããå¿ èŠãªãã®ãç»é¢ã«åãŸãããã«ãã¹ãŠã調æŽããããšã¯ã§ããŸãããã·ãŒã³ã®ã©ã®éšåãã«ã¡ã©ã®èŠéã«å ¥ãã®ããã©ã®éšåãå ¥ãã®ãã決å®ããæ®éçãªæ¹æ³ããããšäŸ¿å©ã§ãã
ç©ççãªã«ã¡ã©ã§ã¯ãèŠè§ãªã©ã®ããšã話ãããšãã§ããŸããããã«ãè¿œå ããŠã¿ãŸãããïŒ
ãã®ããã«ãå¥ã®ãããªãã¯ã¹ãã€ãŸãæ圱ãããªãã¯ã¹ãå¿ èŠã§ããäžè¬ã«ãããŸããŸãªæ¹æ³ã§æ§ç¯ã§ããŸããåæãã©ã¡ãŒã¿ãšããŠäœ¿çšããããã®ã«å¿ããŠããã®ãããªãã¯ã¹ã®ãã¥ãŒã¯ãããã«ç°ãªããŸãããæ¬è³ªã¯åãã§ãã次ã®å°ãç°¡ç¥åãããããŒãžã§ã³ã䜿çšããŸãã
// 90
const s = 1 / (Math.tan(90 * Math.PI / 360));
const n = 0.001;
const f = 10;
const projectionMatrix = [
[s, 0, 0, 0],
[0, s, 0, 0],
[0, 0, -(f)/(f-n), -f*n/(f-n)],
[0, 0, -1, 0]
];
æ圱ãããªãã¯ã¹ã«ã¯ãäœããã®æ¹æ³ã§3ã€ã®ãã©ã¡ãŒã¿ãŒãå«ãŸããŠããŸããããã¯ã衚瀺è§åºŠãšãäœæ¥ãããã€ã³ããŸã§ã®æå°è·é¢ãšæ倧è·é¢ã§ããããŸããŸãªæ¹æ³ã§è¡šçŸã§ããããŸããŸãªæ¹æ³ã§äœ¿çšã§ããŸããããããã®ãã©ã¡ãŒã¿ãŒã¯ãšã«ãããã®ãããªãã¯ã¹ã«å«ãŸããŸãã
ãããªãã¯ã¹ããã®ããã«èŠããçç±ãã¯ã£ããããªãããšã¯ç解ããŠããŸããã説æãä»ããŠå°åºããã«ã¯ã2ã3ããŒãžã®åŒãå¿ èŠã§ããããã«ãããæœè±¡åããããšãæçšã§ãããšããèãã«åã³æ»ããŸããç¹å®ã®åé¡ã解決ããå¿ èŠããªã詳现ã«ç«ã¡å ¥ãããšãªããããäžè¬çãªçµæã§æäœã§ããŸãã
ããŠããã§ã«ããªãã¿ã®å€æãè¡ããŸãïŒ
{
= [ ] *
}
ç§ãã¡ã¯ãç§ãã¡ãæåŸ ãããã®ãæ£ç¢ºã«èŠéã«å ¥ããŸããè§åºŠã倧ãããããšïŒã»ãšãã©ãã¹ãŠã®åŽé¢ãèŠããè§åºŠãå°ãããããšïŒãã«ã¡ã©ãåããããŠããæ¹åã«è¿ããã®ã ããèŠããŸããå©çïŒ
ããããå®éã«ã¯ãããŸãããèŠç¹ãå¿ããŠããŸããŸãããããã€ãã®å Žæã§çµ¶æçãªçµµãå¿ èŠãªã®ã§ãã©ãã«ãããŠãããè¿œå ããå¿ èŠããããŸãããããŠããã§ãçªç¶ããããªãã¯ã¹ã¯å¿ èŠãããŸããããã®äœæ¥ã¯éåžžã«é£ããããã«èŠããŸãããåãã€ã³ãã®X座æšãšY座æšãWã§å¹³å¡ã«åå²ããããšã§è§£æ±ºãããŸãã
*ããã§ã¯ãã«ã¡ã©ã暪ã«ç§»åãããåºã«ãå¹³è¡ç·ãè¿œå ããŠããã®é è¿æ³ãã©ãã«è¡šç€ºãããããæ確ã«ããŸããã
奜ã¿ã«åãããŠä¿æ°ãéžæããããšã§ãããŸããŸãªèŠç¹ã®ãªãã·ã§ã³ãåŸãããŸããããæå³ã§ãããã§ã®ä¿æ°ã¯ãã¬ã³ãºã®ã¿ã€ããã€ãŸãåšå²ã®ç©ºéãã©ãã ããå¹³åŠåããããã決å®ããŸãã
ããã§å šäœåãããããŸãããåãã€ã³ãã®X座æšãšY座æšãååŸããŠã奜ããªæ¹æ³ã§ç»é¢ã«æç»ã§ããŸãã
äžè¬ã«ãããã¯ã·ãŒã³ãæ§ç¯ããã®ã«ååã§ãããå®éã®ãããžã§ã¯ãã§ã¯ãæåŸã«ã¹ã±ãŒãªã³ã°ã«é¢é£ããè¿œå ã®å€æãçºçããå ŽåããããŸããæ圱åŸãæ£èŠåããã座æšã§ãã1以å ã®åº§æšïŒxãyïŒãååŸãããããã«ç»é¢ãŸãã¯ãã£ã³ãã¹ã®ãµã€ãºãæããŠãç»é¢ã«è¡šç€ºãã座æšãååŸãããšããèãæ¹ã§ãããã®äœåãªæé ã«ããããã¹ãŠã®èšç®ãããã£ã³ãã¹ãµã€ãºãåé€ãããæåŸã«ã®ã¿æ®ãããŸããããã¯æã 䟿å©ã§ãã
ããã§ã¯ãããããæ å ±éã«æ©ãŸãããŠããã®ã§ãé床ãèœãšãããã¹ãŠã®å€æã1ãæã§ç¹°ãè¿ããŸãããã
ãããã®å€æã1ã€ã«çµã¿åããããšãå°ããªãšã³ãžã³ãåŸãããŸãã
Three.jsã§ã¯ã©ã®ããã«èŠããŸããïŒ
ãã®å°ããªãšã³ãžã³ãã©ãããæ¥ãã®ããããã£ãã®ã§ããäœãããªããThree.jsã®ããã©ã«ãã®é ç¹ã·ã§ãŒããŒã®äŸãèŠãŠã¿ãŸãããã
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
ãŸãã¯ããå®å šã«ïŒ
void main() {
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);
}
圌ã¯ããªãã«äœããæãåºãããŸããïŒã¯ããããã¯ãã®ç¹å®ã®ãšã³ãžã³ã§ãããŸãããäœãããªãããšã¯ãThree.jsããæ éã«æž¡ãããè¡åã«åºã¥ããŠã座æšãåèšç®ãããã¹ãŠã®äœæ¥ãå®è¡ããããšãæå³ããŸãããããã誰ãèªåã®æã§ãããã®ãããªãã¯ã¹ãäœæããããšãæ°ã«ããŸããããïŒ
ã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ãšThree.jsã®ã«ã¡ã©ã¿ã€ã
ã«ã¡ã©ã¿ã€ãã®ãããã¯ã¯ãããªãã¯ã¹ã«çŽæ¥é¢ä¿ããŸããããããã§ããThree.jsã«ã€ããŠè©±ããŠããã®ã§ãæ°åãè²»ãããŸããããã«ã€ããŠé ã®äžã§æ··ä¹±ããããšããããŸãã
ã«ã¡ã©ã¯æœè±¡åãããŠããŸããçŸå®ã®äžçãšåãããã«ã3Dã®äžçã§èããã®ã«åœ¹ç«ã¡ãŸãããã§ã«è¿°ã¹ãããã«ãã«ã¡ã©ã«ã¯ç©ºéå ã®äœçœ®ãèŠãæ¹åãããã³èŠéè§ããããŸããããã¯ãã¹ãŠã2ã€ã®ãããªãã¯ã¹ãšãå Žåã«ãã£ãŠã¯ãé è¿æ³ãäœæããããã®åº§æšã®è¿œå åå²ã䜿çšããŠæå®ãããŸãã
ã³ã³ãã¥ãŒã¿ã°ã©ãã£ãã¯ã¹ã«ã¯ããé è¿æ³ããããšãé è¿æ³ãªããã®2çš®é¡ã®ã«ã¡ã©ããããŸãããããã¯ãæè¡çã«ã¯æ ¹æ¬çã«ç°ãªã2ã€ã®ã¿ã€ãã®ã«ã¡ã©ã§ãããç»åãååŸããã«ã¯ç°ãªãã¢ã¯ã·ã§ã³ãå¿ èŠã§ãããããŠããããã¹ãŠã§ããä»ã«ã¯äœããããŸãããä»ã®ãã¹ãŠã¯ãããã®çµã¿åããã§ãããããã€ãã®ããè€éãªæœè±¡åã§ããããšãã°ãThree.jsã«ã¯ã¹ãã¬ãªã«ã¡ã©ããããŸããããã¯æè¡çã«ã¯ãç¹æ®ãªã¿ã€ããã®ã«ã¡ã©ã§ã¯ãªããåãªãæœè±¡åã§ãã2å°ã®ã«ã¡ã©ã¯ã空éçã«ãããã«ééã空ããŠæãã«é 眮ãããŠ
ããŸããç»é¢ã®ååããšã«ãç¬èªã®ã«ã¡ã©ã䜿çšããŸããã¹ãã¬ãªç»åããããŠãCubeCameraã¯ãããå°ç¹ããç°ãªãåŽã«é 眮ããã6ã€ã®éåžžã®ã«ã¡ã©ã§ãã
次ã¯äœã§ããïŒ
ãªããžã§ã¯ãã®åº§æšãååŸããåŸã®æ¬¡ã®ã¹ãããã¯ãã©ã®ãªããžã§ã¯ãã衚瀺ããã©ã®ãªããžã§ã¯ããä»ã®ãªããžã§ã¯ãã®åŸãã«é ããã決å®ããããšã§ãã WebGLã®ã³ã³ããã¹ãã§ã¯ããã©ãŠã¶ããããèªåçã«å®è¡ããŸãããŸãããããã«ãã¯ã¹ãã£ãé©çšãããæ³ç·ã圱ãç»åã®åŸåŠçãªã©ã«ããç §æã®èšç®ãªã©ã®é¢é£ã¿ã¹ã¯ã¯ãŸã ãããŸããããããç§ãã¡ã¯ãã§ã«ç解ããã®ã«æãéèŠã§é£ããéšåãè¡ã£ãŠããŸããããã¯çŽ æŽããããå®éãå€ãã®çæç©ã¯ãããã®ãã¯ã¹ãã£ãç §æãå¿ èŠãšããªãã®ã§ãä»åŸãããç¥èã¯ããããæ±ãã®ã«ååã§ããå¯èœæ§ããããŸãã
ã¡ãªã¿ã«ããªããžã§ã¯ãããå¹³é¢ã«åœ±ãèœãšãã®ã¯ããã®ãªããžã§ã¯ãããã®å¹³é¢ã«ç¹å®ã®è§åºŠã§æ圱ããåŸãè²ãæ··ããã ãã§ãããã®ããã»ã¹ã¯æ¬è³ªçã«ã«ã¡ã©ãšéåžžã«äŒŒãŠããŸãããæ圱é¢ãšãèŠç·ã®æ¹åãã®éã«è§åºŠãè¿œå ããŸãã
ã©ã€ãã©ãªãªããå«ããWebGLäžã®ç»åã®ãã¯ã¹ãã£ãšå¹æã«ã€ããŠã¯ã以åã®èšäºã§äœåºŠã話ããŸããããã®ãããã¯ã«èå³ãããå Žåã¯ãããããåç §ã§ããŸãããããã£ãŠãããããã¹ãŠã®ç¥èãçµã¿åãããããšã§ãæ¬æ Œçãªã«ã©ãã«ãª3Dã®ãã®ãèªåã®æã§æ§ç¯ããããšãã§ããŸãã
3D- . â - . , Three.js . , , , - , - . , .
ä»ããããããªãã¯ã¹ã®æ¬¡ã®äœ¿çšäŸã®ããã«é ã®äžã«äœè£ãããããã«ãäžèšãèŠçŽãããšãã§ãã
ããïŒ
- ãããªãã¯ã¹ããã®ãã¬ã€ã³ã䜿çšããŠã3Dã¯ãŒã«ããæ§ç¯ããèªåã®æã§ç»é¢äžã®ãªããžã§ã¯ãã®åº§æšãèšç®ã§ããŸãã
- 3Dã®äžçã§ã¯ããã«ã¡ã©ãã®ãããªæœè±¡åã§åäœããŸããå Žæãæ¹åãèŠè§ããããŸããããã¯ãã¹ãŠãåããããªãã¯ã¹ã䜿çšããŠèšå®ãããŸãããããŠã2ã€ã®åºæ¬çãªã«ã¡ã©ãã¥ãŒããããŸã-é è¿æ³ãšéé è¿æ³ã§ãã
- WebGLã®ã³ã³ããã¹ãã§ã¯ãç»é¢äžã«ç»åãææžãããããç©ççãªèšç®ãè¡ã£ãããããšãå€ãã®å Žåã倧ããªäŸåé¢ä¿ãåé€ãããããŒãžã®èªã¿èŸŒã¿ãé«éåãããŸãããã ããã¹ã¯ãªãããæ¢è£œã®ããŒã«ãããã³åé¡ã解決ããããã®ä»£æ¿ãªãã·ã§ã³ã®ãã©ã³ã¹ãåããå©äŸ¿æ§ã ãã§ãªããããŠã³ããŒãé床ãšé»è©±ãå«ã究極ã®ããã©ãŒãã³ã¹ã®åé¡ã«ã泚æãæãããšãéèŠã§ãã
IIIãç»åã®ãã£ã«ã¿ãŒ
æåŸã«ãç»åã®ãã£ã«ã¿ãŒãªã©ã®ãããªãã¯ã¹ã®é©çšé åã«ã€ããŠèŠãŠãããŸããRGBA圢åŒã®è²ããã¯ãã«ãšèŠãªããšãããã§ã¯ã座æšã§äœ¿çšãããã®ãšåæ§ã®å€æãé©çšã§ãããšæ³å®ã§ããŸãã
ãããŠãæãããªååã«åŸã£ãŠããããç»åã«é©çšããŸãã
{
= [ ] *
}
ã¢ã€ãã³ãã£ãã£ãããªãã¯ã¹ããããªãã¯ã¹ãšããŠæ©èœããå Žåãäœãå€æŽãããŸãããããã¯ãã§ã«ããã£ãŠããŸããå€æããã³ã¹ã±ãŒã«å€æãšåæ§ã®ãã£ã«ã¿ãŒãé©çšãããšã©ããªããŸããïŒ
OUããã®çµæãæãããšã³ã³ãã©ã¹ãã®ãã£ã«ã¿ãŒãåŸãããŸããé¢çœãã
ãã®ãããªãã£ã«ã¿ãŒãè©Šããšãã¯ãç»åãé²åºãªãŒããŒã«ãªããªãããã«å€ã調æŽããããšãåžžã«å¿ããªãã§ãã ãããäœãã«å€§ããªæ°ãæããå Žåãããããã©ããã§äœããæžç®ãŸãã¯é€ç®ããå¿ èŠããããŸããåã®äŸã«ç€ºããããã«ã
ã«ã©ãŒç»åããçœé»ç»åãäœæããã«ã¯ã©ãããã°ããã§ããïŒæåã«é ã«æµ®ãã¶ã®ã¯ãRGBãã£ãã«å€ãè¿œå ãã3ã§é€ç®ããŠãçµæã®å€ã3ã€ã®ãã£ãã«ãã¹ãŠã«äœ¿çšããããšã§ãããããªãã¯ã¹åœ¢åŒã§ã¯ã次ã®ããã«ãªããŸã
ãçœé»ã®ç»åãååŸããŸããããããã§ãæ¹åã§ããŸããç§ãã¡ã®ç®ã¯å®éã«ã¯ç°ãªãè²ã®æãããç°ãªã£ãŠèªèããŸãããããŠãäžé£œååäžã«ãããäœããã®åœ¢ã§äŒããããã«ããã®ãããªãã¯ã¹ã®RGBãã£ãã«ããšã«ç°ãªãä¿æ°ãäœæããŸãã
以äžã®äŸã¯ããããã®ä¿æ°ã®äžè¬çã«åãå ¥ããããŠããå€ã瀺ããŠããŸããã誰ããããããããããšã¯ãããŸãããåèšãããšããããã®ä¿æ°ã¯1ã«ãªãã¯ãã§ãããæ¯çã«å¿ããŠããããã«ç°ãªãçœé»ã®ç»åãåŸãããŸããããã¯ããã£ã«ã ã«ã¡ã©ã§äœæ¥ãããšãã«ãããçšåºŠãç°ãªãè²ã®åçŸãã·ãã¥ã¬ãŒãã§ããŸãã
ãŸããã¡ã€ã³ã®å¯Ÿè§ç·ãå°ãä¹ç®ãããšããŠãããŒãµã«é£œåãã£ã«ã¿ãŒãåŸãããŸãã
ããã¯ãäžé£œåïŒå®å šã«çœé»ã®ç»åã«å°éã§ããŸãïŒãšé£œåã®äž¡æ¹ã§æ©èœããŸããããã¯ãã¹ãŠå¯Ÿå¿ããä¿æ°ã«äŸåããŸãã
äžè¬ã«ããã£ã«ã¿ãŒãé·æé䜿çšãããšãããŸããŸãªçµæãåŸãããŸãã
*ãã®äŸã§äœ¿çšãããŠãããããªãã¯ã¹ã¯ãGitHubã§è¡šç€ºã§ããŸããçªç¶å¿ èŠã«ãªã£ãå Žåãèšäºã«æ¿å ¥ããã«ã¯ãããªã¥ãŒã ãéå°ã«ãªããŸãã
ãããããããå®éã«ã©ãã«åœãŠã¯ãŸããã«ãŸã å°ã泚æãæããŸããããåãã¯ã»ã«ã®è²ã眮ãæãããšããã¢ã€ãã¢èªäœããåçãåŠçãããã3Dã·ãŒã³ãåŸåŠçãããããããã®ã·ã§ãŒããŒã瀺åããŠããããšã¯æããã§ãããããã§ãããã³ããšã³ãã®ã©ããã«ããã®ã§ããããïŒ
CSSã®ãã£ã«ã¿ãŒ
CSSã«ã¯ãfilterããããã£ããããŸãããããŠãç¹ã«ãè²ã«é¢é£ãããã£ã«ã¿ãŒã«ã¯ãã®ãããªãªãã·ã§ã³ããããŸãã
- æããïŒäœããŸããïŒ
- ã³ã³ãã©ã¹ãïŒå®äºïŒ
- å転ïŒã³ã³ãã©ã¹ããšåãã笊å·ãç°ãªãäž»ãªå¯Ÿè§ä¿æ°ã®ã¿ïŒ
- 飜åïŒå®äºïŒ
- ã°ã¬ãŒã¹ã±ãŒã«ïŒãã§ã«è¿°ã¹ãããã«ãããã¯é£œåã®ç¹æ®ãªã±ãŒã¹ã§ãïŒ
- ã»ãã¢ïŒéåžžã«æŒ ç¶ãšããæŠå¿µã§ãããŸããŸãªããŒãžã§ã³ã®ã»ãã¢ãä¿æ°ã§éã¶ããšã«ãã£ãŠåŸãããŸããããã§ã¯ãã©ããããããéã®ååšãæžãããŸãïŒ
ãããŠããããã®ãã£ã«ã¿ãŒã¯å ¥åãšããŠä¿æ°ãåãå ¥ããããã以åã«äœæãããããªãã¯ã¹ã«äœããã®åœ¢ã§ä»£å ¥ãããŸããããã§ããã®éæ³ãå éšããã©ã®ããã«æ©èœããããããããŸããããããŠä»ããããã®ãã£ã«ã¿ãŒãCSSã€ã³ã¿ãŒããªã¿ãŒã®å¥¥æ·±ãã§ã©ã®ããã«çµã¿åããããŠããããæããã§ãããªããªããããã®ãã¹ãŠã¯åº§æšãšåãåçã«åŸã£ãŠæ§ç¯ãããŠããããã§ããè¡åã®ä¹ç®-å¹æã®è¿œå ã確ãã«ãCSSã®ãã®ããããã£ã«ã¯ã«ã¹ã¿ã é¢æ°ãããªãã¯ã¹ã¯ãããŸãããããããããã¯SVGã«ãããŸãïŒ
SVGã§ãããªãã¯ã¹ããã£ã«ã¿ãªã³ã°ãã
SVGå ã«ã¯ãç»åã®ãã£ã«ã¿ãŒãäœæããããã«äœ¿çšãããfeColorMatrixããããŸãããããŠãããã§ç§ãã¡ã¯ãã§ã«å®å šãªèªç±ãæã£ãŠããŸã-ç§ãã¡ã¯èªåã®å¥œã¿ã«åãããŠãããªãã¯ã¹ãäœãããšãã§ããŸããæ§æã¯æ¬¡ã®ãããªãã®ã§ãã
<filter id=âmy-color-filterâ>
<feColorMatrix in=âSourceGraphicsâ
type=âmatrixâ,
values=â1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1â
/>
</filter>
CSSå ã®éåžžã®DOMèŠçŽ ã«SVGãã£ã«ã¿ãŒãé©çšããããšãã§ããŸããããã«ã¯ç¹å¥ãªurlé¢æ°ããããŸã...ããããç§ã¯ããªãã«ãããäŒããŸããã§ããïŒ
å®éãCSSå ã®SVGãã£ã«ã¿ãŒã¯ãŸã ãã¹ãŠã®ãã©ãŠã¶ãŒã§ãµããŒããããŠããããã§ã¯ãããŸããïŒIEã«æãåããŠããªãïŒããEdgeãæçµçã«ã¯ãã ãšã³ãžã³ã«ç§»è¡ãããšããåããããå€ãããŒãžã§ã³ã¯è¿ãå°æ¥ãµããŒãã倱ãããããã®ãã¯ãããžãŒã䜿çšããæãæ¥ãŸããããã¹ã¿ãŒãããªãã¯ããã§ããããã®é¢çœãããšãããããšãã§ããŸãã
ä»ã«äœãèµ·ãããŸããïŒ
å€æã®åçã«åºã¥ããŠæ§ç¯ãããç»åã®å¹æã«å ããŠããã¯ã»ã«ã®å€äœã«åºã¥ããŠæ§ç¯ãããããŸããŸãªãã®ãããããããã®è²ããã®ä»ã®æäœãæ··åããŸãããããªãã¯ã¹ã¯ããã®æäœãè¡ãããããŒã¿ãæ ŒçŽããããã®åªãã圢åŒã«ãªããŸãã
ã«ãŒãã«ãããªãã¯ã¹
ç¹ã«ãããã³ããšã³ãã§ã¯ãã«ãŒãã«ãããªãã¯ã¹ãããã«é¢é£ããå¹æãªã©ã«ééããŸãããã€ã³ãã¯åçŽã§ããæ£æ¹åœ¢ã®ãããªãã¯ã¹ããããéåžžã¯3x3ãŸãã¯5x5ã§ããããã以äžã®å Žåããããä¿æ°ãæ ŒçŽãããŸãããããªãã¯ã¹ã®äžå€®ïŒãçŸåšã®ããã¯ã»ã«ã®å Žåãäžå€®ä»è¿ïŒã§é£æ¥ãããã¯ã»ã«ã®å Žåããããªãã¯ã¹ã5x5ã®å ŽåãçŸåšã®ãã¯ã»ã«ãã1ã€ã§ãããã¯ã»ã«ã®å Žåãäžå€®ã®åšãã«å¥ã®ã¬ã€ã€ãŒã衚瀺ãããŸãã 7x7ã®å Žåãå¥ã®ã¬ã€ã€ãŒãªã©ãèšãæããã°ããããªãã¯ã¹ããã®ãããª2次å ãã£ãŒã«ããšèŠãªãããã®äžã«ããã§ã«æ¹çšåŒãåç §ããã«ãä»»æã§ä¿æ°ãé 眮ããããšãã§ããŸãããããŠããããã¯æ¬¡ã®ããã«è§£éãããŸãã
{
=
,
}
空çœã®ãã£ã³ãã¹ã¯ãã®ãããªã¿ã¹ã¯ã«ã¯ããŸãé©ããŠããŸããããã·ã§ãŒããŒã¯éåžžã«åäžã§ãããã ãããããªãã¯ã¹ã倧ããã»ã©ã䜿çšããé£æ¥ãã¯ã»ã«ãå¢ããããšã¯å®¹æã«æšæž¬ã§ããŸãããããªãã¯ã¹ã3x3ã®å Žåã5x5ã25ã®å Žåã7x7ã49ã®å Žåãªã©ã9è²ãè¿œå ããŸããããå€ãã®æäœ-ããã»ããµãŸãã¯ãããªã«ãŒããžã®ããå€ãã®è² è·ãããã¯å¿ ç¶çã«ããŒãžå šäœã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããŸãã
ãªã¢ã«ã¿ã€ã ã§ã©ããã«ãªãŒããŒã¬ã€ããå¿ èŠãããå Žåã¯ãå¯èœãªéãããã®ãããªå¹æã«å°ããªãããªãã¯ã¹ã䜿çšããŠãã ããã
SVGå ã«ã¯ããã®ãããªå¹æãäœæããããã ãã«äœæãããç¹å¥ãªfeConvolveMatrixã¿ã°ããããŸãã
<filter id=âmy-image-filterâ>
<feConvolveMatrix
kernelMatrix=â0 0 0
0 1 0
0 0 0â
/>
</filter>
ããã§ã¯ãäœãããªãç»åã®åçŽãªãã£ã«ã¿ãŒãäœæããŸãã-åãã¯ã»ã«ã®æ°ããè²ã¯ãçŸåšã®è²ã«1ãæãããã®ã«çãããªããé£æ¥ãããã¯ã»ã«ã®è²ã®å€ã¯0ã«ãªããŸãã
ãã©ãŠã¶ãç°ãªãã°SVGã®ã¬ã³ããªã³ã°ãç°ãªããã«ã©ãŒã¬ã³ããªã³ã°ãéåžžã«åºããããŒãããå¯èœæ§ãããããšã«æ³šæããŠãã ãããæã ãéãã¯å£æ» çã§ãããããã£ãŠãåžžã«SVGãã£ã«ã¿ãŒããã¹ããããããã£ã³ãã¹ã䜿çšããŠãã ãããããã¯ãç§ãã¡ã®ã³ã³ããã¹ãã§ããäºæž¬å¯èœã§ãã
æ°åã倧ãããã®ããå°ãããã®ãžãšã¬ã€ã€ãŒã«é 眮ãå§ãããšããŒãããŸã
ããããªãã¯ã¹ã倧ããã»ã©ãæ¥è§Šããé£æ¥ãã¯ã»ã«ãå€ããªããç»åãããå€ãæŽæµãããŸããããã§éèŠãªããšã¯ãå€ãæ£èŠåããããšãå¿ããªãããšã§ããããããªããšãç»åãæãããªããŸãã
ããã§ããŒãããã©ã®ããã«æ©èœããããããã£ãã®ã§ãCSSãŸãã¯SVGå ã®ããŒãžã§ãŒãããç©æ¥µçã«äœ¿çšãããšãã¬ãŒããçºçããçç±ãç解ã§ããŸãããã¯ã»ã«ããšã«ãã©ãŠã¶ãäžé£ã®èšç®ãè¡ããŸãã
ä¿æ°ã®ç¬Šå·ãå€æŽããŠããŸããŸãªãã¿ãŒã³ã§é 眮ããŠå®éšãéå§ãããšãã·ã£ãŒããªå¹æããšããžæ€åºãªã©ãåŸãããŸããèªåã§éãã§ã¿ãŠãã ãããããã¯åœ¹ç«ã€ãããããŸããã
ãããã£ãŠãåçããããªã«ããŸããŸãªå¹æããªã¢ã«ã¿ã€ã ã§äœæãããŠãŒã¶ãŒã®æäœã«äŸåãããããšãã§ããŸããããã¯ãã¹ãŠããªãã®æ³ååã«äŸåããŸãã
å°èš
ãã®éšåã§èšãããããšãèŠçŽããŸãããïŒ
- ãããªãã¯ã¹ã¯ã座æšã«é¢é£ããå€æã ãã§ãªããã«ã©ãŒãã£ã«ã¿ãŒã®äœæã«ã䜿çšã§ããŸãããã¹ãŠãåãååã«åŸã£ãŠè¡ãããŸãã
- ãããªãã¯ã¹ã¯ãèŠèŠå¹æã®ããŸããŸãªä¿æ°ãªã©ãäžéšã®ããŒã¿ã®äŸ¿å©ãª2Dã¹ãã¬ãŒãžãšããŠäœ¿çšã§ããŸãã
çµè«
è€éãªã¢ã«ãŽãªãºã ããå°ãæœè±¡åãããšããããªãã¯ã¹ã¯å®éã®åé¡ã解決ããããã®æé ãªããŒã«ã«ãªããŸãã圌ãã®å©ããåããŠãCSSãSVGã®ãã¬ãŒã ã¯ãŒã¯å ãå«ããèªåã®æã§å¹ŸäœåŠçå€æãèšç®ãããã3Dã·ãŒã³ãæ§ç¯ããããWebGLã®ãã¬ãŒã ã¯ãŒã¯å ã§åçãç»åã®åŸåŠççšã®ããããçš®é¡ã®ãã£ã«ã¿ãŒãäœæãããã§ããŸãããããã®ãããã¯ã¯ãã¹ãŠãéåžžãåŸæ¥ã®ããã³ããšã³ããè¶ ããŠãäžè¬ã«ã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ã«é¢é£ããŠããŸããããããã®åé¡ãçŽæ¥è§£æ±ºããªããŠãã解決ã®ååãç¥ã£ãŠãããšãäžéšã®ããŒã«ãã©ã®ããã«æ©èœããããããããç解ã§ããŸããããã¯æ±ºããŠäžå¿ èŠã«ãªãããšã¯ãããŸããã
ãã®èšäºããããã³ããšã³ãã§ã®ãããªãã¯ã¹ã®å®çšåã®ãããã¯ãç解ããã®ã«åœ¹ç«ã€ããå°ãªããšãããããªãéçºã§æ§ç¯ã§ããåºç€ãæäŸããããšãé¡ã£ãŠããŸããæ°åŠãç©çåŠã«é¢é£ããä»ã®ããã€ãã®ãããã¯ãã¬ã€ã¢ãŠãã®ã³ã³ããã¹ãã§åãã¬ãã¥ãŒã«å€ãããšæãå Žåã¯ãã³ã¡ã³ãã«ããªãã®èããæžããŠãã ããããããã次ã®èšäºã®1ã€ã§ãããã«ã€ããŠèª¬æããŸãã