void RandomlySpread() { for (int i = 0; i < count; ++i) { // 随机每个粒子距离中心的半径,同时希望粒子集中在平均半径附近 float midRadius = (maxRadius + minRadius) / 2; float minRadiusOfOneParticle = Random.Range(minRadius, midRadius); float maxRadiusOfOneParticle = Random.Range(midRadius, maxRadius); float radius = Random.Range(minRadiusOfOneParticle, maxRadiusOfOneParticle); // 随机每个粒子的角度 float angle = Random.Range(0.0f, 360.0f); float theta = angle / 180 * Mathf.PI; // 随机每个粒子的游离起始时间 float time = Random.Range(0.0f, 1000f); // 设置粒子顺时针/逆时针 if (Random.Range(0f, 2f) > 1f) { particlePositions[i] = new ParticlePosition(radius, angle, time, true); } else { particlePositions[i] = new ParticlePosition(radius, angle, time, false); } // 使用上述参数构造粒子 particles[i].position = new Vector3(particlePositions[i].radius * Mathf.Cos(theta), 0f, particlePositions[i].radius * Mathf.Sin(theta)); } system.SetParticles(particles, particles.Length); }
public void ParticleGeneration(int totalParticles, Vector2 partPos, string sprite) { this.Add(new ParticlePosition(partPos)); ParticlePosition yamum = (ParticlePosition)this.Children.ElementAt(this.Children.Count - 1); for (int i = 0; i <= totalParticles; i++) { yamum.Add(new Particle(new Vector2(random.Next(-50, 50), random.Next(-50, 50)), sprite)); } }
public override void Update(GameTime gameTime) { base.Update(gameTime); if (this.children.Count - 1 >= 0) { for (int i = this.children.Count - 1; i >= 0; i--) { ParticlePosition yamum = (ParticlePosition)this.Children.ElementAt(i); if (yamum.timer <= 0) { this.Remove(this.Children.ElementAt(i)); } } } }
void particleInitial() { for (int i = 0; i < count; ++i) { float midRadius = (max_radius + min_radius) / 2; float minRate = Random.Range(1.0f, midRadius / min_radius); float maxRate = Random.Range(midRadius / max_radius, 1.0f); float radius = Random.Range(min_radius * minRate, max_radius * maxRate); float theta = Random.Range(0.0f, 360.0f) / 180 * Mathf.PI; int choice = Random.Range(0, 3); int level = Random.Range(1, 6); particle[i] = new ParticlePosition(radius, theta, level); particle_arr[i].position = new Vector3(radius * Mathf.Cos(theta), 0f, radius * Mathf.Sin(theta)); } particle_system.SetParticles(particle_arr, particle_arr.Length); }
private void Start() { bestPositionGO = Instantiate(bestPositionGOPrefab, null); objectToFindStat = objectToFind; if (bestPositionGO != null) { bestPositionGO.name = "Best Position"; bestPositionGO.AddComponent <LineRenderer>(); lr = bestPositionGO.GetComponent <LineRenderer>(); lr.SetPosition(0, Particle.bestTeamPosition.position); lr.SetPosition(1, Particle.bestTeamPosition.position + Vector3.down * 250); lr.startColor = Color.blue; lr.endColor = Color.yellow; } swarmBest = Particle.bestTeamPosition; currentOmegaTextStatic = currentOmegaText; }
void RandomlySpread() { for (int i = 0; i < count; ++i) { // 随机每个粒子位置, 水平均匀分布 float radius = Random.Range(minRadius, maxRadius); float height = radius * heightRate; radius += Random.Range(minOut, maxOut); // 随机每个粒子的角度 float angle = Random.Range(0.0f, 360.0f); float theta = angle / 180 * Mathf.PI; // 随机每个粒子的游离起始时间 float time = Random.Range(0.0f, 360.0f); Positions[i] = new ParticlePosition(radius, angle, time, height); Particles[i].position = new Vector3(Positions[i].radius * Mathf.Cos(theta), Positions[i].height, Positions[i].radius * Mathf.Sin(theta)); } particleSys.SetParticles(Particles, Particles.Length); }
void Start() { uint ngx, ngy, ngz; // groups declared in the compute shader float rad; float phi; float theta; float maxRad = 100f; npts = 1024 * 25; maxRad = 10.0f; positionBuffer = new ComputeBuffer(npts, sizeof(float) * 3, ComputeBufferType.Default); physicsBuffer = new ComputeBuffer(npts, sizeof(float) * 9, ComputeBufferType.Default); dataBuffer = new ComputeBuffer(npts, sizeof(float) * 3, ComputeBufferType.Default); bodyBuffer = new ComputeBuffer(1, sizeof(float) * 10, ComputeBufferType.Default); // stats_buffer = new ComputeBuffer (1, sizeof(float) * 3, ComputeBufferType.Default); csidSPH = minimalCloudCompute.FindKernel("Sph"); csidSmoothBall = legacyCloudCompute.FindKernel("SmoothBall"); csidBodyForces = minimalCloudCompute.FindKernel("BodyForces"); minimalCloudCompute.GetKernelThreadGroupSizes(csidSPH, out ngx, out ngy, out ngz); // just trust the same in other kernels nthr = npts / (int)ngx; ParticlePosition[] cloudPosition = new ParticlePosition[npts]; ParticlePhysics[] cloudPhysics = new ParticlePhysics[npts]; ParticleData[] cloudData = new ParticleData[npts]; body = new Body[1]; for (uint i = 0; i < npts; ++i) { cloudPosition [i] = new ParticlePosition(); rad = maxRad * Mathf.Sqrt(UnityEngine.Random.Range(0.010f, 1.0f)); theta = UnityEngine.Random.Range(0f, 3.1415926535f * 2f); phi = Mathf.Acos(UnityEngine.Random.Range(0f, 2f) - 1); // See https://www.bogotobogo.com/Algorithms/uniform_distribution_sphere.php cloudPosition[i].position = new Vector3(rad * Mathf.Cos(phi), rad * Mathf.Sin(theta) * Mathf.Sin(phi), rad * Mathf.Cos(theta) * Mathf.Sin(phi)); cloudPhysics [i].velocity = new Vector3(0, 0, 0); // 200000.0f * new Vector3 (Random.Range (-1f, 1f), Random.Range (-1f, 1f), Random.Range (-1f, 1f)); cloudPhysics [i].force = new Vector3(0, 0, 0); //(Random.Range (-1f, 1), Random.Range (-1f, 1f), Random.Range (-1f, 1f)); cloudData [i].color = new Vector3(1.0f, 0.2f, 0.2f); cloudPhysics [i].density = 0; cloudPhysics [i].pressure = 0; cloudPhysics [i].mass = 1.0f; } statistics = new int[3]; statistics[0] = 0; statistics[1] = 0; statistics[2] = 100000; // stats_buffer.SetData(statistics); positionBuffer.SetData(cloudPosition); physicsBuffer.SetData(cloudPhysics); dataBuffer.SetData(cloudData); int cloudID = Shader.PropertyToID("cloudPosition"); minimalCloudCompute.SetBuffer(csidSPH, cloudID, positionBuffer); minimalCloudCompute.SetBuffer(csidBodyForces, cloudID, positionBuffer); Shader.SetGlobalBuffer(cloudID, positionBuffer); Graphics.SetRandomWriteTarget(1, positionBuffer, true); int physID = Shader.PropertyToID("cloudPhysics"); minimalCloudCompute.SetBuffer(csidSPH, physID, physicsBuffer); minimalCloudCompute.SetBuffer(csidBodyForces, physID, physicsBuffer); Shader.SetGlobalBuffer(cloudID, physicsBuffer); int dataID = Shader.PropertyToID("cloudData"); minimalCloudCompute.SetBuffer(csidSPH, dataID, dataBuffer); Shader.SetGlobalBuffer(cloudID, dataBuffer); Graphics.SetRandomWriteTarget(2, dataBuffer, true); // int indexStats = Shader.PropertyToID("statistics"); // minimalCloudCompute.SetBuffer(csidSPH, indexStats, stats_buffer); OnValidate(); // set global shader values mobod.SendMessage("SetVertsToCloud"); body [0].cog = mobod.cog; body [0].nParts = mobod.nVerts; bodyBuffer.SetData(body); minimalCloudCompute.SetBuffer(csidSPH, "body", bodyBuffer); minimalCloudCompute.SetBuffer(csidBodyForces, "body", bodyBuffer); bodyDataAsFlatArray = new float[9 * mobod.nVerts]; // Debug.Log(mobod.nVerts); }