3

更新; - j=0 から j=i に変更すると、滑らかなフレーム レートで最大 700 個のパーティクルが許可されます

Vector2 で位置を宣言し、Vector2 で速度を宣言する数百の粒子で 2D 水をシミュレートしようとしています。

衝突検出に関しては、ピタゴラスの定理のみを使用しているにもかかわらず、私のプログラムは 450 を超える粒子を持つことを嫌います。

メインクラスでの衝突検出は次のとおりです。

        for (int i = 0; i < particleList.Count; i++)
            {
                for (int j = 0; j < particleList.Count; j++)
                {
                    if (distanceBetween(particleList[i].position, particleList[j].position) < reactDistance)
                    {
                        if (particleList[i].position.X > particleList[j].position.X) //x axis
                        {
                            particleList[i].velocity.X += repelSpeed;
                            particleList[j].velocity.X -= repelSpeed;

                            particleList[i].position.X -= attractSpeed;
                            particleList[j].position.X += attractSpeed;
                        }
                        else
                        {
                            particleList[i].velocity.X -= repelSpeed;
                            particleList[j].velocity.X += repelSpeed;

                            particleList[i].position.X += attractSpeed;
                            particleList[j].position.X -= attractSpeed;
                        }

                        if (particleList[i].position.Y > particleList[j].position.Y) //y axis
                        {
                            particleList[i].velocity.Y += repelSpeed;
                            particleList[j].velocity.Y -= repelSpeed;

                            particleList[i].position.Y -= attractSpeed;
                            particleList[j].position.Y += attractSpeed;
                        }
                        else
                        {
                            particleList[i].velocity.Y -= repelSpeed;
                            particleList[j].velocity.Y += repelSpeed;

                            particleList[i].position.Y += attractSpeed;
                            particleList[j].position.Y -= attractSpeed;
                        }
                    }
                }
            }

distanceBetween(v1, v2) メソッドは次のとおりです。

        public float distanceBetween(Vector2 a, Vector2 b)
    {
        float xDist, yDist, distTo;
        if (a.X > b.X) //x axis
        {
            xDist = a.X - b.X;
        }
        else
        {
            xDist = b.X - a.X;
        }

        if (a.Y > b.Y) //y axis
        {
            yDist = a.Y - b.Y;
        }
        else
        {
            yDist = b.Y - a.Y;
        }
        distTo = (float)(Math.Sqrt((xDist * xDist) + (yDist * yDist)));
        return distTo;
    }

Vector2.Distance(v1, v2) は目に見えるパフォーマンスの変化をもたらしません。

AttractSpeed が一体何をするのか疑問に思っているなら; 水の集まりを形成しようとするのは私の貧弱な試みです. どうすればいいのかわからない。

最終的には、次のようなものが必要です: http://grantkot.com/MPM/Liquid.html

4

1 に答える 1