3D fireworks
This commit is contained in:
parent
61cccb2674
commit
5af08e5cd7
23
build.js
23
build.js
@ -470,7 +470,7 @@
|
|||||||
},
|
},
|
||||||
globalMass: 10,
|
globalMass: 10,
|
||||||
global: function (mass, g) {
|
global: function (mass, g) {
|
||||||
return new Vector(0, mass * (g || this.globalMass), 0);
|
return new Vector(0, -mass * (g || this.globalMass), 0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
$__export("default", Gravity);
|
$__export("default", Gravity);
|
||||||
@ -525,14 +525,8 @@
|
|||||||
playing: false,
|
playing: false,
|
||||||
start: function (fn) {
|
start: function (fn) {
|
||||||
Frames.tick(Date.now());
|
Frames.tick(Date.now());
|
||||||
var canvas = typeof Bolt.configs.canvas === "function" ? Bolt.configs.canvas() : Bolt.configs.canvas;
|
|
||||||
Bolt._canvas = canvas;
|
|
||||||
var ctx = canvas.getContext("2d");
|
|
||||||
(function loop() {
|
(function loop() {
|
||||||
reqAnimFrame(function (now) {
|
reqAnimFrame(function (now) {
|
||||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
||||||
ctx.fillStyle = "black";
|
|
||||||
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
||||||
var avg = Frames.tick(now);
|
var avg = Frames.tick(now);
|
||||||
for (var i = 0,
|
for (var i = 0,
|
||||||
len = Bolt.objects.length; i < len; i++) {
|
len = Bolt.objects.length; i < len; i++) {
|
||||||
@ -544,10 +538,6 @@
|
|||||||
acc.add(force);
|
acc.add(force);
|
||||||
object.velocity.add(acc.scalar(Frames.elapsed));
|
object.velocity.add(acc.scalar(Frames.elapsed));
|
||||||
object.velocity.scalar(Math.pow(object.damping, Frames.elapsed));
|
object.velocity.scalar(Math.pow(object.damping, Frames.elapsed));
|
||||||
ctx.beginPath();
|
|
||||||
ctx.fillStyle = object.color;
|
|
||||||
ctx.arc(object.position.x, object.position.y, object.mass, 0, 2 * Math.PI);
|
|
||||||
ctx.fill();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fn) fn.apply(this, arguments);
|
if (fn) fn.apply(this, arguments);
|
||||||
@ -589,16 +579,7 @@
|
|||||||
}],
|
}],
|
||||||
execute: function () {
|
execute: function () {
|
||||||
Bolt = {
|
Bolt = {
|
||||||
configs: {
|
configs: { globalGravity: true },
|
||||||
globalGravity: true,
|
|
||||||
canvas: function () {
|
|
||||||
var canvas = document.createElement("canvas");
|
|
||||||
canvas.width = window.innerWidth;
|
|
||||||
canvas.height = window.innerHeight;
|
|
||||||
document.body.appendChild(canvas);
|
|
||||||
return canvas;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
config: function (o) {
|
config: function (o) {
|
||||||
for (var i in o) {
|
for (var i in o) {
|
||||||
this.configs[i] = o[i];
|
this.configs[i] = o[i];
|
||||||
|
File diff suppressed because one or more lines are too long
@ -1,32 +1,69 @@
|
|||||||
|
var scene = new THREE.Scene(),
|
||||||
|
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 10000),
|
||||||
|
renderer = new THREE.WebGLRenderer(),
|
||||||
|
light = new THREE.HemisphereLight(0xf0f0f0, 0x404040);
|
||||||
|
|
||||||
|
camera.position.z = 1000;
|
||||||
|
renderer.setSize(window.innerWidth, window.innerHeight);
|
||||||
|
|
||||||
|
var cubeGeometry = new THREE.SphereGeometry(7, 8, 8),
|
||||||
|
redMaterial = new THREE.MeshLambertMaterial({color: 0xFF2200}),
|
||||||
|
orangeMaterial = new THREE.MeshLambertMaterial({color: 0xFFFB00});
|
||||||
|
|
||||||
|
scene.add(light);
|
||||||
|
|
||||||
|
document.body.appendChild(renderer.domElement);
|
||||||
|
|
||||||
|
|
||||||
function Firework(props) {
|
function Firework(props) {
|
||||||
var particle = Bolt.Particle(props);
|
this.particle = Bolt.Particle(props);
|
||||||
particle.type = props.type || 0;
|
this.type = props.type || 0;
|
||||||
particle.age = Math.random() * (5 - 3) + 3;
|
this.age = Math.random() * (5 - 3) + 3;
|
||||||
particle.damping = 0.93;
|
this.particle.damping = 0.93;
|
||||||
particle.velocity = props.velocity || Bolt.Vector.random([-8, 8], [-60, -12], [-5, 0]);
|
this.particle.velocity = props.velocity || Bolt.Vector.random([-8, 8], [60, 12], [-8, 8]);
|
||||||
particle.color = props.color;
|
|
||||||
return particle;
|
this.view = new THREE.Mesh(cubeGeometry, this.type === 0 ? redMaterial : orangeMaterial);
|
||||||
|
if(this.type === 1) {
|
||||||
|
this.view.scale.x = 0.5;
|
||||||
|
this.view.scale.y = 0.5;
|
||||||
|
this.view.scale.z = 0.5;
|
||||||
|
}
|
||||||
|
this.render();
|
||||||
|
scene.add(this.view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Firework.prototype.render = function() {
|
||||||
|
this.view.position.x = this.particle.position.x;
|
||||||
|
this.view.position.y = this.particle.position.y;
|
||||||
|
this.view.position.z = this.particle.position.z;
|
||||||
|
};
|
||||||
|
|
||||||
|
Firework.prototype.destroy = function() {
|
||||||
|
this.particle.destroy();
|
||||||
|
scene.remove(this.view);
|
||||||
|
this.view = null;
|
||||||
|
};
|
||||||
|
|
||||||
var fireworks = [];
|
var fireworks = [];
|
||||||
|
|
||||||
var count = 0;
|
var count = 0;
|
||||||
|
|
||||||
Bolt.Play.start(function() {
|
Bolt.Play.start(function() {
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
if(count === 8) {
|
if(count === 8) {
|
||||||
fireworks.push(new Firework({
|
fireworks.push(new Firework({
|
||||||
type: 0,
|
type: 0,
|
||||||
position: Bolt.Vector(Bolt._canvas.width/2, Bolt._canvas.height/2, 0),
|
position: Bolt.Vector(window.innerWidth/4, 0, 0),
|
||||||
color: '#FF3636',
|
mass: 4
|
||||||
mass: 2
|
|
||||||
}));
|
}));
|
||||||
count = 0;
|
count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(var i = 0, len = fireworks.length; i < len; i++) {
|
for(var i = 0, len = fireworks.length; i < len; i++) {
|
||||||
var fw = fireworks[i];
|
var fw = fireworks[i];
|
||||||
|
fw.render();
|
||||||
|
|
||||||
fw.age -= Bolt.Frames.elapsed;
|
fw.age -= Bolt.Frames.elapsed;
|
||||||
if(fw.age < 0) {
|
if(fw.age < 0) {
|
||||||
fw.destroy();
|
fw.destroy();
|
||||||
@ -36,20 +73,50 @@ Bolt.Play.start(function() {
|
|||||||
|
|
||||||
if(fw.type === 1) continue;
|
if(fw.type === 1) continue;
|
||||||
|
|
||||||
for(var x = 0; x < 5; x++) {
|
for(var x = 0; x < 3; x++) {
|
||||||
var vel = fw.velocity.clone().add(Bolt.Vector.random([-8, 8], [-10, 10], [-5, 5]));
|
var vel = fw.particle.velocity.clone().add(Bolt.Vector.random([-8, 8], [-10, 10], [-8, 8]));
|
||||||
var childFirework = new Firework({
|
var childFirework = new Firework({
|
||||||
type: 1,
|
type: 1,
|
||||||
position: fw.position.clone(),
|
position: fw.particle.position.clone(),
|
||||||
velocity: vel,
|
velocity: vel,
|
||||||
color: '#FFA400',
|
mass: 2
|
||||||
mass: 1
|
|
||||||
});
|
});
|
||||||
fireworks.push(childFirework);
|
fireworks.push(childFirework);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderer.render(scene, camera);
|
||||||
}).then(function() {
|
}).then(function() {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var isMouseDown = false,
|
||||||
|
initial = {x: 0, y: 0},
|
||||||
|
last = {x: 0, y: 0};
|
||||||
|
|
||||||
|
renderer.domElement.style.setProperty('cursor', 'pointer');
|
||||||
|
|
||||||
|
renderer.domElement.addEventListener('mousedown', function(e) {
|
||||||
|
isMouseDown = true;
|
||||||
|
initial.x = e.pageX;
|
||||||
|
initial.y = e.pageY;
|
||||||
|
renderer.domElement.style.setProperty('cursor', 'grab');
|
||||||
|
});
|
||||||
|
|
||||||
|
renderer.domElement.addEventListener('mousemove', function(e) {
|
||||||
|
if(!isMouseDown) return;
|
||||||
|
camera.position.x = last.x + initial.x - e.pageX;
|
||||||
|
camera.position.y = last.y + -(initial.y - e.pageY);
|
||||||
|
});
|
||||||
|
|
||||||
|
renderer.domElement.addEventListener('mouseup', function(e) {
|
||||||
|
isMouseDown = false;
|
||||||
|
last.x = camera.position.x;
|
||||||
|
last.y = camera.position.y;
|
||||||
|
renderer.domElement.style.setProperty('cursor', 'pointer');
|
||||||
|
});
|
||||||
|
|
||||||
|
renderer.domElement.addEventListener('wheel', function(e) {
|
||||||
|
camera.position.z += e.deltaY * 10;
|
||||||
|
});
|
@ -8,6 +8,7 @@
|
|||||||
<p style="position: absolute;top:5px;left:10px;" id='fps'></p>
|
<p style="position: absolute;top:5px;left:10px;" id='fps'></p>
|
||||||
|
|
||||||
<script src='../../build.js'></script>
|
<script src='../../build.js'></script>
|
||||||
|
<script src='three.js'></script>
|
||||||
<script src='demo.js'></script>
|
<script src='demo.js'></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
1
demos/fireworks/lithree.min.js
vendored
Normal file
1
demos/fireworks/lithree.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
821
demos/fireworks/three.js
Normal file
821
demos/fireworks/three.js
Normal file
File diff suppressed because one or more lines are too long
@ -12,7 +12,7 @@ var Gravity = {
|
|||||||
|
|
||||||
globalMass: 10,
|
globalMass: 10,
|
||||||
global: function(mass, g) {
|
global: function(mass, g) {
|
||||||
return new Vector(0, mass * (g || this.globalMass), 0);
|
return new Vector(0, -mass * (g || this.globalMass), 0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -20,15 +20,11 @@ var Play = {
|
|||||||
start: function(fn) {
|
start: function(fn) {
|
||||||
Frames.tick(Date.now());
|
Frames.tick(Date.now());
|
||||||
|
|
||||||
var canvas = typeof Bolt.configs.canvas === 'function' ? Bolt.configs.canvas() : Bolt.configs.canvas;
|
|
||||||
Bolt._canvas = canvas;
|
|
||||||
var ctx = canvas.getContext('2d');
|
|
||||||
|
|
||||||
(function loop() {
|
(function loop() {
|
||||||
reqAnimFrame(function(now) {
|
reqAnimFrame(function(now) {
|
||||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
// ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
ctx.fillStyle = 'black';
|
// ctx.fillStyle = 'black';
|
||||||
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
// ctx.fillRect(0, 0, canvas.width, canvas.height);
|
||||||
var avg = Frames.tick(now);
|
var avg = Frames.tick(now);
|
||||||
|
|
||||||
for(var i = 0, len = Bolt.objects.length; i < len; i++) {
|
for(var i = 0, len = Bolt.objects.length; i < len; i++) {
|
||||||
@ -44,10 +40,10 @@ var Play = {
|
|||||||
object.velocity.add(acc.scalar(Frames.elapsed));
|
object.velocity.add(acc.scalar(Frames.elapsed));
|
||||||
object.velocity.scalar(Math.pow(object.damping, Frames.elapsed));
|
object.velocity.scalar(Math.pow(object.damping, Frames.elapsed));
|
||||||
|
|
||||||
ctx.beginPath();
|
// ctx.beginPath();
|
||||||
ctx.fillStyle = object.color;
|
// ctx.fillStyle = object.color;
|
||||||
ctx.arc(object.position.x, object.position.y, object.mass, 0, 2*Math.PI);
|
// ctx.arc(object.position.x, object.position.y, object.mass, 0, 2*Math.PI);
|
||||||
ctx.fill();
|
// ctx.fill();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
11
src/main.js
11
src/main.js
@ -6,16 +6,7 @@ import Play from './lib/play';
|
|||||||
|
|
||||||
var Bolt = {
|
var Bolt = {
|
||||||
configs: {
|
configs: {
|
||||||
globalGravity: true,
|
globalGravity: true
|
||||||
canvas: function() {
|
|
||||||
var canvas = document.createElement('canvas');
|
|
||||||
canvas.width = window.innerWidth;
|
|
||||||
canvas.height = window.innerHeight;
|
|
||||||
|
|
||||||
document.body.appendChild(canvas);
|
|
||||||
|
|
||||||
return canvas;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
config: function(o) {
|
config: function(o) {
|
||||||
|
Loading…
Reference in New Issue
Block a user