Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
        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));
            }
        }
Exemplo n.º 3
0
        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));
                    }
                }
            }
        }
Exemplo n.º 4
0
    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);
    }
Exemplo n.º 5
0
 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;
 }
Exemplo n.º 6
0
    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);
    }
Exemplo n.º 7
0
    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);
    }