Make able to emit in specified range of directions

Controlled by polar and azimuth start and finish angles, around point or
from specified part of spheroid surface.
This commit is contained in:
David Rowe 2015-09-17 22:40:49 -07:00
parent f647dcf147
commit 9e2b5b75b6
2 changed files with 77 additions and 38 deletions

View file

@ -22,13 +22,15 @@
particleExample = -1,
PARTICLE_RADIUS = 0.04,
SLOW_EMIT_RATE = 2.0,
HALF_EMIT_RATE = 50.0,
FAST_EMIT_RATE = 100.0,
SLOW_EMIT_SPEED = 0.05,
SLOW_EMIT_SPEED = 0.025,
FAST_EMIT_SPEED = 1.0,
GRAVITY_EMIT_ACCELERATON = { x: 0.0, y: -0.3, z: 0.0 },
ZERO_EMIT_ACCELERATON = { x: 0.0, y: 0.0, z: 0.0 },
PI = 3.141593,
NUM_PARTICLE_EXAMPLES = 13;
DEG_TO_RAD = PI / 180.0,
NUM_PARTICLE_EXAMPLES = 17;
function onClickDownOnEntity(entityID) {
if (entityID === box || entityID === sphere || entityID === particles) {
@ -116,23 +118,24 @@
});
break;
case 10:
print("Emit in all directions from point");
print("Emit in a spread beam");
Entities.editEntity(particles, {
colorStart: { red: 255, green: 255, blue: 255 },
colorFinish: { red: 255, green: 255, blue: 255 },
alphaFinish: 0.0,
emitRate: FAST_EMIT_RATE,
polarFinish: 2.0 * DEG_TO_RAD
});
break;
case 11:
print("Emit in all directions from point");
Entities.editEntity(particles, {
emitSpeed: SLOW_EMIT_SPEED,
emitAcceleration: ZERO_EMIT_ACCELERATON,
polarFinish: PI
});
Entities.editEntity(box, {
visible: false
});
Entities.editEntity(sphere, {
visible: true
});
break;
case 11:
case 12:
print("Emit from sphere surface");
Entities.editEntity(particles, {
colorStart: { red: 255, green: 255, blue: 255 },
@ -147,15 +150,39 @@
visible: true
});
break;
case 12:
case 13:
print("Emit from hemisphere of sphere surface");
Entities.editEntity(particles, {
polarFinish: PI / 2.0
});
break;
case 14:
print("Emit from equator of sphere surface");
Entities.editEntity(particles, {
polarStart: PI / 2.0,
emitRate: HALF_EMIT_RATE
});
break;
case 15:
print("Emit from half equator of sphere surface");
Entities.editEntity(particles, {
azimuthStart: -PI / 2.0,
azimuthFinish: PI / 2.0
});
break;
case 16:
print("Stop emitting");
Entities.editEntity(particles, {
emitDimensions: pointDimensions,
emitOrientation: verticalOrientation,
alphaFinish: 1.0,
emitRate: SLOW_EMIT_RATE,
emitSpeed: FAST_EMIT_SPEED,
emitAcceleration: GRAVITY_EMIT_ACCELERATON,
polarStart: 0.0,
polarFinish: 0.0,
azimuthStart: -PI,
azimuthFinish: PI,
animationIsPlaying: false
});
Entities.editEntity(box, {

View file

@ -66,7 +66,7 @@ const float ParticleEffectEntityItem::DEFAULT_EMIT_RADIUS_START = 1.0f; // Emit
const float ParticleEffectEntityItem::DEFAULT_POLAR_START = 0.0f; // Emit along z-axis
const float ParticleEffectEntityItem::DEFAULT_POLAR_FINISH = 0.0f; // ""
const float ParticleEffectEntityItem::DEFAULT_AZIMUTH_START = -PI; // Emit full circumference (when polarFinish > 0)
const float ParticleEffectEntityItem::DEFAULT_AZIMUTH_FINISH = -PI; // ""
const float ParticleEffectEntityItem::DEFAULT_AZIMUTH_FINISH = PI; // ""
const glm::vec3 ParticleEffectEntityItem::DEFAULT_EMIT_ACCELERATION(0.0f, -9.8f, 0.0f);
const glm::vec3 ParticleEffectEntityItem::DEFAULT_ACCELERATION_SPREAD(0.0f, 0.0f, 0.0f);
const float ParticleEffectEntityItem::DEFAULT_PARTICLE_RADIUS = 0.025f;
@ -689,34 +689,46 @@ void ParticleEffectEntityItem::stepSimulation(float deltaTime) {
(_emitSpeed + (2.0f * randFloat() - 1.0f) * _speedSpread) * (_emitOrientation * Z_AXIS);
_particleAccelerations[i] = _emitAcceleration + (2.0f * randFloat() - 1.0f) * _accelerationSpread;
} else if (_emitDimensions == glm::vec3()) {
// Emit around point
float elevation = asin(2.0f * randFloat() - 1.0f); // Distribute points evenly over surface
glm::vec3 emitDirection = _emitOrientation * fromSpherical(elevation, randFloat() * TWO_PI);
_particlePositions[i] = getPosition();
_particleVelocities[i] =
(_emitSpeed + (2.0f * randFloat() - 1.0f) * _speedSpread) * (_emitOrientation * emitDirection);
_particleAccelerations[i] = _emitAcceleration + (2.0f * randFloat() - 1.0f) * _accelerationSpread;
} else {
// Emit from ellipsoid
float elevation = asin(2.0f * randFloat() - 1.0f); // Distribute points approximately evenly over surface
float azimuth = (2.0f * randFloat() - 1.0f) * PI;
// TODO: Sort out ellipsoid equations to distribute completely evenly over surface.
glm::vec3 radiuses = 0.5f * _emitDimensions;
float x = radiuses.x * cos(elevation) * cos(azimuth);
float y = radiuses.y * cos(elevation) * sin(azimuth);
float z = radiuses.z * sin(elevation);
glm::vec3 emitPosition = glm::vec3(x, y, z);
glm::vec3 emitDirection = glm::normalize(glm::vec3(
x / (radiuses.x * radiuses.x),
y / (radiuses.y * radiuses.y),
z / (radiuses.z * radiuses.z)
));
// Emit around point or from ellipsoid
// - Distribute directions evenly around point
// - Distribute points relatively evenly over ellipsoid surface
float elevationMinZ = sin(PI_OVER_TWO - _polarFinish);
float elevationMaxZ = sin(PI_OVER_TWO - _polarStart);
float elevation = asin(elevationMinZ + (elevationMaxZ - elevationMinZ) * randFloat());
float azimuth;
if (_azimuthFinish >= _azimuthStart) {
azimuth = _azimuthStart + (_azimuthFinish - _azimuthStart) * randFloat();
} else {
azimuth = _azimuthStart + (2.0 * PI + _azimuthFinish - _azimuthStart) * randFloat();
}
glm::vec3 emitDirection;
if (_emitDimensions == glm::vec3()) {
// Point
emitDirection = _emitOrientation * fromSpherical(elevation, azimuth);
_particlePositions[i] = getPosition();
} else {
// Ellipsoid
glm::vec3 radiuses = 0.5f * _emitDimensions;
float x = radiuses.x * cos(elevation) * cos(azimuth);
float y = radiuses.y * cos(elevation) * sin(azimuth);
float z = radiuses.z * sin(elevation);
glm::vec3 emitPosition = glm::vec3(x, y, z);
emitDirection = glm::normalize(glm::vec3(
x / (radiuses.x * radiuses.x),
y / (radiuses.y * radiuses.y),
z / (radiuses.z * radiuses.z)
));
_particlePositions[i] = getPosition() + _emitOrientation * emitPosition;
}
_particlePositions[i] = getPosition() + _emitOrientation * emitPosition;
_particleVelocities[i] =
(_emitSpeed + (2.0f * randFloat() - 1.0f) * _speedSpread) * (_emitOrientation * emitDirection);
_particleAccelerations[i] = _emitAcceleration + (2.0f * randFloat() - 1.0f) * _accelerationSpread;