[Three.js]WebGLハート効果


[Three.js]WebGLハート効果
本論文の実現効果はThree.js、 Sparks.jsのexamples.ブラウザがWebGLをサポートしている場合は、ここをクリックして効果を確認できます^^.
 
一、敷石
WebGLは、OpenGL ES 2.0に基づくブラウザ上の3 Dテクノロジーです.基本チュートリアルはHi,WebGL!,Learning WebGL.
         Three.js,WebGLの3 Dエンジンライブラリ.ええ、必要なものがあります.これを見てもいいです.Click here!
 
二、単刀直入
1
)ソースコードのダウンロード
添付ファイル!はい、htmlを開けて効果を見ることができます.
 
ソースコードを見るとまだStatsがあります.jsは、左上隅統計FPS用です.
 
388行を参照し、エントリを実行し、実装プロセスを基本的に決定します.
 
   
   
   
   
  1. function threeStart() { 
  2.   initScene(); 
  3.   initParticles(); 
  4.   initShape(); 
  5.   initEmitter(); 
  6.   animate(); 
  7.  
  8. window.addEventListener('load', threeStart, false); 

 
2
)initScene ()
70行を参照して、メソッド内で外部に使用する変数を上に定義します.その後のメソッドはすべてそうです.
基本的にはcamera->scene->renderer[->stats]という流れです.
 
3
)initParticles()
3.1)シェーダ
121-147行、THREE.ShaderMaterialの定義.ここでattributes,uniformsはGLSL内の変数に対応し、そのtypeタイプはWebGLRendererである.js内で「switch(type)」を検索すると見つかります.Vertex Shader&Fragment Shaderは次のとおりです.
   
   
   
   
  1. --   --> 
  2. "x-shader/x-vertex"</span><span> id=</span><span class="string">"vertexshader"</span><span>>  </span></span></li> <li class="alt"><span>    attribute <span class="keyword">float</span><span> </span><span class="keyword">size</span><span>; </span></span></li> <li><span>    attribute vec3 ca; </span></li> <li class="alt"><span> </span></li> <li><span>    <span class="keyword">varying</span><span> vec3 vColor; </span></span></li> <li class="alt"><span> </span></li> <li><span>    void main() { </span></li> <li class="alt"><span>        vColor = ca; </span></li> <li><span> </span></li> <li class="alt"><span>        /* </span></li> <li><span>         *  , Object 。 </span></li> <li class="alt"><span>         *  gl_PointSize 。 。 </span></li> <li><span>         */ </span></li> <li class="alt"><span> </span></li> <li><span>        //   </span></li> <li class="alt"><span>        vec4 mvPosition = modelViewMatrix * vec4(position, 1.0); </span></li> <li><span>        //   </span></li> <li class="alt"><span>        gl_PointSize = <span class="keyword">size</span><span> * (200.0 / length(mvPosition.xyz)); </span></span></li> <li><span>        //   </span></li> <li class="alt"><span>        gl_Position = projectionMatrix * mvPosition; </span></li> <li><span>    } </span></li> <li class="alt"><span>  
  3. --   --> 
  4. "x-shader/x-fragment"</span><span> id=</span><span class="string">"fragmentshader"</span><span>>  </span></span></li> <li><span>    uniform vec3 color; </span></li> <li class="alt"><span>    uniform sampler2D texture; </span></li> <li><span> </span></li> <li class="alt"><span>    <span class="keyword">varying</span><span> vec3 vColor; </span></span></li> <li><span>     </span></li> <li class="alt"><span>    void main() { </span></li> <li><span>        //  gl_PointCoord , UV  </span></li> <li class="alt"><span>        vec4 outColor = texture2D(texture, gl_PointCoord); </span></li> <li><span>        //   =   *   </span></li> <li class="alt"><span>        gl_FragColor = outColor * vec4(color * vColor.xyz, 1.0); </span></li> <li><span> </span></li> <li class="alt"><span>        //  z  </span></li> <li><span>        <span class="keyword">float</span><span> depth = gl_FragCoord.z / gl_FragCoord.w; </span></span></li> <li class="alt"><span>        //  :  </span></li> <li><span>        const vec3 fogColor = vec3(0.0, 0.0, 0.0); </span></li> <li class="alt"><span>        // const vec3 fogColor = vec3(0xff, 0xff, 0xff); </span></li> <li><span>        //  :depth<=200 0,>=600 1 </span></li> <li class="alt"><span>        <span class="keyword">float</span><span> fogFactor = smoothstep(200.0, 600.0, depth); </span></span></li> <li><span>        //   </span></li> <li class="alt"><span>        gl_FragColor = mix(gl_FragColor, vec4(fogColor, gl_FragColor.w), fogFactor); </span></li> <li><span>    } </span></li> <li class="alt"><span> 

 
3.2)パーティクル初期化
149~178行を参照すると、ジオメトリが作成され、10000個の頂点が無限遠に定義されます.倉庫になったら、出して、使い終わって、また戻します(無限遠まで).
 
4
)initShape()
221行開始、THREE.Shape()はハート型に整えます.その後、365行、render()内で[0,1]間からその位置を取り出し、次のようにエミッタの現在の位置に値を割り当てます.
 
   
   
   
   
  1. //   
  2. timeOnShapePath += 0.01; 
  3. if (timeOnShapePath > 1) timeOnShapePath -= 1; 
  4. var pointOnShape = heartShape.getPointAt(timeOnShapePath); 
  5.  
  6. emitterpos.x = pointOnShape.x * 2 - 50; 
  7. emitterpos.y = -pointOnShape.y * 2 + 100; 

 
5
)initEmitter()
         Sparks.jsの使用は237行です.自分のものがなければ、他人のものを使うしかない.そして久しぶりに更新しました.
 
6
)animate()
requestAnimationFrameで繰り返し実行します.ここでrender()は変換を処理し、再レンダリングします.stats.update()は、左上隅のプラグインの更新です.
 
render()の前の部分はマウスで回転し、マウスイベントに関連付けられます.中間はトラック移動です.頂点、サイズ、色を更新することを宣言する3つの文もあります.
 
   
   
   
   
  1. //   
  2. group.geometry.verticesNeedUpdate = true//   
  3. attributes.size.needsUpdate = true//   
  4. attributes.ca.needsUpdate = true//   

 
その変化はinitEmitter()内、Sparks.jsのコールバックにしました.更新が必要だと宣言したのはここだけだjsはシェーダに対応する変数値を更新します.
 
最後の文は、シーンを繰り返しレンダリングします.
 
三、何か言って
祝日があるって=.