【Three.js】アニメーションのあるcanvasをテクスチャにして読み込む
2016年12月15日前にcanvasの表示ができたので、次にアニメーションの表示をしたい。
まずはcanvasアニメーションの表示
順序は
【1】canvasで作ったテクスチャをステージ置く
【1-2】テクスチャ作成
【2】canvasアニメーションを作る
【3】読み込んでアニメーション
くらいになるのではないかと思う。
【1】canvasで作ったテクスチャをステージ置く
まずいきなりココで詰まった。
addしてる気持ちでもステージになにも出てこない。。。
結論はplaneMesh.material.map.needsUpdate = true;がなかったのですが。この子大事ですね。
とりあえず順を追って。
【1-2】テクスチャ作り
今回は最終的にアニメーションでテキストでぐるぐる系作りたいのと、テキストをどう入れるのかお勉強も兼ねてこんなかんじ。
これで
の中にcanvasタグが生成されます。
//キャンバステクスチャ作り function set_texture() { canvas = document.createElement('canvas'); canvas.width = 64; canvas.height = 32; textContext = canvas.getContext('2d'); textContext.font = "20px 'MS Pゴシック'"; textContext.fillStyle = "rgb(200, 30, 100)"; textContext.fillText("ぶははは", 0, 20); //[あとで追加]ここでテクスチャに変換->リターン //texture = new THREE.Texture(canvas); //return texture; }
returnされたテクスチャとplaneGeometoryでMeshを作成する。
MeshBasicMaterialを作るときに[map:set_texture()]として、さっき作ったヤツがreturnで入る。
/* メッシュ作り */ var geometry = new THREE.PlaneGeometry(6.4, 3.2, 10, 10); var material = new THREE.MeshBasicMaterial({ map: set_texture()//ここに作ってreturnされたtexutureが入る }); planeMesh = new THREE.Mesh(geometry, material); planeMesh.material.map.needsUpdate = true; scene.add(planeMesh);
なんかでた。
codepen
See the Pen canvas をテクスチャにする_1 by ziyudom (@ziyudom) on CodePen.
【2】canvasアニメーションを作る
次は今回は文字を右から左に流れてく感じのをサンプル作る。
render関数を作る。
var textX = 0;//アニメーション用テキスト位置 function render(){ window.requestAnimationFrame(render);//グルグルまわる textX--;//位置を更新 if (textX < -100) { textX = 100;//適当に行きすぎたらもどってきてーってやつ } //緑にする textContext.fillStyle = "rgb(40, 233, 100)"; //その緑を塗る textContext.fillRect(0, 0, 100, 100); //黒にする textContext.fillStyle = "rgb(0, 0, 0)"; //その黒で書く textContext.fillText("ぶはははは", textX, 20); renderer.render(scene, camera);//レンダリング更新 }; [/js] アニメーション部分 canvasは一回ベタで塗り直して、改めて文字を描画する感じなので、こんな感じでやってみた。 [js] function looprender() { window.requestAnimationFrame(looprender); textX--; if (textX < -100) { textX = 100; } textContext.fillStyle = "rgb(40, 233, 100)"; textContext.fillRect(0, 0, 100, 100); textContext.fillStyle = "rgb(0, 0, 0)"; textContext.fillText("ぶはははは", textX, 20); renderer.render(scene, camera); } [/js] 恐らく上の方に「テクスチャ」とか書いてあってアニメーションしてるはず。 <p data-height="300" data-theme-id="17145" data-slug-hash="pNQzXG" data-default-tab="js,result" data-user="ziyudom" data-embed-version="2" data-pen-title="canvas をテクスチャにする_1" class="codepen">See the Pen <a href="http://codepen.io/ziyudom/pen/pNQzXG/">canvas をテクスチャにする_1</a> by ziyudom (<a href="http://codepen.io/ziyudom">@ziyudom</a>) on <a href="http://codepen.io">CodePen</a>.</p> <script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script> <h3>【3】読み込んでアニメーション</h3> 次に板を作ってそこに貼り付ける。 テクスチャを作ると言っても、さっきのset_texture関数にnew THREE.Texture(canvas)で作ったやつをリターンするようにセットしたらあとはほとんどいつも通り。 [js] //キャンバステクスチャ作り function set_texture() { //テクスチャ canvas = document.createElement('canvas'); canvas.width = 64; canvas.height = 32; textContext = canvas.getContext('2d'); textContext.font = "20px 'MS Pゴシック'"; textContext.fillStyle = "rgb(200, 30, 100)"; textContext.fillText("札幌", 0, 20); $(".hoge")[0].appendChild(canvas); //↓ここ追加した texture = new THREE.Texture(canvas); return texture; }
メッシュ作成部分
var geometry = new THREE.PlaneGeometry(6.4, 3.2, 10, 10); var material = new THREE.MeshBasicMaterial({ map: set_texture(),//ここでさっき作った関数からのリターンされたテクスチャが入る。 transparent: true, }); planeMesh = new THREE.Mesh(geometry, material); //ここら辺ただの調整 planeMesh.position.z = -1; planeMesh.rotation.y = 20; planeMesh.doubleSided = true; scene.add(planeMesh);
こんな感じ
てかメインのステージのやつ動いてなくね?
ってなったんですが、それがplaneMesh.material.map.needsUpdateアップデート。
これをmaterialのmapで毎回trueにするっぽい。
なんでtureなんだろ。そしてなんで毎回なんだろう。
そんな疑問も素人からするとあるけど。
とりあえずここれそのMeshのmaterialをアップデートできます。
function render(){
window.requestAnimationFrame(render);
textX–;
if (textX < -100) {
textX = 100;
}
textContext.fillStyle = "rgb(40, 233, 100)";
textContext.fillRect(0, 0, 100, 100);
textContext.fillStyle = "rgb(0, 0, 0)";
textContext.fillText("ぶはははは", textX, 20);
/*ここね!*/
planeMesh.material.map.needsUpdate = true;
renderer.render(scene, camera);
}
[/js]
はははははーやったー
でけた
See the Pen canvas をテクスチャにする_2 by ziyudom (@ziyudom) on CodePen.
canvasがテクスチャになるならなんでも出来る気がする
そんな気がするんだけど。
まぁそもそもそんな技術がないという事実もあるので。
焦らずゆっくりでもお勉強が必要です。