2D 물 시뮬레이션을위한 아이디어


18

2D에서 물을 시뮬레이션하는 것에 대한 입력을 찾고 있습니다. 나는 다음과 같은 아이디어를 생각해 냈습니다.

세포 오토마타

cell automata를 사용하여 CPU에서 대규모 병렬 시뮬레이션을 수행하십시오 . 다음과 같은 간단한 규칙으로 :

  • 맨 아래에 열려있는 셀이 있으면 해당 셀로 이동하십시오.
  • 왼쪽 및 오른쪽 셀을 확인하고 둘 중 임의의 것을 선택하고 이동하십시오.

찬성

  • 구현이 간단합니다.
  • 멀티 플레이어 시스템에서 의미 있고 결정적입니다.

단점

  • 아마 정말 느려.
  • 설득력이 없습니다.

GPU의 유체 역학

GPU에서 다음과 같은 질감에 대해 대략적인 유체 역학을 수행합니다.

+------+-----+-----+-------+
|R     |G    |B    |A      |
+------+-----+-----+-------+
|vX    |vY   |NULL |Density|
+------+-----+-----+-------+

찬성

  • 아마 정말 빠릅니다.
  • 상당히 설득력이 있습니다.
  • 추가 픽셀 쉐이더는 직접 렌더링 할 수 있습니다.

단점

  • 구현하기 어려움.
  • 조정하기 어려움.
  • 레벨의 크기로 단일 텍스처를 할당 할 수 없습니다.
    • 그리드 영역을 겹칠 수 있지만 더 복잡해집니다.

입자

입자를 사용하여 물을 시뮬레이션하십시오. 추가 블렌딩을 사용하여 렌더링하는 동안 알파 채널에 곱셈 함수를 적용하여 물 가장자리를 선명하게합니다.

찬성

  • 아마 좋아 보일 것입니다.
  • 구현하기 쉽습니다.
  • 렌더링하기 쉽습니다.
  • 멀티 플레이어 시스템에서는 의미가 있지만 전송에는 상당한 대역폭이 필요합니다.

단점

  • 입자 간 효과가 느릴 수 있습니다 (이웃 조회).
  • 단색 공간을 통해 물이 '누설'될 수 있습니다 (고형 공간이 작기 때문에 (예 : 1px)).
  • 입자 크기에 따라 물에 이상한 구멍이 생길 수 있습니다.
  • 입자가 실제 크기보다 더 가깝게 표류하도록함으로써 상기 둘 모두를 완화시킬 수 있지만, 입자 간 및 입자 / 풍경 성능에 문제가 발생할 수있다.

더 이상의 아이디어가 있습니까?

참고 : 이것은 근사치입니다. 물리적으로 올바른 물을 찾지 않고 있습니다. 이 게임은 멀티 플레이어이므로 불행히도 전체 레벨을 지속적으로 시뮬레이션해야합니다.

답변:


12

물을 시뮬레이션 할 때마다 수위를 나타내는 텍스처에 저역 통과 필터 를 적용했습니다 . 구현이 매우 간단하지만 수위가 크게 변하여 큰 파도를 생성 할 때마다 실패합니다. 이 방법에는 강 끝과 같이 물이 항상 일정한 수준을 유지하는 곳이 있습니다. 이 경우 특정 픽셀에 딱 맞는 색상입니다.

장점 :

  • 구현하기 쉬운
  • 잔잔한 물의 경우 현실적인 결과
  • GPU를 사용한 빠른 계산
  • 정적 수위 또는 수원을 쉽게 정의

단점 :

  • 파도를 시뮬레이션 할 수 없습니다

물결 모양의 물의 경우 Cell Automata 알고리즘과 비슷한 방식을 사용하지만 현재 상황에서 다음 단계를 계산하기 위해 셰이더를 사용할 수있는 약간의 변경 사항이 있습니다. 여기에는 sudo 코드가 있습니다. 각각의 수위를 나타내는 텍스처가 있습니다. 픽셀 색상 :

foreach (pixel p) in oldTexture
{
    newtexture.pixels[p.x,p.y]    += p.color / 5;
    newtexture.pixels[p.x+1,p.y]  += p.color / 5;
    newtexture.pixels[p.x-1,p.y]  += p.color / 5;
    newtexture.pixels[p.x,p.y+1]  += p.color / 5;
    newtexture.pixels[p.x,p.y-1]  += p.color / 5;
}

이 알고리즘은 이전 알고리즘과 유사한 기능을 가지고 있지만 침착 한 물 대신 물결 모양의 물에서 더 잘 작동합니다. 당신이 그들 중 하나를 사용하기 위해 시뮬레이션하는 바다를 기반으로 당신의 선택.

결국 각 위치에 대한 수위를 알려주는 텍스처가 있습니다. 다음 단계에서 어떻게 든 결과를 그릴 수 있습니다. 가장 쉬운 방법은 수위 데이터를 기반으로 메쉬를 생성하는 것입니다.


고마워, 그것은 훌륭한 답변입니다. 질문을 조금 더 열어 두겠습니다. 그러나 여기에 하나의 질문에 대한 대답을하는 요령이있는 것 같습니다 :).
Jonathan Dickinson

이 알고리즘을 혼합하여 더 나은 결과를 얻을 수도 있습니다.
Ali1S232

스크린 샷은 어떻습니까?
ashes999

@ ashes999 스크린 샷이 없지만 동일한 알고리즘이 구현되었습니다! youtube.com/watch?v=avJPrL9UJ28
Ali1S232
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.