【Three.js】ジオメトリ(Geometry)の頂点にPoints使ってcanvasで描いたものを表示するんだわ
2016年12月10日canvasに描画したものをジオメトリ(Geometry)の頂点に表示させる
言っててもちろん意味わかってるのか不明だけど。
今回作った順序としては
- 【1】表示させたい子をcanvasで作成(Threejs使うから縦、横は2乗にする)
- 【1-2】作ったcanvasをテクスチャにする
- 【1-3】作ったテクスチャをマテリアル(Material)にする
- 【2】頂点用のジオメトリ作る(こんかいはSphere)
- 【3】THREE.Pointsで1、2で作った子を使って表示!
【1】表示させたい子をcanvasで作成
(Threejs使うから縦、横は2乗にする)
とりあえず元になるcanvasを作成する
ここでちゃんと表示されてないと、うまくPointに表示されても表示されない(日本語ぐだぐだ)な感じになるので注意。
試しに普通にappendしてみるのもありかも。
//canvasに赤色塗った四角形を描画してappend var canvas = document.createElement('canvas'); canvas.width = 16;//2の4乗 canvas.height = 16;//2の4乗 var context = canvas.getContext('2d'); context.fillStyle = "rgb(200, 0, 0)"; context.fillRect(0, 0, canvas.width, canvas.height);
赤い四角(16px_16px)を表示させただけ
See the Pen タダノ16pxの赤いシカク by ziyudom (@ziyudom) on CodePen.
【1-2】作ったcanvasをテクスチャにする
次は作った子をThreejs用にテクスチャにしてreturnする。
function get_canvasTexture(){ var canvas = document.createElement('canvas'); canvas.width = 16; canvas.height = 16; var context = canvas.getContext('2d'); context.fillStyle = "rgb(200, 0, 0)"; context.fillRect(0, 0, canvas.width, canvas.height); //ここでテクスチャにする var texture = new THREE.Texture(canvas); texture.needsUpdate = true; return texture;//テクスチャお返しする }
【1-3】作ったテクスチャをマテリアル(Material)にする
お返しされたテクスチャでマテリアル作り。
tamaterialってのを作る。
var tamaterial = new THREE.PointsMaterial({ color: 0xffffee, size: 3, transparent: true, blending: THREE.AdditiveBlending, map: get_canvasTexture(),//ここでさっきのテクスチャ設置 depthWrite: false });
【2】頂点用のジオメトリ作る(こんかいはSphere)
こんな感じでいつも通り準備する。
var geometry = new THREE.SphereGeometry(10,10,10);
なので、縦、横の分割数が多いほど頂点が多くなるから、沢山出したい人は
SphereGeometry(10,1000,1000);
とかしたらもうそれは点ですらなくなるよ。うじゃうじゃ。
–memo–
SphereGeometry(半径,縦の分割数,横の分割数);
——–
【3】THREE.Pointsで1、2で作った子を使って表示!
ジオメトリとマテリアルができましたのでソレを使ってTHREE.Pointsしてやろうと思います。
var pointObject = new THREE.Points(geometry, tamaterial); pointObject.sortParticles = true; scene.add(pointObject);
でけた
See the Pen canvasで書いたヤツを表示させる by ziyudom (@ziyudom) on CodePen.
なんか大きくてちゃんとなってるかよくわからないけど、一応球の頂点に赤色がでてますよ。
画像で出してみる
応用、というか画像に変えただけ、なんだけど。
THREE.TextureLoaderでtextureを読み込んで。
第二引数にonloadがあるので、そこからポイントマテリアル→ポイントって順序で作成すると普通に出来ました。
var textureLoader = new THREE.TextureLoader(); textureLoader.load( './img/sudachi_128.png', //onload function(_texture){ //ポイントマテリアル作る var imgmaterial = new THREE.PointsMaterial({ color: 0xffffff, size: 5, transparent: true, map: _texture,//キャンバス作ってテクスチャに突っ込んだ子が帰ってくる depthWrite: false }); var pointObject = new THREE.Points(geometry, imgmaterial); scene.add(pointObject); //レンダーは最後に入れないと表示されなのだよ困ったもんだ。。。 renderer.render(scene, camera); }, function(e){ console.log("進行中") }, function(e){ console.log("エラー") } );
ただcodepenに乗せようとしたらクロスドメインかなんかでエラーしたからローカルでやった。