前回の第11回
パーティクルのオブジェクトを加える
炎のパーティクルは,
createParticles(炎の数, パーティクル数, 炎の位置の半径, 炎の垂直座標, シーン)
このパーティクルをつくる関数
// var DefaultMaterialManager = require("awayjs-display/lib/managers/DefaultMaterialManager");
var lightPicker;
var fireObjects;
var particleMaterial;
function initialize() {
lightPicker = new StaticLightPicker([directionalLight]);
// plane = createPlane(800, 800, directionalLight, -300);
plane = createPlane(800, 800, lightPicker, -20);
fireObjects = createParticles(3, 500, 300, 5, scene);
}
function createPlane(width, height, light, y) {
var material = new MethodMaterial(); // DefaultMaterialManager.getDefaultTexture());
// material.lightPicker = new StaticLightPicker([light]);
material.lightPicker = light;
}
なお,
パーティクルをつくる関数
パーティクルは平面で,
パーティクルに用いるGeometryオブジェクトは,
function createParticles(numFires, numParticles, radius, y, scene) {
var primitive = new PrimitivePlanePrefab(10, 10, 1, 1, false);
var geometry = primitive.geometry;
var material = particleMaterial = new MethodMaterial();
var geometrySet = [];
for (var i = 0; i < numParticles; i++) {
geometrySet[i] = geometry;
}
var fireObjects = getFireObjects(geometrySet, numFires, material, animationSet, radius, y, scene);
return fireObjects;
}
炎のオブジェクトをつくって,
getFireObjects(幾何情報の配列, 炎の数, 表面素材, アニメーションセット, 炎の位置の半径, 炎の垂直座標, シーン)
炎のオブジェクトの配列をつくる関数
var ParticleGeometryHelper = require("awayjs-renderergl/lib/utils/ParticleGeometryHelper");
function getFireObjects(geometrySet, numFires, material, animationSet, radius, y, scene) {
var fireObjects = [];
var particleGeometry = ParticleGeometryHelper.generateGeometry(geometrySet);
var anglePerFire = Math.PI * 2 / numFires;
for (var i = 0; i < numFires; i++) {
var mesh = createAnimationParticle(particleGeometry, material, animationSet, fireObjects);
var angle = i * anglePerFire;
mesh.x = radius * Math.sin(angle);
mesh.z = radius * Math.cos(angle);
mesh.y = y;
scene.addChild(mesh);
}
return fireObjects;
}
炎のオブジェクトをつくって返す関数
var Mesh = require("awayjs-display/lib/entities/Mesh");
function createAnimationParticle(particleGeometry, material, animationSet, fireObjects) {
var mesh = new Mesh(particleGeometry, material);
fireObjects.push(new FireObject(mesh, animator));
return mesh;
}
アニメーションさせる炎のオブジェクトは,
new FireObject(Meshオブジェクト, ParticleAnimatorオブジェクト)
コード1 アニメーションさせる炎を定めたクラス
function FireObject(mesh, animator) {
this.strength = 0;
this.mesh = mesh;
this.animator = animator;
}
FireObject.prototype.startAnimation = function() {
this.animator.start();
};
- ※1
- MethodMaterial()コンストラクタの引数にデフォルトのテクスチャ
(BitmapTextureオブジェクト) を渡してもとくに問題はない。だが, お題の 「Animating particles simulating fire」 では引数を与えていないので, それに合わせた。