Three.jsを使って、作ってみた

プログラミング関連の事を色々書いています(^^) 週末はレストランやコンビニのお菓子のことを書いています。

Three.jsの基本⑥

今回は、Three.jsのGeometry(ジオメトリ )をやります。
Geometryは、球や立方体などの実際に表示する物体の事です。形状と言ったほうがいいのかな(笑)
ざっくりというと、今回は、物体の生成から位置や色の設定を中心にやっていきます(笑)

introduction.html」では、この部分が物体を表示している所です。

/*------------Geometry処理(物体表示)⑤-------------*/ 
  var sphere,plane,axis;  //グローバル変数                                                   
  function initObject(){
  
      //球体を表示する部分
        sphere = new THREE.Mesh(                                         
                  //球のジオメトリ (半径:200)   
                  new THREE.SphereGeometry(200),      
                 //マテリアル (材質) 
                  new THREE.MeshPhongMaterial({          
                       //色(16進数)                             
                       color: 0xffffff                                  
                       }));
      //影の設定
   sphere.castShadow = true; 
      //影の設定        
      sphere.receiveShadow = true;         
     //sceneに追加               
      scene.add(sphere);                           
      // 位置設定                                                
      sphere.position.set(0,0,500);                    
   
    //地面(円)を表示する部分  
     plane =  new THREE.Mesh(       
             //  円のジオメトリ(半径1000、正100角形)                                    
              new THREE.CircleGeometry(1000, 100),    
             //マテリアル (材質)          
              new THREE.MeshLambertMaterial({             
               //両面表示する              
                side: THREE.DoubleSide,             
               //色(16進数)              
                color: 0x000000,                                                                 
                }));        
    //影の設定
     plane.receiveShadow = true;                    
    // 位置設定 
     plane.position.set(0,0,1);             
     //sceneに追加                  
     scene.add(plane);                                    
     
     //軸の表示(長さ:1000)   
     axis = new THREE.AxisHelper(1000);          
    //sceneに追加 
     scene.add(axis);     
    // 位置設定                             
     axis.position.set(0,0,1);                     
    
  }
   /*-------Geometry処理(物体表示)⑤-----ここまで-------*/

さて、Three.jsでは、表示する物体は主に以下の3つの要素で構成されています。

  • ①形状 (Geometry)
  • ②質感 (Material)
  • ③実際に表示する物体 (Object3D)

プログラムでは、

var sphere = new THREE.Mesh(  //③実際に表示する物体 (Object3D)                                          
               new THREE.SphereGeometry(200),   // ①形状 (Geometry) 
               new THREE.MeshPhongMaterial({  //②質感 (Material)                              
                       color: 0xffffff                                  
                       }));

こんな感じです。

話は、脱線しますが、他にも書き方はあります!

var geometry = new THREE.SphereGeometry(200);  // ①形状 (Geometry) 
var material = new THREE.MeshPhongMaterial( { color: 0xffffff } );//②質感 (Material) 
var sphere = new THREE.Mesh( geometry, material );//③実際に表示する物体 (Object3D) 
scene.add( sphere );

こういうやり方もあります。(こちらは、変数が増えて、あまり好きではないんですよね(笑))

では、 ①形状 (Geometry)から見ていきます。

Three.jsの形状は、

  • 「テキスト」
  • 「平面(PlaneGeometry)」
  • 「円 (CircleGeometry)」
  • 「直方体(CubeGeometry)」
  • 「球 (SphereGeometry)」
  • 「円柱 (CylinderGeometry)」
  • 「トーラス(TorusGeometry)」
  • 「トーラス結び目 (TorusKnotGeometry )」
  • 「回転体 (LatheGeometry)」
  • 「凸包 (ConvexGeometry)」
  • 「正4面体 (TetrahedronGeometry)」
  • 「正8面体 (OctahedronGeometry)」
  • 「正20面体 (IcosahedronGeometry)」
  • 「多面体 (PolyhedronGeometry)」
  • 「管 (TubeGeometry)」
  • 「パラメトリック曲面 (ParametricGeometry)」

など様々な形状の物体が用意されています。もちろん自分でオリジナルの物を作る事も可能です。

全てやるのは、少し無理なので、今回は「球」を解説します。

・球 (SphereGeometry)
球を表示するジオメトリです。

球のコンストラクタ

THREE.SphereGeometry ( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength )

コンストラクタ引数

  • widthSegments [= 8]経度分割数。経線が細かくなる。
  • heightSegments [= 6]緯度分割数。緯線が細かくなる。
  • phiLength [= 2π]経線中心角。単位はラジアン
  • thetaLength [= π]緯線中心角。単位はラジアン

コード例①:

        var sphere = new THREE.Mesh(                                         
                  new THREE.SphereGeometry(200),   
                  new THREE.MeshPhongMaterial({                            
                       color: 0xffffff                                  
                       }));

コード例②:

var geometry = new THREE.SphereGeometry(200);  
var material = new THREE.MeshPhongMaterial( { color: 0xffffff } );
var sphere = new THREE.Mesh( geometry, material );
scene.add( sphere );

実行例:
f:id:gupuru:20131123165906p:plain


質感(マテリアル)を説明します。

マテリアルは、簡単にいうと「質感・材質」のことです。
マテリアルの種類も、MeshBasicMaterial,MeshLambertMaterial,MeshPhongMaterialの3種類あります。
質感は、MeshBasicMaterialが一番低く、MeshPhongMaterialが一番高いです。
影や光の反射などを綺麗に描画するのは、MeshPhongMaterialです。また、一般的にMeshPhongMaterialが多く使われるようです。

画像で見比べてみます。(球の材質だけを変えています)
・MeshBasicMaterial
f:id:gupuru:20131123165724p:plain

・MeshLambertMaterial
f:id:gupuru:20131123165812p:plain

・MeshPhongMaterial
f:id:gupuru:20131123165906p:plain

写真でも分かるように、MeshBasicMaterialは、影や光の反射などが全く描画されていません。逆に、MeshPhongMaterialだと、綺麗に描画されています。MeshLambertMaterialは、両者の中間と言った所ですね〜

マテリアルのコードの書き方は、
MeshPhongMaterialの場合、

new THREE.MeshPhongMaterial

と書くだけです。
他も同じです。

new THREE.MeshBasicMaterial

で、マテリアルには、プロパティというものもあります。
このプロパティで、色などの設定を行います。
プロパティも種類がたくさんあります。color以外をいくつかをあげます。

  • side [= THREE.FrontSide] 表示する面
  • visible [= true] 表示するかしないか。false指定で見えなくなる。
  • opacity [= 1]不透明度。

コレ以外にも、いっぱあります。
もっと知りたい人は、こちらで分かりやすく解説してくれています。
多彩な表現力のWebGLを扱いやすくする「Three.js」(3/5)- @IT

プロパティの書き方は、

var material = new THREE.MeshPhongMaterial( { color: 0xffffff } );

このように、colorのところがプロパティを書く所です。

マテリアルは大変です(笑)

あと、最後におまけにAxisHelperを紹介します。
AxisHelperは、xyz軸を表示するものです。
こんな感じの軸が出ます。
f:id:gupuru:20131121173013p:plain
制作する時に、スゴく便利です。

書き方は、

     //軸の表示(長さ:1000)   
   var  axis = new THREE.AxisHelper(1000);          
    //sceneに追加 
     scene.add(axis);     
    // 位置設定                             
     axis.position.set(0,0,1);        

こんな感じに簡単に追加できます!

さて、今回は、これくらいにしましょうか〜
お疲れ様でした〜
次回は、 renderer.clear(); (ループ処理)をやります! 


前回         次回