【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に乗せようとしたらクロスドメインかなんかでエラーしたからローカルでやった。