Skip to content

Instantly share code, notes, and snippets.

@naoyashiga
Created October 9, 2013 05:30
Show Gist options
  • Save naoyashiga/6896643 to your computer and use it in GitHub Desktop.
Save naoyashiga/6896643 to your computer and use it in GitHub Desktop.
A Pen by naoyashiga.
<script type="text/javascript" src="http://jsdo.it/lib/three.js-r60/js"></script>
/*-----------------------------------
グローバル変数
-----------------------------------*/
var camera,geometry,scene,renderer;
var SCREEN_WIDTH = window.innerWidth;
var SCREEN_HEIGHT = window.innerHeight;
var mouseX = 0,mouseY = 0;
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;
var particles,particle,count = 0;
//パーティクルの個数
var AMOUNTX = 50;
var AMOUNTY = 50;
//パーティクル同士の間隔
var SEPARATION = 50;
var theta = 0;
init();
animate();
function init(){
//レンダラーを生成
renderer = new THREE.CanvasRenderer();
//レンダラーのサイズを設定
renderer.setSize(SCREEN_WIDTH,SCREEN_HEIGHT);
//レンダラーをDOMに追加
document.body.appendChild(renderer.domElement);
//カメラの作成
Perspective_Camera();
//Orthographic_Camera();
//シーンを生成
scene = new THREE.Scene();
particles = new Array();
//パーティクル作成
Particle();
//レンダラーをレンダリングする
renderer.render(scene,camera);
document.addEventListener("mousemove",onDocumentMouseMove,false);
document.addEventListener("touchstart",onDocumentTouchStart,false);
document.addEventListener("touchmove",onDocumentTouchMove,false);
}
function onDocumentMouseMove(event){
mouseX = event.clientX - windowHalfX;
mouseY = event.clientY - windowHalfY;
}
/*-----------------------------------
新しくスクリーンに指が触れた場合に発生するイベント
-----------------------------------*/
function onDocumentTouchStart(event){
if(event.touches.length > 1){//触れている指の本数をチェック
//スクロール停止
event.preventDefault();
mouseX = event.touches[0].pageX - windowHalfX;
mouseY = event.touches[0].pageY - windowHalfY;
}
}
/*-----------------------------------
スクリーンに触れている指をスライドさせた場合に発生するイベント
-----------------------------------*/
function onDocumentTouchMove(event){
if(event.touches.length == 1){//触れている指の本数をチェック
//スクロール停止
event.preventDefault();
mouseX = event.touches[0].pageX - windowHalfX;
mouseY = event.touches[0].pageY - windowHalfY;
}
}
/*-----------------------------------
平行投影カメラ
-----------------------------------*/
function Orthographic_Camera(){
//平行投影カメラにおける視線の領域
var left = - SCREEN_WIDTH;
var right = SCREEN_WIDTH;
var top = SCREEN_HEIGHT;
var bottom = - SCREEN_HEIGHT;
//クリッピング手前
var near = -2000;
//クリッピング奥
var far = 1000;
//平行投影カメラを生成
camera = new THREE.OrthographicCamera( left , right , top , bottom , near , far );
camera.position.x = 200;
camera.position.y = 100;
camera.position.z = 200;
}
/*-----------------------------------
透視投影カメラ
-----------------------------------*/
function Perspective_Camera(){
//画角
var fov = 75;
//縦横比
var aspect = SCREEN_WIDTH / SCREEN_HEIGHT;
//クリッピング手前
var near = 1;
//クリッピング奥
var far = 10000;
//カメラを生成
camera = new THREE.PerspectiveCamera(fov,aspect,near,far);
camera.position.x = 1000;
camera.position.z = 100;
}
/*-----------------------------------
Particleを作成
-----------------------------------*/
function Particle(){
//パーティクルの形
var PI2 = Math.PI * 2;
var arcX = 0;
var arcY = 0;
var radius = 1;
var startAngle = 0;
var endAngle = PI2;
var anticlockwise = true;
var particleColor = 0xffffff;
var material = new THREE.ParticleCanvasMaterial({
color:particleColor,
program:function(context){
context.beginPath();
context.arc(arcX, arcY, radius, startAngle, endAngle, anticlockwise);
context.closePath();
context.fill();
}
});
var i = 0;
for(var ix = 0;ix < AMOUNTX;ix++){
for(var iy = 0;iy < AMOUNTY;iy++){
particle = particles[i++] = new THREE.Particle(material);
particle.position.x = ix * SEPARATION - ((AMOUNTX * SEPARATION) / 2);
particle.position.z = iy * SEPARATION - ((AMOUNTY * SEPARATION) / 2);
scene.add(particle);
}
}
}
/*-----------------------------------
アニメーション繰り返し処理
-----------------------------------*/
function animate(){
render();
//繰り返し処理
requestAnimationFrame(animate);
}
/*-----------------------------------
カメラの視点アニメーション
-----------------------------------*/
function render(){
//カメラの位置
camera.position.x += (mouseX - camera.position.x) * .05;
camera.position.y += (-mouseY + 200 - camera.position.y) * .05;
camera.position.z = mouseX;
//注視点を指定
camera.lookAt(scene.position);
var i = 0;
for(var ix = 0;ix < AMOUNTX;ix++){
for(var iy = 0;iy < AMOUNTY;iy++){
particle = particles[i++];
//円を描きながら回る
particle.position.x = Math.cos((ix + theta)*0.3)*100;
particle.position.y = Math.sin((ix + theta)*0.3)*100 + Math.sin((iy + theta)*0.3)*100;
particle.scale.x = particle.scale.y = Math.sin((ix + theta)*0.3) + Math.sin((iy + theta)*0.3)*2;
}
}
theta += 0.1;
renderer.render(scene,camera);
}
* {
margin: 0;
padding: 0;
border: 0;
}
body {
background: #000;
font: 30px sans-serif;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment