예제 #1
0
    // Update is called once per frame
    void Update()
    {
        part_near = new List <GameObject> [particles_count];
        for (int i = 0; i < _grid_width; i++)
        {
            for (int j = 0; j < _grid_height; j++)
            {
                _grid[i, j].Clear();
            }
        }

        for (int i = 0; i < particles_count; i++)
        {
            int x = (int)((particles[i].transform.position.x + _grid_width / 2));
            int y = (int)((particles[i].transform.position.y + _grid_height / 2));
            _grid[x, y].Add(particles[i]);
        }

        for (int i = 0; i < particles_count; i++)
        {
            Fluid_particle g = particles[i].GetComponent <Fluid_particle>();
            g.ro         = 0;
            g.ro_near    = 0;
            g.press      = 0;
            g.press_near = 0;
            part_near[i] = near_part(i);
        }
        foreach (GameObject i in part_near[0])
        {
            Debug.Log(i.name);
            Debug.Log("x" + (int)(i.transform.position.x + _grid_width / 2));
            Debug.Log("y" + (int)(i.transform.position.y + _grid_height / 2));
            Debug.Log("k" + h);
        }
    }
예제 #2
0
파일: SPH.cs 프로젝트: ArhinZi/SPH-demo
 // Update is called once per frame
 void Update()
 {
     part_near = new Collider2D[particles_count][];
     part_d    = new float[particles_count][];
     part_q    = new float[particles_count][];
     for (int i = 0; i < particles_count; i++)
     {
         Fluid_particle g = particles[i].GetComponent <Fluid_particle>();
         g.ro         = 0;
         g.ro_near    = 0;
         g.press      = 0;
         g.press_near = 0;
         g.a          = Vector2.zero;
         g.mass       = mass;
     }
     for (int i = 0; i < particles_count; i++)
     {
         Fluid_particle p = particles[i].GetComponent <Fluid_particle>();
         part_near[i] = (Physics2D.OverlapCircleAll(particles[i].transform.position, h - (scale / 2), 1 << 4 | 1 << 9));
         part_d[i]    = new float[part_near[i].Length];
         part_q[i]    = new float[part_near[i].Length];
         for (int j = 0; j < part_near[i].Length; j++)
         {
             part_d[i][j] = Vector2.Distance(particles[i].transform.position, part_near[i][j].transform.position);
             part_q[i][j] = 1 - (part_d[i][j] / h);
             if (part_d[i][j] > 0)
             {
                 p.ro      += (part_q[i][j] * part_q[i][j]);
                 p.ro_near += (part_q[i][j] * part_q[i][j] * part_q[i][j]);
                 if (part_near[i][j].gameObject.layer == 9)
                 {
                     continue;
                 }
                 Fluid_particle q = part_near[i][j].GetComponent <Fluid_particle>();
                 q.ro      += (part_q[i][j] * part_q[i][j]);
                 q.ro_near += (part_q[i][j] * part_q[i][j] * part_q[i][j]);
             }
         }
     }
     for (int i = 0; i < particles_count; i++)
     {
         Fluid_particle p = particles[i].GetComponent <Fluid_particle>();
         p.press      = k * (p.ro - rest_ro);
         p.press_near = k_near * p.ro_near;
     }
     for (int i = 0; i < particles_count; i++)
     {
         Vector2        s = Vector2.zero;
         Fluid_particle p = particles[i].GetComponent <Fluid_particle>();
         for (int j = 0; j < part_near[i].Length; j++)
         {
             Fluid_particle q = part_near[i][j].GetComponent <Fluid_particle>();
             if (part_near[i][j].gameObject.layer == 4)
             {
                 if (part_d[i][j] > 0)
                 {
                     float   q1  = part_q[i][j];
                     float   q2  = q1 * q1;
                     Vector2 tmp = (p.transform.position - q.transform.position) * ((p.press + q.press) * q1 + (p.press_near + q.press_near) * q2) / part_d[i][j];
                     q.a += tmp;
                     s   += tmp;
                 }
             }
             else if (part_near[i][j].gameObject.layer == 9)
             {
                 float   q1  = part_q[i][j];
                 float   q2  = q1 * q1;
                 Vector2 tmp = (part_near[i][j].transform.position - p.transform.position) * ((p.press + 500) * q1 + (p.press_near + 500) * q2) / part_d[i][j];
                 s += tmp;
             }
         }
         p.a -= s;
     }
 }
예제 #3
0
파일: SPH.cs 프로젝트: ArhinZi/FizSim
    // Update is called once per frame
    void FixedUpdate()
    {
        part_near = new Collider2D[particles_count][];
        part_d    = new float[particles_count][];
        part_q    = new float[particles_count][];
        for (int i = 0; i < particles_count; i++)
        {
            if (particles[i] == null)
            {
                continue;
            }
            Fluid_particle g = particles[i].GetComponent <Fluid_particle>();

            g.ro         = 0;
            g.ro_near    = 0;
            g.press      = 0;
            g.press_near = 0;
            g.a          = Vector2.zero;
            g.mass       = mass;
            //g.GetComponent<Rigidbody2D>().velocity = Vector2.zero;
            g.a += new Vector2(0, -98f * 2);
        }
        for (int i = 0; i < particles_count; i++)
        {
            if (particles[i] == null)
            {
                continue;
            }
            Fluid_particle p = particles[i].GetComponent <Fluid_particle>();
            part_near[i] = (Physics2D.OverlapCircleAll(particles[i].transform.position, h - (scale / 2) - 0.2f, 1 << 4));
            part_d[i]    = new float[part_near[i].Length];
            part_q[i]    = new float[part_near[i].Length];
            //p.ro_near = 0.05f;
            //p.ro = 0.15f;
            for (int j = 0; j < part_near[i].Length; j++)
            {
                if (part_near[i][j] == null)
                {
                    continue;
                }
                part_d[i][j] = Vector2.Distance(particles[i].transform.position, part_near[i][j].transform.position);
                part_q[i][j] = 1 - (part_d[i][j] / h);

                if (part_d[i][j] > 0)
                {
                    p.ro      += (part_q[i][j] * part_q[i][j]);
                    p.ro_near += (part_q[i][j] * part_q[i][j] * part_q[i][j]);


                    if (part_near[i][j].gameObject.layer == 9)
                    {
                        continue;
                    }
                    Fluid_particle q = part_near[i][j].GetComponent <Fluid_particle>();

                    q.ro      += (part_q[i][j] * part_q[i][j]);
                    q.ro_near += (part_q[i][j] * part_q[i][j] * part_q[i][j]);
                }
            }
        }
        for (int i = 0; i < particles_count; i++)
        {
            if (particles[i] == null)
            {
                continue;
            }
            Fluid_particle p = particles[i].GetComponent <Fluid_particle>();
            p.press      = k * (p.ro - rest_ro);
            p.press_near = k_near * p.ro_near;
        }
        for (int i = 0; i < particles_count; i++)
        {
            Vector2 s = Vector2.zero;
            if (particles[i] == null)
            {
                continue;
            }
            Fluid_particle p = particles[i].GetComponent <Fluid_particle>();
            for (int j = 0; j < part_near[i].Length; j++)
            {
                if (part_near[i][j] == null)
                {
                    continue;
                }
                Fluid_particle q = part_near[i][j].GetComponent <Fluid_particle>();
                if (part_near[i][j].gameObject.layer == 4)
                {
                    if (part_d[i][j] > 0)
                    {
                        float   q1  = part_q[i][j];
                        float   q2  = q1 * q1;
                        Vector2 tmp = (p.transform.position - q.transform.position) * ((p.press + q.press) * q1 + (p.press_near + q.press_near) * q2) / part_d[i][j];
                        q.a += tmp;
                        s   += tmp;
                    }
                }
                else if (part_near[i][j].gameObject.layer == 9)
                {
                    float   q1  = part_q[i][j];
                    float   q2  = q1 * q1;
                    Vector2 tmp = (part_near[i][j].transform.position - p.transform.position) * ((p.press) * q1 + (1000 * p.press_near) * q2) / part_d[i][j];
                    s += tmp;
                    //Debug.Log("drgd");
                }
            }
            p.a -= s;
        }

        for (int i = 0; i < particles_count; i++)
        {
            if (particles[i] == null)
            {
                continue;
            }
            Fluid_particle p = particles[i].GetComponent <Fluid_particle>();
            Vector2        f = p.a;
            //p.a.x = Mathf.Clamp(f.x, -200, 200);
            p.a.y = Mathf.Clamp(f.y, -300, 800);
        }
    }