public List <ScatterPhoton> Emit(float duration) { List <ScatterPhoton> ret = new List <ScatterPhoton>(); // Debug.LogFormat("Emitting energy {0}",energy); for (int i = 0; i < energy; i++) { Vector3 emitPos = location + radius * TrailmeshMaker.onUnitSphere(); Vector3 perp = new Vector3(-directionPreference.y, directionPreference.x, 0); if (directionPreference.z > 0.9) { perp = new Vector3(0, directionPreference.z, -directionPreference.y); } Quaternion rt = Quaternion.AngleAxis((float)RandomGen3.NextDouble() * 360, directionPreference); perp = (rt * perp).normalized; float angl = Mathf.PI * (1 - directionBias) * (float)RandomGen3.NextDouble(); Vector3 dir = (directionPreference * Mathf.Cos(angl) + perp * Mathf.Sin(angl)).normalized; ScatterPhoton pht = new ScatterPhoton(); // Debug.LogFormat("Derection:{0} {1}", dir, angl); pht.direction = dir; pht.position = emitPos; pht.timeOffset = timeOffset + duration * (float)RandomGen3.NextDouble(); ret.Add(pht); } // Debug.LogFormat("Emitted energy {0}", energy); return(ret); }
ScatterPhoton EmitCherenkovPhoton(Vector3 pos, float timeOffset) { float shift = (float)RandomGen3.NextDouble(); Vector3 perp = new Vector3(-direction.y, direction.x, 0); if (Mathf.Abs(direction.z) > 0.9) { perp = new Vector3(0, direction.z, -direction.y); } Quaternion rt = Quaternion.AngleAxis(shift * 360, direction); perp = rt * perp; perp /= perp.magnitude; Vector3 photondir = direction * cos41 + perp * sin41; ScatterPhoton ret = new ScatterPhoton(); ret.direction = photondir; ret.position = pos; ret.timeOffset = timeOffset; //ret.Propagate(IcecubeDust.getAbsorption(pos), IcecubeDust.getScatter(pos)); return(ret); }