DeepGlyphã§æãã課é¡ã¨AI JIMOJI

å æã®1æ23æ¥ã«ãèªåããããã©ã³ããèªç±ã«æ¥½ããä¸çã¨ããã³ã³ã»ããã®ãµã¼ãã¹ãMOJICITY (ããã·ãã£) ããå ¬éããã¾ããããã¡ãã®ãµã¼ãã¹ã®ã³ã³ãã³ããAI JIMOJIãã§ã¯ææ¸ãã®æåãOpenTypeãã©ã³ãã«ãªãã¨ããã¨ã¦ãé¢ç½ãä½é¨ãã§ãã¾ããä»åãã®ãã©ã³ãçæã·ã¹ãã å®è£ ã®ä¸é¨ã«é¢ãããã¦ããã ãã¾ããã
ç§ã¯ä»¥åå人ã®ããã¸ã§ã¯ãã¨ãã¦ä¼¼ããããªã³ã³ã»ããã®ãDeepGlyphããéçºãã¦ãããã¨ããããAI JIMOJIã¨ã®é¢é£ã説æãã¹ããã¨æããã¡ãã§ããã°ã®å½¢ã§å ¬éãã¾ããDeepGlyphã®Betaçå ¬é以鿴æ°ãæ¢ã¾ã£ã¦ããä»¶ã (ãã¿ã¾ããâ¦) åããã¦æ¸ããã¨æãã¾ãã
æåã«ã¾ã¨ããã¨ã
- DeepGlyphã¯å ¬é以éãµã¼ãã¹ã®æ¹åæ§ã¨æè¡çãªèª²é¡ã®ãã¹ããããè§£æ¶ã§ããè¡ãè©°ã¾ã£ã¦ãã
- AI JIMOJIã¨DeepGlyph㯠(ä¸è¦) ç®çã¯ä¼¼ã¦ãããã¢ããã¼ãã¯å ¨ãç°ãªã
- AI JIMOJIã¯å¤ãã®ã¡ã³ãã¼ã«ããR&Dã®ææã«ãããã®ã§ãç§ã®ã¢ã¤ãã£ã¢ã¯ä¸é¨ã®ã¿
DeepGlyphã®ãªãªã¼ã¹ä»¥ééçºãæ¢ã¾ã£ã¦ããã®ã¯ãªãï¼
ããã¤ãã®é¢ã§ãDeepGlyphãå®ç¾ãããæ¹åæ§ã¨DeepGlyphãã§ãããã¨ã¨ã®ãã¹ããããèªèããããã§ãã

DeepGlyphãå®ç¾ãã¦ãããã¨ã¯ãã´ã·ãã¯ä½ãææä½ãªã©ã®ãã©ã³ããå°ãªããµã³ãã«ããçæãããã¨ãã§ããã䏿¹ã§Betaçã®ãªãªã¼ã¹ä»¥éãDeepGlyphã®ç®çããèªåã®æ¸ããæåããã©ã³ãã¨ãã¦çæããããã®ã¨ãã¦èªèããã¦ããããã§ãããä¸è¦åããããªç®çã«è¦ãã¾ããããã®2ã¤ã¯ç¹å¾´ã¨ãã¦å¤§ããéã£ã¦ãã¾ãã
åè ã®ã´ã·ãã¯ä½ãææä½ãªã©ã®ä¸è¬çã«ä½¿ããããã©ã³ãã®æå (ç´ããããã®ã§ä»¥å¾ã°ãªãã¨è¡¨ç¾) ã¯ãä¸è¦ãã©ã³ããã¨ã«å¤ãã®ããªã¨ã¼ã·ã§ã³ãæã£ã¦ããããã«è¦ãã¾ãããæåå ¨ä½ãè¦ãã¨çµ±ä¸æãæã£ã¦ãã¶ã¤ã³ããã¦ãããã®ã§ãããã©ã³ãã¯å©ç¨ç®çä¸ãããããã®ã°ãªãã¯ã¹ããã¼ã¯ã®å¹ ãä½ç½ã®æã¡æ¹ãä¸ã¤ã®ãã©ã³ãã®ä¸ã§ä¸è²«ãã¦ãã¾ããããã¯ãã°ãªãã®çæããæ·±å±¤å¦ç¿ãç¨ããçæã®ã¿ã¹ã¯ã¨ãã¦é©ãã¦ããã¨ç§ãèããçç±ã®ä¸ã¤ã§ãããã¾ãã
䏿¹ã§ãææ¸ãã®æåã¯ãã®ãããªã°ãªãã¨ã¯ç°ãªãã«ã¼ã«ã§ä½ããããã®ã§ããåä¸äººç©ãæ¸ããæåã¨ããæå³ã§ã¯ä¸è²«æ§ã¯ããã¾ããããã®ç¹å¾´ã¯ã°ãªãã®æã¤ç¹å¾´ã¨ã¯å ¨ãç°ãªããã®ã§ãæ¬æ¥DeepGlyphãç®çã¨ãã¦ããªããã®ã§ãããããDeepGlyphã®ã¿ã¹ã¯ãææ¸ãæåã®çæã«ããå ´åã¯ããã¼ã¿ã»ãããããããã®çææ¹æ³ããèãç´ããªãã¨ãããªãã¯ãã§ããDeepGlyphã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãææ¸ãæåãåãä»ããããªè¦ãç®ã«ãªã£ã¦ããã®ãåéãã®ä¸å ã§ããããã®é¨åã®èªèããããã¾ã¾ã 㨠(ææ¸ãæåã¨ãã¦) æå¾ ã¯ããã®çæçµæã«ãªã£ããã¨ãã失æãã¦ã¼ã¶ã¼ã«ä¸ãç¶ãã¦ãã¾ãããã§ããã

ããã§ã¯ã°ãªãã®çæã«ç¹åããã¢ããªã±ã¼ã·ã§ã³ã«æ¹åãã¦ãããï¼ ã¨èããã¨ããã主ã«ã¯ãªãªãã£ã®é¢ã§å£ã«ã¶ã¤ããã¾ããBetaçã使ã£ã¦ã¿ãæ¹ã¯çè§£ãã¦ãããããã¨æãã¾ãããçæããããã©ã³ãã¯å ¨ä½ã¨ãã¦ä¸è²«æ§ã¯ãããã®ã®ãªãã¨ãªããµã«ããµã«ãããã°ãªãã«ãªããã¡ã§ããµã³ãã«ã¨ãã¦å ¥åããã°ãªãã¨ãããã»ã©ä¼¼ã¦ããªãã¨ããåé¡ãããã¾ãã
åæã¨ã㦠(ææ¸ãæåã§ã¯ãªã) èªåã®ãã¶ã¤ã³ããã°ãªãã®ãã©ã³ããä½ãããï¼ ã¨ããDeepGlyphã®ã¦ã¼ã¹ã±ã¼ã¹ãèããã¨ãã«ãæ¯è¼çãã©ã³ãã«å¯¾ããå質ã¸ã®ç®ãå³ããããªã¦ã¼ã¶ã¼ã¨ã®ç¸æ§ã¯å ã ããããã¾ããã§ãã*1ã æ®å¿µãªããç¾ç¶ã®çæå質ã§ã¯ããããã£ãã¦ã¼ã¶ã¼ã®æ¹ãæºè¶³ãããããããã¯ãããã¯ãã«ã¯ãªã£ã¦ãã¾ããããããå®ã¯åè³ªãæ¹åããã¢ã¤ãã£ã¢ã¯ç¡ããã¨ã¯ãªãã§ãããå ·ä½çã«å¦ç¿ã«è½ã¨ãè¾¼ãæ¹æ³ãè¦ãã ãã¦ããªãã¨ããç¶æ ã§ãã
ãã®ãããªãã¨ãå»¶ã èããçµæãã¢ããªã±ã¼ã·ã§ã³ã¨ãã¦ã®DeepGlyphãçºå±ãããæ¹åãæ±ºããããªãã¾ã¾ä»ã«è³ã£ã¦ãã¾ãããã ãå¤å½©ãªã°ãªããèªåçæããæ¹æ³ã¨ãã¦DeepGlyphã使ããªãã¨ãããã¨ã¯ãªããã¿ã¹ã¯æ¬¡ç¬¬ã§æç¤ºã§ãããã®ãã¾ã ã¾ã ããã¨æã£ã¦ãã¾ããSIGGRAPH 2021ã§çºè¡¨ããããGoshuin 2.0 *2 ãã¯å¾¡æ±å°ãèªåçæããã¨ããã·ã¹ãã ã§ãèªåçæãã§ãããã¨ã¨ã¿ã¹ã¯ã¨ã®ç¸æ§ã®è¯ããæãã¾ããã
ããã¦ãªãä»ã«ãªã£ã¦ãã©ã³ãçæã¢ããªã±ã¼ã·ã§ã³ãAI JIMOJIã¨ããå½¢ã§å ¬éãããã®ããã¨ãã話ã¯ã¾ãé·ããªã£ã¦ãã¾ãã®ã§ãããçµæçã«ã¯å¾è ã®ãèªåã®æ¸ããæåããã©ã³ãã¨ãã¦çæãããã¨ããç®çãéæãããã®ã«ãªãã¾ããã
AI JIMOJI ã«ã¤ãã¦
ããã§æããã«ãã¦ããã¾ãããAI JIMOJIã¯æç¢ºã«ãã©ã³ãã¯ã¼ã¯ã¹ç¤¾ã®æä¾ãããµã¼ãã¹ã§ãããDeepGlyphã¨ã¯ç´æ¥çãªé¢ä¿æ§ã¯ããã¾ããããã©ã³ãã®çæã¢ã¤ãã£ã¢ã¯ç§ä»¥å¤ã®è¤æ°äººã¨ã®R&Dã®çµæã§ããã®çæææ³ã¯DeepGlyphã¨å ¨ãéããã®ã«ãªã£ã¦ãã¾ãã
ã§ã¯ãªãDeepGlyphãã»ã£ããããã«ãã¦å®£ä¼ãã¦ãããã¨ããã¨ããã®ãµã¼ãã¹ãæä¾ãããã©ã³ãçæã®å ã«ç§èªèº«ãèå³ã¨æå¾ ãæã£ã¦ããããã§ããããã¯ãAI JIMOJIãæ¥æ¬èªã«ãããæå¤§ã®ææ¸ãæåãã¼ã¿ã»ããã¨ãªãå¯è½æ§ãã¾ãæãå質ã®è¯ãææ¸ãæåãã¼ã¿ã»ããã«ãªãå¯è½æ§ã§ãã
MNISTã«ä»£è¡¨ãããããã«ãææ¸ãæåã®ãã¼ã¿ã»ããã¯ãããããã (å¹ Ãé«ãã®2次å é å) å½¢å¼ã大åã§ãããã®å½¢å¼ã¯å¦ç¿ãã¼ã¿ã¨ãã¦åãæ±ãããããã®ã§ãããããããããå½¢å¼ã«è½ã¨ãè¾¼ãéã«ã©ããã¦ããã¼ã¿ã¨ãã¦ã®æ å ±éã失ããã¦ãã¾ãã¾ãã

AI JIMOJIãç®æãç®çãããã©ã³ãã®çæã ããç®çã¨ã¯éãããããããQuick, Draw!ãã®ãããªã³ã³ã»ããã§çºå±ãã¦ãããµã¼ãã¹ã ã¨æã£ã¦ãã¾ãã2022å¹´1æã«ä¸æ¦ã¯Webãµã¼ãã¹ã®ã³ã³ãã³ãã¨ãã¦ç»å ´ãã¾ããããä»å¾ãããããªå½¢ã§ã®å±éãæ¤è¨ãã¦ããã¨ã®ãã¨ã§ãä»å¾ã©ã®ããã«çºå±ãã¦ããã®ã楽ãã¿ã§ãã
ä¸éçºè ã¨ãã¦ããã²AI JIMOJIã使ã£ã¦ãã©ã³ãçæã楽ãã¿ãªããå質åä¸ã«å½¹ç«ã¦ã¦ãããããã§ããã¹ãã¼ããã©ã³ã¨æã§æ¸ãã¦ãè¯ãã§ãããã§ããã°ãæå ã®iPad+Apple Pencilã§è©¦ãã¦ã¿ã¦ãã ããï¼
*1:ãããææ¸ãæåã§ã¯ãªãã°ãªããçæããããã¤ããã©ã³ãã®å質ã«å¯¾ããè¦æ±ãå³ãããªããã¦ã¼ã¹ã±ã¼ã¹ãæãã¤ããæ¹ã¯ãã£ããç§ã«æãã¦ä¸ããð¥º
*2:Shimizu, Shuma, et al. "Goshuin 2.0: Construction of the Worldâs Largest Goshuin Dataset and Automatic Generation System of Goshuin with Neural Style Transfer." ACM SIGGRAPH 2021 Posters. 2021. 1-2. https://dl.acm.org/doi/10.1145/3450618.3469160
SVG+CSS Animationã§Live2Dãåãã

å¹´æ«å¹´å§ã®èªç±ç ç©¶ã¨ãã¦ãCSSã ãã§Live2Dãåãããã¨ãã§ããªããã試ãã¦ãã¾ãããç´ä½æ²æãã£ããã®ã®ããªãã¨ãåãããã¨ãããã¨ãåãã£ãã®ã§ã²ã¨ã¾ãæ å ±å ±æã
Live2Dã¨ã¯
Live2Dã¯ã2Dã®ã¤ã©ã¹ããã¢ã¼ãã£ã³ã°æè¡ã使ã£ã¦ã¢ãã¡ã¼ã·ã§ã³ãããã½ããã¦ã§ã¢ã§ãããã®ã¢ããªã²ã¼ã ã®ãã£ã©ã¯ã¿ã¼ãããã®VTuberãåããããã«ä½¿ããã¦ãã¾ãã

ããããï¼ï¼ï¼
ã¢ãã«ãã¼ã¿ã表示ããã
Source: CSSLive2D/src/01_parse at master · spring-raining/CSSLive2D · GitHub
ã¾ããLive2Då
¬å¼ãµã¤ãã«ãããµã³ãã«ãã¼ã¿ã®ãã£ã©ã¯ã¿ã¼ãç»é¢ã«è¡¨ç¤ºããããã¨ãç®æ¨ã¨ãã¦ã¿ã¾ããåãã£ã©ã¯ã¿ã¼ã¯ããããã¢ãã«ãã¼ã¿ (Haru.moc3)ããã¯ã¹ãã£ç»å (*.png)ã表æ
ãã¼ã¿ (*.exp3.json)ãã¢ã¼ã·ã§ã³ãã¼ã¿ (*.motion3.json) ãªã©ãç¨æããã¦ããããã§ãã

ã¢ãã«ãã¼ã¿ã¯ãã¤ããªãã¤ä»æ§ãéå ¬éã«ãªã£ã¦ãã¾ããâ¦

å ¬å¼ã®Live2D Cubism Core SDKã使ãã¨ããç¨åº¦ã®æ å ±ãå¾ããã¨ãã§ãã¾ãã

ãã®æ
å ±ãèªã¿åã£ã¦ã¿ãã¨ãåãã¼ãã®å½¢ç¶ã«é¢ããæ
å ±ã¯ drawables ã«å«ã¾ãã¦ãããã¨ãåãã£ã¦ãã¾ãã
Live2Dã®ã¢ãã«ã¯ãã¼ãã®éåã§åºæ¥ã¦ãã¦ã1ã¤ã®ãã¼ãã«ã¯ã¡ãã·ã¥ã¨å¼ã°ããä¸è§å½¢ã®éåä½ãå²ãå½ã¦ããã¦ãã¾ããã¡ãã·ã¥ã®é ç¹ã¯ãã®ä½ç½®ã®ãã¯ã¹ãã£ã¨ç´ä»ãã¦ãããé ç¹ãåãããã¨ã§ãã£ã©ã¯ã¿ã¼ãã¢ãã¡ã¼ã·ã§ã³ããã¦ããããã§ãã

ããããã®ãã¼ãã«1æ1æç¬ç«ãããã¯ã¹ãã£ç»åã¯ç¨æããã¦ããããè¤æ°ã®ãã¯ã¹ãã£ãUVãããã®ãããªå½¢ã§ã¾ã¨ãããã¦ãã¾ã (ãã®ã¢ãã«ã®å ´å2048x2048ã2æ)ã

ããã¦ããã®é ç¹ã®ä½ç½®æ
å ±ã¨ãå座æ¨ã¨ãã¯ã¹ãã£ä¸ã«å¯¾å¿ããä½ç½®æ
å ±ã drawables ã«è¨è¿°ããã¦ãã¾ããã¨ããããã§ããã®æ
å ±éãã«ãã¯ã¹ãã£ãããã¼ããåãåºãã¦canvasã«è²¼ãä»ãã¦ã¿ã¾ãã
// ãã¯ã¹ãã£ç»åãcanvasã§ç¨æ const texture = document.createElement("canvas"); ... // ãã¼ãæç»ç¨ã®canvas const offCanvas = document.createElement("canvas"); const ctx = offCanvas.getContext("2d"); // Path2Dã«ã¡ãã·ã¥ã®ä¸è§å½¢ã®æ°ã ããã¹ã追å const path = new Path2D(); for (let i = 0; i < indexCount; i += 3) { const [p, q, r] = indexArray.slice(i, i + 3); const [px, py] = uvArray.slice(p * 2, (p + 1) * 2); const [qx, qy] = uvArray.slice(q * 2, (q + 1) * 2); const [rx, ry] = uvArray.slice(r * 2, (r + 1) * 2); // Live2Dã¯å·¦ä¸ãåç¹ã®åº§æ¨ç³»ãªã®ã§yæ¹åã«å転 path.moveTo(px * w, (1 - py) * h); path.lineTo(qx * w, (1 - qy) * h); path.lineTo(rx * w, (1 - ry) * h); path.closePath(); } // Path2Dã®å½¢ã«ããæãã¦ãã¯ã¹ãã£ãã³ãã¼ ctx.clip(path, "nonzero"); ctx.drawImage(texture, 0, 0);
使ãããã¼ãã®canvasã drawables ã®æ
å ±ãå
ã«é
ç½®ãããã¨â¦

ããã¯å¤±æä¾ããã¼ãã¯éãé ã®æå®ãããã®ã§ãz-index ã使ã£ã¦å¶å¾¡ãã¾ãã

ä»åº¦ã¯æåãã¾ããï¼ ãã®æ®µéã§ã¯JavaScriptã使ã£ã¦ãã¾ããããã¼ãç»åãData URLãä½ãã§æ¸ãåºãã¦ããã°JavaScriptç¡ãã§è¡¨ç¤ºããããã¨ãåºæ¥ãã§ãããããã ããããã ãã§ã¯ã¾ã ãã£ã©ã¯ã¿ã¼ã¯åããã¾ããã
ã¢ãã«ãåãã
Source: CSSLive2D/src/02_morph at master · spring-raining/CSSLive2D · GitHub
次ã«ã¢ãã«ã®ã¢ãã¡ã¼ã·ã§ã³ã«ææ¦ãã¾ããããã¾ã§ã¯åãã¼ããç»åã¨ãã¦åãåºããã®ã§ã次ã¯ã¡ãã·ã¥ã®ä¸è§å½¢åä½ã§ç»ååãã¦â¦ã¨ããããã¨ããã ã£ãã®ã§ãããããªã´ã³ï¼ã¡ãã·ã¥ä¸ã®ä¸è§å½¢ï¼ã®æ°ã14088ãããã¢ãã«ããã¹ã¦å¤æããã¨ãéããã¦ä½¿ãç©ã«ãªããªããã¨ãçºè¦ãã¾ããããã§ãæ¹éã夿ãã¦SVGã® <ClipPath /> 㨠<use /> ã使ã£ã¦ã¬ã³ããªã³ã°ã試ã¿ã¾ãã
ã¾ããSVGå ã§ãã¯ã¹ãã£ãSymbolã¨ãã¦å®ç¾©ãã¾ãããããSVGå ã®åããªã´ã³ã§åç §ãããã¨ã§ãããªã´ã³æ¯ã«ãã¯ã¹ãã£ãæã¤ãã¨ã«ããã³ã¹ãã忏ãã¾ãã
<defs> <symbol id="texture_00" width="2048" height="2048"> <image xlink:href="resources/Haru/Haru.2048/texture_00.png"></image> </symbol> <symbol id="texture_01" width="2048" height="2048"> <image xlink:href="resources/Haru/Haru.2048/texture_01.png"></image> </symbol> </defs>
ãã¯ã¹ãã£ããããªã´ã³ãåãåºãããã® <ClipPath /> ãåããªã´ã³ç¨ã«ç¨æãã¾ããidãé©å½ã«å²ãæ¯ã£ã¦ãããå¾ã§åç
§ã§ããããã«ãã¾ãã
<defs> <clipPath id="clip_15e573e1d9f758efbe2ad2cab2d4ed2f"> <path d="M 1740.155029296875 1379.649169921875 L 1705.1416015625 1358.64111328125 L 1666.2769775390625 1385.0565185546875 Z"></path> </clipPath> <clipPath id="clip_b67855933fef072af8a663c7f97e77"> <path d="M 1600.101318359375 1393.654541015625 L 1666.2769775390625 1385.0565185546875 L 1635.11474609375 1363.3095703125 Z"></path> </clipPath> ... </def>
<use/> ããå®ç¾©ãããã¯ã¹ãã£ãåç
§ããclip-path ã§åãæãããå½¢ãæå®ãããã¨ã§ãããªã´ã³1ã¤ã表ç¾ã§ãã¾ãã
<use xlink:href="#texture_00" clip-path="url(#clip_15e573e1d9f758efbe2ad2cab2d4ed2f)"></use> <use xlink:href="#texture_00" clip-path="url(#clip_b67855933fef072af8a663c7f97e77)"></use> ...
ãã¹ã¦ã®ããªã´ã³ã <use/> ã«å¤æããã¨ãã¡ããã¨åãã¼ãã®ãã¯ã¹ãã£ã表示ããã¾ãããããªã´ã³å士ã§å¾®å¦ã«ééã空ãã¦ããã®ãæ®å¿µâ¦

ããã©ã¼ã
Live2Dã§ã¯ãã¼ãã®å¤å½¢ãå¶å¾¡ãããã®ã¨ã㦠ããã©ã¼ã ãæä¾ãã¦ãã¾ããããã©ã¼ãã¯å¶å¾¡ç¹ã使ã£ã¦ãã¼ããä»ã®ããã©ã¼ãã®å¤å½¢ãå®ç¾©ããããã©ã¼ãå士ã«è¦ªåé¢ä¿ãä½ããã¨ã§è¦ªããã©ã¼ãã®å¤å½¢ãå°ããã©ã¼ãã«å½±é¿ããè¤éãªã¢ãã¡ã¼ã·ã§ã³ã表ç¾ãã¦ãã¾ãã

ããããæ¬æ¥ãªãmoc3ãã¼ã¿ã«å ¥ã£ã¦ããã¯ãã®ããã©ã¼ãã«é¢ããæ å ±ããLive2Dã®SDKã§ã¯JSããè¦ããã¨ãåºæ¥ãªã⦠æå³çã«ç§å¿ãã¦ããã£ã½ãæããããã®ã§ã諦ãã¦èªåã§ããã©ã¼ãã®æ å ±ãæ¸ããã¨ã«ãã¾ãã
ããã©ã¼ãã«ã¯ å転ããã©ã¼ã 㨠ã¯ã¼ãããã©ã¼ã ã®2種é¡ããããããããå®ç¾å¯è½ãªå¤å½¢ãç°ãªãã¾ããå転ããã©ã¼ãã¯ãã®åã®éããã¼ããå転ããããã®ã§ãä¸å¿ç¹ã¨å¤å½¢å¯è½ãªè§åº¦ã®ç¯å²ãæå®ãã¾ããã¯ã¼ãããã©ã¼ãã¯ãããåè§å½¢ã®é åãç¸¦ã¨æ¨ªæ¹åã«ä¸å®æ°åå²ããç°ã®åã«ãªã£ãããã©ã¼ãã®åé ç¹ãåãããã¨ã§ããã®é åã«ããããªã´ã³é ç¹ã®ç§»åãè£å®ãããã®ã§ãã*1 ä»åç¨æããããã©ã¼ãã®å®ç¾©ã¯ããã®ããããããªãã¨ãªãèªã¿åããã¨æãã¾ãã
ã¨ããã§ãSVGã§ç¨æããåããªã´ã³ã¯ã¾ã æ¬æ¥ã®ä½ç½®ã«é
ç½®ã§ãã¦ãã¾ãããããªã´ã³ãã·ã¹ãããã£ãã¯ã«é
ç½®ãããããããã§CSS transformã® matrix() 颿°ã使ãã¾ãã
CSSã®matrix颿°ã¯6ã¤ã®ãã©ã¡ã¼ã¿ã使ã£ã¦2次å 夿è¡åãæå®ãããã®å¤ã«å¾ã£ã¦è¦ç´ ãå¤å½¢ããã¾ããããªã´ã³3ç¹ã®ããããã®ç§»åå ã¨ç§»åå 座æ¨ãåããã°ãã®ãã©ã¡ã¼ã¿ã決å®ããã®ã§ãä¸è¨ã®å¼ã«å¾ã£ã¦å ¨ã¦ã®ããªã´ã³ã®matrixå¤å½¢ãCSSã«è¿½å ãã¾ãã
ãã®ã¨ãã
ããã«ãããããå
ç¨ç¨æããããã©ã¼ãæ
å ±ããã¨ã«å¤å½¢ãããå¦çãå ãã¾ããåããã©ã¼ãã®é層ã ã <g> ã¿ã°ãå
¥ãåã«ãããã®ããã©ã¼ããå¤å½¢ãããå ´å㯠<g> ã¿ã°å
¨ä½ã«å¯¾ãå¤å½¢ãããããã«ãã¾ããã¨ã¦ãé½åã®è¯ããã¨ã«ãSVGã¯è¤æ°ã®transformãåã®å®ç¾©ããé ã«é©ç¨ãã¦ããããããããã§ä¸æãããã¾ãã
<!-- 親ã®å転ããã©ã¼ã --> <g style="transform: rotate(-0.9597992411402052deg); transform-origin: 0px 1003.52px;"> <!-- ããªã´ã³ã®å¤å½¢ --> <g style="transform: matrix(0.934, 0.058, -0.039, 0.919, -1878.59, -910.749);"> <!-- å®éã®ãã¯ã¹ã㣠--> <use ... /> </g> ... </g>
ããã¦ãã¢ãã¡ã¼ã·ã§ã³ã®ããã« window.requestAnimationFrame å
ã§CSSãæ¸ãæããå¦çãæ¸ãã¾ãã
const cb = (time) => { const angle = Math.sin(time / 1000); ... element.style.transform = getMatrix(...); window.requestAnimationFrame(cb); }; window.requestAnimationFrame(cb);
æ°å¤ã®ãã°ãä¹ãè¶ããå®è£ ã宿ããã¨ãã®ããã«åãããã¨ãã§ãã¾ãã

é¦ãå·¦å³ã«åãï¼ é¦ã®æºãã«å¿ãã¦é«ªããªã³ãï¼ï¼ å³ã®ãã¿ããããã°ã§ååãã¦ãããããã«ã¯ã«ã¯ãã¦ã¾ããè¦ãªãã£ããã¨ã«ãã¾ãã
CSS Animationã§åãã
Source: CSSLive2D/src/03_css_animation at master · spring-raining/CSSLive2D · GitHub
JSããCSSã®ãã©ã¡ã¼ã¿ãæä½ãã¦ã¢ãã¡ã¼ã·ã§ã³ãããã¨ããã¾ã§åºæ¥ãã®ã§ããã¨ã¯ãããCSS Animationã§è¡¨ç¾ããããã«ä¿®æ£ãã¾ããã¨ãã£ã¦ããã¢ãã¡ã¼ã·ã§ã³ã®ãã¼ãã¬ã¼ã ã¨ãªãå¤å½¢ã¯å
¨ã¦å¤æãã¦ããã®ã§ããã¨ã¯åããªã´ã³ã«ä»¥ä¸ã®ãããª@keyframesãç¨æãã¦ç½®ãæããã ãã§ãããªããããã§ä½¿ç¨ãã¦ãã cubic-bezier(0.34, 0, 0.64, 0.43) 㨠cubic-bezier(0.36, 0.57, 0.66, 1) ã¯æ£å¼¦æ³¢ãåç¾ãããã®ã§ãã
@keyframes anim_poly_a13b3d4032780bcccd23a9bd5d4a4b { 0% { /* ã¢ãã¡ã¼ã·ã§ã³éå§æã®å¤å½¢ */ transform: matrix(0.958,0,0.037,1,-946.294,-225.005); animation-timing-function: cubic-bezier(0.34, 0, 0.64, 0.43); } 50% { /* ã¢ãã¡ã¼ã·ã§ã³ä¸éç¹ã®å¤å½¢ */ transform: matrix(1,0,0,1,-932,-225.005); animation-timing-function: cubic-bezier(0.36, 0.57, 0.66, 1); } 100% { /* ã¢ãã¡ã¼ã·ã§ã³çµäºæã®å¤å½¢ */ transform: matrix(0.958,0,-0.063,1,-811.153,-225.005); } } [data-poly="poly_a13b3d4032780bcccd23a9bd5d4a4b"] { animation: 2s linear 0s infinite alternate anim_poly_a13b3d4032780bcccd23a9bd5d4a4b; }
ã¤ãã«å®æã§ããæå¾ã«ã¢ãã¡ã¼ã·ã§ã³çµæã表示ããã¦ã¿ã¾ãããâ¦ï¼
â¦

ãï¼ï¼ï¼ï¼ï¼ï¼
ãªãã§â¦â¦â¦â¦ï¼
â¦
ã©ãããããã©ã¦ã¶ã¯ä¸å®æ°ã®DOMã®èªã¿è¾¼ã¿ãçµãã¦ãã¾ãã¨ããã®æç¹ã§ç»é¢ã¸è¡¨ç¤ºããã¢ãã¡ã¼ã·ã§ã³ãéå§ãã¦ãã¾ãããã§ããããã§ã¯ãå ¨ã¦ã®ããªã´ã³ãåæã«ã¢ãã¡ã¼ã·ã§ã³ããããã¨ãåºæ¥ã¾ããã䏿¬æã§ããã以ä¸ã®ã¹ããããã§è§£æ±ºããã¾ãã
<style> .loading * { animation-play-state: paused !important; } <style> <body class="loading" onload="this.document.body.classList.remove('loading')"> ...
ã¨ããããã§ããã¡ããæçµææã§ããJSã§ã¢ãã¡ã¼ã·ã§ã³ããããããããªãããã©ã¼ãã³ã¹ãä¸ãã£ã¦ãã¾ãããNo JSã§ã¢ãã¡ã¼ã·ã§ã³ãããã¨ããéæã¯å¶ãã¾ããã§ããã

ã¾ã¨ã
è²ã å³ããããã®ã§ã大人ããWebGLã§åãå ¬å¼ã®SDKã使ã£ãã»ããè¯ãã¨æãã¾ãã
Live demo
Repository
*1:æ¬æ¥ã®ã¯ã¼ãããã©ã¼ãã¯å¶å¾¡ç¹ã®å岿°ã¨è£å®é åã®å岿°ãç¬ç«ãã¦ããããè£å®ã®æ¹æ³ãç·å½¢ã§ã¯ãªãã£ããã¨ãã£ã¨è¤éã§ãããä»åã¯åç´ãªç·å½¢è£éã¨ãã¦ãã¾ã
CSSçµçã§ä½ã£ãæè¡å人èª8ä½ã®å¤é·
ãã®è¨äºã¯ æè¡åäººèª Advent Calendar 2019 ã®11æ¥ç®ã«å ¬éãããã¯ãã ã£ã16æ¥ç®ã«å ¬éãããè¨äºã§ããæ£ç´ãã¾ããã£ãã
ããã¾ã§ã«8åã®æè¡å人èªãä½ã£ã¦ããéã§ãæè¡å人èªã¨ããã¸ã£ã³ã«ããã¡ããã¡ããªå¢ãã§æ®åããæ¬ãæ¸ãææ®µããããããªé¸æè¢ãç¨æãããããã«ãªãã¾ããããã®ä¸ã§ããä¸è²«ãã¦CSSçµç + Vivliostyleã¨ããããããªæ¹æ³ã§ä½ãç¶ããä½é¨è«ã¯æå¤ã¨åèã«ãªããã¨ãããã®ã§ã¯ãã¨ãããã¨ã§ãä»ã¾ã§ã«ã©ã®ãããªæ¹æ³ã§å·çãã¦ããããæ¯ãè¿ãã¾ãã
C90
Source: GitHub - pentapod/C90-builder
è¨å¿µãã¹ã1åç®ããã®æ®µéã§ãå稿ãPug + Markdownãã¬ã¤ã¢ã¦ããStylusã§æ¸ããGulpã§ãã«ããã ãããã§ãã¦ãããVivliostyle viewerã§PDFåºåããã¨ããæµããä½ã£ã¦ãã¾ãããã®é ã¯åããCSSçµçã§ä½ããããCSSã·ã¼ã¯ã¬ãããã®ãµã³ãã«ã³ã¼ããå ¬éããã¦ããï¼2019å¹´12ææç¹ã§éå ¬éï¼ãç´é¢ã¬ã¤ã¢ã¦ããä½ãä¸ã§å¤§ãã«åèã«ããè¨æ¶ãããã¾ãã
æè¡æ¸å ¸2
Source: GitHub - pentapod/tbf02-builder
2åãã®å³å£²ä¼ã¨ãªãæè¡æ¸å ¸2ã§ã¯ãåã®ååèªãå¶ä½ãããããã®å稿ã¯Markdownã§æ¸ãã¾ããããã®åã§ã¯Webä¸ã§å稿ã®å ¥åã¨ãã¬ãã¥ã¼ãåæã«ã§ããç°¡æçãªãã¬ãã¥ã¼ã¢ã¼ãç¨æãã¾ããããã¼ã¸æ°ãªã©ã®ç®å®ãå³åº§ã«åãããªã©è²ã ãªã¡ãªããããã£ãã®ã§ãã§ãããã¨ãªãä»å¾ããã²ç¨æããããã¼ã«ã§ãã
ã¾ãããã®æ¬ã§ã¯å¯ä¸æ¬æã ãã§ãªã表ç´ãHTMLã»CSSã§ä½ãã¾ããããç®çã®ã¬ã¤ã¢ã¦ããå®ç¾ããã¾ã§ã®æé坾广ãæãããæªãã£ãããã以éã§ã¯æ®éã«Illustratorã§ä½ã£ã¦ãã¾ãã
C92/æè¡æ¸å ¸3
Source: GitHub - pentapod/c92-previewer
Source: GitHub - pentapod/tbf03-previewer
ãã®é ã¯åç¨¿ãæ¸ãã®ã«å¿ æ»éãã¦ãç¹ã«ç°å¢ã®å¤æ´ã¯è©¦ããã¨ã«ããååã®ãã®ããã®ã¾ã¾ä½¿ã£ã¦ãã¾ããããã®ã¿ã¤ãã³ã°ã§ä½æ ãCSSãªã»ãããnormalize.cssããressã«å¤ãã¦ã¾ãããªãã§ã ãã å¤åä½ãçç±ããã£ãã¯ãã§ããæãåºããªã⦠ãã¨èªåãæããããã§ã¯ãªãã§ãããããã£ã¦ããååèªãã®è¡¨ç´ããæ°ã«å ¥ãã§ãã
æè¡æ¸å ¸4ããããMarked.jsããæ¡å¼µæ§ã®é«ãRemarkã¸ã®ä¹ãæããè¦éã«å ¥ããDewritefulã¨åä»ããRemarkç¨ã®ãªã¬ãªã¬Markdownæ¡å¼µã©ã¤ãã©ãªãã¡ããã¡ããä½ã£ãããã¦ãã¾ãããæ¾ç½®ç¶æ ãªã®ã§æéãã§ããããªãã¨ããããã§ãã
C94/æè¡æ¸å ¸5
Source: GitHub - pentapod/c94-draft
Source: GitHub - pentapod/tbf05-draft
C94ã¯C92ã§åºãããCSSã§ã¯ãããå人èªå¶ä½ãã®å¢è¨çã¨ãããã¨ã§ãå稿å·çã¯ã»ã©ã»ã©ã«å·çç°å¢ã®æ¹åã«åãå ¥ãã¦ãã¾ãããæç« æ ¡æ£ã©ã¤ãã©ãªã®Textlintãå°å ¥ãã誤åãæ¥æ¬èªã®ãã¹ãé²ãã§ãã¾ããã¾ããå·»æ«ã«ç´¢å¼ãå ¥ããããã®Pugãã£ã«ã¿ã¼ãªã©ãç¨æãã¦ãã¾ãï¼ãã®ãããï¼ã PDFã®åºåå¨ãã§ã¯ãCLIãã¼ã«ã®vivliostyle-cliï¼æ§viola-savepdfï¼ã«ãããã©ã¤&ã¨ã©ã¼ãåçã«ããããããªãã¾ããã
ã¬ã¤ã¢ã¦ãä¸ã§è¯ãã£ã夿´ç¹ã¯ãç»é¢è¡¨ç¤ºãPDFåºåç¨ã®CSSã¨å ¥ç¨¿æã«ç¨ããCSSãåããç¹ã§ãããã¯ãã«ã©ã¼ãã£ã¹ãã¬ã¤ã¨é»ã®ã¤ã³ã¯ã§å°å·ãããç´é¢ã¯è¦æ ããå ¨ç¶éãããã2ã¤ã®ã¡ãã£ã¢ã«åã£ãã¹ã¿ã¤ã«ãå¿ è¦ã§ãããç´é¢ã§ã¯Webãã¶ã¤ã³ã§é¿ããããã¡ãª #000000 ãç©æ¥µçã«ä½¿ããå³è¡¨ã®ç·ã¯ç´°ããã£ãããå¿ãããããã«ãã¾ãã
æè¡æ¸å ¸6
Source: GitHub - spring-raining/tbf06-draft: Vivliostyleで本を作ろう Vol.1
ãVivliostyleã§æ¬ãä½ãã Vol.1ãã§ãã¤ãã«Markdownãã©ã³ã¹ãã¤ã©ãMarked.jsããRemarkã«ä¹ãæãã¾ãããããã§ãä»ã¾ã§ã¯HTMLã¿ã°ç´æ¸ãã§åãã§ããå³è¡¨ã®ç¸äºåç §ãªã©ããæ¸ããããè¨è¿°ã«ã¼ã«ã§å®ç¾ã§ããããã«ãªãã¾ãããRemarkã®ãã©ã°ã¤ã³ã«ã¯Dewritefulã ãã§ãªããPaperistã®ãã©ã°ã¤ã³ãªã©ã使ã£ã¦ãã¾ãã
æè¡æ¸å ¸7
Source: GitHub - spring-raining/tbf07-draft: Vivliostyleで本を作ろう Vol.2
ãã®åã§ã¯ä»ã¾ã§å¼ãç¶ã使ã£ã¦ããã½ã¼ã¹ã³ã¼ãã䏿°ããakabekobeko/env-create-bookããã¼ã¹ã¨ããæ§æã«ç§»è¡ãã¾ãããããã«ãããä»ã¾ã§ã ã¾ãã ã¾ã使ãéçãè¿ãã¤ã¤ãã£ãGulpã®ã¿ã¹ã¯ã©ã³ãã¼ãnpm-scriptsã«è¼ãæ¿ãããã¨ãã§ãã¾ãããã¾ãããã®ã¿ã¤ãã³ã°ã§StylusããSCSSã使ãããã«ãã¦ãã¾ããStylus確ãã«ãããè¯ã仿§ãªãã§ããã©ãâ¦
ã¾ã¨ã
å人èªã®å¶ä½ã¯ç· åããã¹ã¦ãç· ååã«åºãã°å®æï¼ ã¨ããã¹ã¿ã¤ã«ã¯ã宿å¾ã®ã¡ã³ããã³ã¹ãèããå¿ è¦ã®ããWebéçºã®èãã¨ã¯ç°ãªããæ®æ®µä½¿ããªãã©ã¤ãã©ãªãå·çæã«è©¦ããè¯ãæ©ä¼ã§ãããããããå稿ã®å 容èªä½ã¯ãã¡ãããå稿ãå·çããç°å¢ãç©æ¥µçã«æ°ããæè¡ãåãå ¥ãããã§ããï¼
P.S.
éå»ä½ã®ç¡æå ¬éã¨ããã¨ã³ããªã§ç´æãã¦ãå ¬éææãããªãã¨1å¹´åãæ¾ç½®ãã¦ãã¾ãã¾ãã⦠ã©ãã ãå¾ ããããã ã»ãã¨ãã¿ã¾ãã ç´æéãç¡æå ¬éã«åãæ¿ãã¦ãã¾ããã©ããè¦ã¦ãã£ã¦ãã ãã :pray:
ãäºåãéå»ä½ã®ç¡æå ¬é &ãCSSã§ã¯ãããå人èªå¶ä½ãå¢è¨çåºãã¾ã

ãµã¼ã¯ã«pentapodãé å¸ããéå»ä½ãã¯ããã React Nativeãã¨ããã¼ãã·ã¼ãã»ãã¼ãã·ã¼ããã«ã¤ãã¦ãç¾å¨é»åçã300åã§è²©å£²ãã¦ãã¾ãããä»åº¦ã®å¤ã³ãã®ã¿ã¤ãã³ã°ã§ç¡æå ¬éãããã¨ã«ãã¾ããããã®æ©ä¼ã«ãã²ãã§ãã¯ãã¦ãã ããï¼
以ä¸ã®ãã©ã¼ã ããã¡ã¼ã«ã¢ãã¬ã¹ãç»é²ããã¨ãç¡æå ¬éæã«ãªãã¤ã³ãã¼ãåä¿¡ã§ãã¾ãã
ã¾ããéå»ä½ãCSSã§ã¯ãããå人èªå¶ä½ãã«ã¤ãã¦ããå¤ã³ãã§å¢è¨çãçºåããäºå®ã§ãããè¿ãã¾ã§å¯ãããéã¯ã8æ12æ¥ï¼ã³ããã¯ãã¼ã±ãã94 3æ¥ç®ï¼ã-30a ã¾ã§ãã²ãè¶ããã ãããã
CSSçµçã«å¯¾å¿ãããªã³ã©ã¤ã³ã¨ãã£ã¿Violaã¨viola-savepdfã®ãç´¹ä»
å æ¥ï¼å°å·ã»åºçã®ããã®ãªã³ã©ã¤ã³ã¨ãã£ã¿ãViolaãããªãªã¼ã¹ãã¾ããï¼
ä½¿ãæ¹
Violaã¯Adobe製ã¨ãã£ã¿Bracketsããã¼ã¹ã«ãããªã³ã©ã¤ã³ã¨ãã£ã¿ã§ã1ï¼ãã¬ãã¥ã¼ã¯ã«Vivliostyle.jsãçµã¿è¾¼ããã¨ã§ï¼ææ°ã®CSSçµçæè¡ã使ã£ãã¬ã¤ã¢ã¦ããå®ç¾ã§ãã¾ãï¼

å³å´é åã¯ãã¬ãã¥ã¼ã«ãªã£ã¦ããï¼ä¸é¨ã®ã¹ã¤ããã§ã¢ãã¤ã«ãã¬ãã¥ã¼ï¼ãã¹ã¯ããããã¬ãã¥ã¼ï¼å°å·ãã¬ãã¥ã¼ã«åãæ¿ãããã¨ãã§ãã¾ãï¼å°å·ãã¬ãã¥ã¼ã¯åæ ã«è¥å¹²ã¿ã¤ã ã©ã°ãçããã®ã§ï¼å·çæã¯ãã¹ã¯ããããã¬ãã¥ã¼ãããããã§ãï¼
HTMLãç´æ¥æ¸ãã®ã¯æ£ç´ã ãã使¥ã§ããï¼Violaã«åããMarkdownãã©ã³ã¹ãã¤ã©ãããç¨åº¦ãã®ä½æ¥ãç·©åãã¦ããã¾ãï¼Markdownãã¡ã¤ã«ã使ããã¨ï¼èªåã§HTMLãã¡ã¤ã«ã使ããï¼Markdownãã¡ã¤ã«ã®å 容ãåæ ããã¾ãï¼åºæ¬çãªMarkdownè¨æ³ã¯ã«ãã¼ããã¦ãã¾ããï¼è注ãªã©å¾®å¦ã«æªå¯¾å¿ã®æ©è½ãããï¼ä»å¾ä¿®æ£ãããç®æã§ãï¼

Violaã§ä½æãããã¼ã¿ã¯IndexedDBã使ã£ã¦ãã©ã¦ã¶ã確ä¿ããé åã«ä¿åããã¾ãï¼ãã®ãã¼ã¿ã¯ï¼è½åçã«æ¶ããªãéããã©ã¦ã¶ãéãã¦ããã®ã¾ã¾ã§ããï¼ã·ã¼ã¯ã¬ããã¢ã¼ãã§ã¢ã¯ã»ã¹ããå ´åï¼ã¿ããéããã¨ãã¼ã¿ãæ¶ãã¦ãã¾ãã®ã§æ³¨æãã¦ãã ããï¼ã¾ãï¼ã¢ããªã±ã¼ã·ã§ã³ã®ã¢ã»ãããã¡ã¤ã«ã¯Service Workerã§ã¾ãã£ã¨ãã£ãã·ã¥ããã¦ããã®ã§ï¼ãã£ãã·ã¥ãæ®ãéããªãã©ã¤ã³ã§ã®å·çãå¯è½ã§ãï¼å°æ¥çã«ã¯ï¼ä½æãããã¼ã¿ã¯ãªã³ã©ã¤ã³æã«åæãããããã«ããäºå®ã§ãï¼

ã¨ããã§ï¼Violaã¯ãªã³ã©ã¤ã³ã¨ãã£ã¿ã¨ããå½¢å¼ãåã£ã¦ãã¾ããï¼å®éã«ã¯VEDAã®ããã«å種ã¨ãã£ã¿ã®ãã©ã°ã¤ã³ã¨ããå½¢ã§éçºããæ¹æ³ãèãããã¾ãï¼
ããã¯æ³å®ããå©ç¨ç°å¢ã®éããçç±ã§ï¼Violaã¯å·çã«æ £ãã人ããããããï¼ã¾ã ä½¿ãæ £ããã¨ãã£ã¿ãã¤ã³ã¹ãã¼ã«ãã¦ããªãåå¿è ã対象ã«ãã¦ããããã§ãï¼ãã®ãããªæ¹ã§ãããã«å·çãå§ããããã«ã¯ï¼ãªã³ã©ã¤ã³ã¨ãã£ã¿ã®ã»ããé©ãã¦ãã¾ãï¼å·çãåãã¦ã®äººâ¦â¦ããï¼ ããã¯ãã®è¨äºãè¦ã¦ããããªãï¼ ä»ããæè¡æ¸å ¸ãããã«å¿åãã¦æ¸ãå§ãã¾ãããï¼
ããã«ï¼è¤æ°äººã«ããå ±èã®éã«ãç°¡åã«åãç°å¢ãç¨æã§ããã¡ãªãããããã¾ãï¼ãââã¨ããã¨ãã£ã¿ãã¤ã³ã¹ãã¼ã«ãã¦ãã©ã°ã¤ã³ãå ¥ãã¦ãããããviola.pubã«ã¢ã¯ã»ã¹ãã¦ãã¨é ¼ãã»ãããã£ã¨ç°¡åã§ãï¼
viola-savepdf
ã¨ã¯ããï¼ä½¿ãæ £ããã¨ãã£ã¿ãã¯ã¼ã¯ããã¼ãæ¢ã«æ§ç¯ãã¦ããããããã¾ããï¼ãããªæã¯Violaã®pdfåºåãã³ãã³ãã©ã¤ã³ã§å®è¡ããviola-savepdfã試ãã¦ã¿ã¦ãã ããï¼
npmã§viola-savepdfãã¤ã³ã¹ãã¼ã«ãã¾ãï¼
npm install -g viola-savepdf
viola-savepdfã®ä½¿ãæ¹ã¯è¶
ç°¡åï¼Chromeï¼Chrome Canaryï¼ãã¤ã³ã¹ãã¼ã«ããç¶æ
ã§savepdfã³ãã³ããå®è¡ããã¨ï¼Headless Chromeãä»ãã¦htmlãã¼ã¸ãPDFå½¢å¼ã§ä¿åãã¾ãï¼
savepdf -s JIS-B5 -o output.pdf target.html
--previewãªãã·ã§ã³ã§åºåãã¬ãã¥ã¼ã確èªã§ãã¾ãï¼

Violaã¨viola-savepdfï¼ã©ã¡ãããã²ãã²ãå©ç¨ãã ããï¼
ä»å¾ã®å®è£ äºå®
- ã¹ã¿ã¤ã«ãã³ãã¬ã¼ãã®ç¨æ
- æ°å¼è¡¨ç¤ºæ©è½ï¼MathJaxï¼ï¼
- Markdownã«ããå·çæ©è½ã®å¼·å
- 表è¨ã«ã¼ã«ãæ¡å¼µãã¦ï¼ã«ããåç §ãªã©ã«å¯¾å¿ã§ããã¨è¯ããã
- ePubåºåæ©è½
- å®ã¯ä»æ§ããç¥ããªãâ¦
ä¸è¨ã®æ©è½ã¯ããã¾ã§ãäºå®ã¨ãããã¨ã§â¦â¦


