입자로 압력을 시뮬레이션하는 방법?


11

내가 빌드하고있는 Unity 게임에서 구형 입자 컬렉션으로 압력을 시뮬레이션하려고합니다. 문제에 대한 몇 가지 참고 사항 :

  • 작고 마찰이없는 구로 끊임없이 변화하는 2D 공간 / 공극을 채우는 것이 목표입니다. 이 게임은 점점 더 많은 물체가이 공간으로 밀려 오는 압력을 시뮬레이션하려고합니다.
  • 레벨 자체는 지속적으로 왼쪽에서 오른쪽으로 스크롤됩니다. 즉, 사용자가 공간의 크기를 변경하지 않으면 공간이 자동으로 작아집니다 (공간의 가장 왼쪽 부분이 화면에서 계속 스크롤 됨).

이러한 문제를 해결하기 위해 취할 수있는 접근법이 무엇인지 궁금합니다 ...

  1. 공간을 채울 공간을 감지 한 다음 공간에 구를 추가 할시기를 알 수 있습니다.
  2. 공간이 줄어들 때 구를 공간에서 제거합니다.
  3. 더 많은 공간이 만들어 질 때 구체가 바깥쪽으로 폭발하도록 압력을 시뮬레이션하는 전략.

내가 생각하고있는 현재 접근법은 끊임없이 움직이는 벽을 사용하는 것입니다.

압력!.

이 움직이는 벽은 구를 우주로 밀고 덫을 놓을 것입니다. 새로운 구체를 추가하는 것에 관해서는, 나는 (1) 자유 공간을 탐지 할 때 구체를 복제하거나, (2) 공간의 왼쪽 (벽이있는 곳)에 그것들을 스폰하도록하겠습니다-나머지 구체를 공간을 채우십시오. 아이디어 # 1에 문제가있을 것으로 예상되는데, 이것이 실제로 압력을 생성 / 시뮬레이트하지는 않을 것이기 때문입니다. 아이디어 # 2가 더 유망 해 보이지만이 새로운 구형 입자가 스폰 될 위치를 제공하는 방법에 대한 문제를 제기합니다 (그리고 공간이 없을 때 스폰되는 결과).

당신의 지혜에 미리 감사드립니다!

답변:


6

공간이 화면에서 게임 기계공으로 굴러 가면서 입자가 벽을 밀고 있는가?

세 가지 점에 관해서는, 입자를 그렇게 취급하면 이러한 행동이 모두 나타날 것이라고 생각합니다. 각 입자가 거리에 반비례하여 다른 입자를 격퇴시키고, 벽과 충돌하여 정지시킵니다.

서로 가까이있는 입자는 서로를 격퇴하여 장애물에 의해 멈출 때까지 빈 공간을 채우기 위해 퍼집니다. 벽이 공간을 더 작게 만들고 입자를 밀면 벽이 다른 입자에 더 밀착되어 더 강하게 리펄스하여 다른 입자를 밀고 전체 압력을 증가시킵니다.

이것은 음의 인력을 가진 n-body 시뮬레이션과 매우 유사하므로 입자 수에 따라 다른 모든 입자와 함께 모든 입자에 대한 반발력을 계산하는 것이 상당히 비쌀 수 있습니다. 입자 질량의 평균 무게 중심에 의해서만 각 입자가 리펄스되도록하여이를 단순화하려고 할 수 있습니다. 예를 들어 무게 중심).

입자를 생성하고 삭제하는 경우 (내가 추정하는 공간을 시각적으로 채울 수있는 적절한 양이 있는지 확인하려면) 밀도가 부족할 때 단순히 입자를 추가하거나 제거하지 않아야합니다. 더 많은 입자가 다른 입자를 반발하므로 압력을 높이거나 낮 춥니 다.

따라서 1.0부터 시작하여 반발 계산에 요소를 도입하고 x 입자를 추가 할 때 새로운 요소 n / (n + x)를 만드십시오. 여기서 n은 새로운 입자를 추가하기 전에 총 입자 수입니다.


2

압력은 가스와 같이 입자 사이와 입자와 벽 사이의 탄성 충돌의 결과 일뿐입니다. 압력 값을 얻기 위해 벽과의 시간당 충돌의 양을 측정하기 만하면됩니다.

당신이 제공하는 두 가지 아이디어는 압력이 닫힌 볼 루미나에서 일정한 양의 입자와 주어진 온도로 주어지기 때문에 압력과 직접 관련이 없습니다.

이 닫힌 시스템에 입자를 추가하면 전체 시스템에 더 많은 에너지가 있기 때문에 압력이 상승해야합니다 (주어진 온도-속도로 새 입자를 추가했습니다).


벽의 질량이 + 무한대 근처에 있다고 가정하기 때문에 입자는 탄성 충돌에 대한 질량을 가져야합니다.
Aron_dc

나는 "압력은 벽과의 시간당 충돌의 양"이라고 말하면서 100 % 정밀하다고 말했다. 탄성 충돌에서는 해당 입자의 충격을 받아 벽에 얼마의 충격이 가해 지는지 측정합니다. 따라서 한 입자가 벽에 수직 방향으로 충돌하면 벽에 2mv의 임펄스 (m = 입자 질량; v = 입자 속도)가 발생합니다. 따라서 실제로 벽에 들어오는 임 펄소를 측정합니다. 파티클은 방금 반사됩니다 (충돌 전 v = 충돌 후 -v). 이것은 다른 가스 혼합물의 압력을 측정하는 데 도움이됩니다 (입자마다 다른 m).
Aron_dc

0

각 루프마다 모든 입자를 반복 한 다음 해당 입자에 대한 최종 힘을 계산해야합니다. 기본적으로 벽은 x 축에 충돌하는 경우 항상 양의 힘 벡터를 제공합니다 (particle.x-particle.r <= 0).

그런 다음 충돌하는 각 입자는 각도 사이에 따라 힘 벡터를 제공합니다. 모든 입자에 대해이 각도를 수집하고 평균을 계산하면됩니다.

여기서 사용할 수있는 많은 최적화 기법이 있습니다. 공 물리학 튜토리얼을 찾아보십시오. 기본적으로 각 입자 한 번만 반복 하고 둘 다에 대한 힘 벡터를 계산하여 저장하려고합니다.

이것은 기본적으로 가스를 시뮬레이트하며, 일정한 힘과 액체를 주면 액체도 가정합니다.

파티클 생성 및 삭제와 관련하여 ParticleEmitter 클래스를 구현합니다.이 클래스에는 위치, 방향 및 기타 유용한 항목이 있습니다. 특정 범위 또는 더 나은 사각형의 파티클을 생성 할 수있는 이미 터를 사용하면 예가 더 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.