플레이어와 적에게 반응하는 입자를 만들려면 어떻게해야합니까?


38

저는 현재 C ++로 작성한 자체 게임 엔진으로 게임을 만들고 있으며 최신 Directx SDK를 사용하고 있습니다.

이 게임은 하향식 우주 사수이며 (매우 흥미로운 트위스트) 플레이어가 날아갈 일종의 성운 효과를 찾고 있습니다. 나는 수백 개의 입자가 플레이어 우주선으로 날아 가면서 움직일 수 있다는 멋진 촉각을 느끼고 싶습니다. XBLA의 Geomtry Wars에서 파티클이 플레이어를 벗어나는 방식과 비슷합니다.

C ++에 관해서는 숙련 된 프로그래머입니다. 그러나이 효과를 구현하는 방법을 모르겠습니다. 내가보고 싶은 멋진 아이디어 나 디자인 선택이 있습니까? 당신이 좋아하는 깊이에 자유롭게 대답하십시오.

답변:


65

멋진 생각입니다. 우주선 주위에 일종의 확산 그라디언트가 필요합니다. 내가 생각할 수있는 세 가지 물리적 모델이 있습니다.

  1. 압력 구배가 재조정되는 액체 매체처럼 보이기를 원합니다. 예를 들어 입자를 통과 한 후에는 보트 뒤의 물처럼 깨어납니다. 이 경우 파티클의 위치는 절대적이며 렌더링 위치 를 일시적으로 수정하는 것은 플레이어와의 관계뿐입니다 . 이것은 두꺼운 돋보기를 물건 위에 놓을 때와 비슷하며 회절은 유리를 움직일 때까지만 움직입니다. 이 경우 배는 유리입니다.

  2. 그들이 배에서 멀어 지길 원하고 움직이면 계속 움직입니다. 이것은 압력 구배가없는 (또는 매우 작은) 일반적으로 빈 공간에서 표준 물리학과 같습니다.

  3. (1)과 (2)에서와 같이 접근 할 때 입자를 신속하게 우주선에서 멀어 지려고하지만, 일단 우주선이 사라지면 입자가 천천히 재 균형하여 균형을 맞 춥니 다.

세 가지 솔루션 모두에 공통 : 선박과 함께 움직이는 확산 필드가 필요합니다. 이 예에서는 원형으로 만듭니다. 그런 다음 우주선과 해당 지역 내의 각 입자 사이에서 벡터를 감지하여 v1이라고합니다. 벡터를 따라 파티클을 밀어냅니다. 얼마나 멀리 밀어 넣을지는 우주선과의 거리에 따라 다릅니다 1 - v1.magnitude. 이 공식은 선형 강도를 제공하지만 가장자리를 향한 강도가 감소하는 원형 강도 곡선과 같은 다른 것을 사용하도록 수정할 수 있습니다. 이렇게하면 선박 주위에 원형 압력 구배가 아닌 구면이있는 것처럼 보이게됩니다.

해결책 1 : 당신은 지금 모두는 수정이다 렌더링 마다에 그 입자의 위치 (이다, 스프라이트 위치) 렌더링 이 벡터에 의해, 업데이트. 이런 식으로 수행하기 때문에 이것은 순수한 렌더링 효과이며 입자의 실제 월드 위치에는 영향을 미치지 않습니다. 따라서 월드 위치를 렌더 오프셋 (v1)에 추가하면 파티클을 지나서 또는 옆으로 이동할 때 파티클이 멋지게 옮겨졌으며 패스 할 때 파티클을 부드럽게 되돌릴 수 있습니다 (뒤).

해결 방법 2 : v1을 뷰 위치에 적용하는 대신 각 논리 업데이트 에 적용 하여 입자의 위치에 적용하십시오. 그래서 p1.position += v1. 따라서 입자에 가속력을 가하면 속도로 변환됩니다. 아마도, 각 입자의 속도를 늦추어 입자가 서서히 느려지고 일단지나 가면 멈추기를 원할 것입니다. 이 솔루션이 어떻게 성운에 쌓여있는 입자를 만드는지 알 수 있습니다. 성운은 현실이 아무리 약하더라도 그 안에 압력 구배가 있기 때문에 매우 현실적이지는 않습니다.

솔루션 3: (2)와 동일하지만이 경우 파티클을 다시 확산시켜야합니다. 이 작업을 쉽게 수행하는 것은 약간의 무차별 대입 방식이지만 입자와 눈에 띄는 사탕이므로 눈에 띄는 큰 영역을 다루지 않아도됩니다. 직사각 영역은 논리적 인 목적을 위해 그것을 둘러싼 다. 각각의 입자는 관심 영역 내에서 서로 다른 입자에 힘을 가할 것이다. 그들은 다시 서로의 거리에 따라 힘을 가할 것입니다. 관심 영역에서 단일 스윕으로 모든 입자 간 힘을 계산 한 다음 단일 스윕으로 모든 힘을 적용하십시오. 마지막으로 속도가 0 인 입자에 대해서만 입자 간 힘 처리를 수행하십시오. 주어진 입자가 최소 속도에 도달하면

모든 종류의 확산 공식 등이 있지만이 경우 간단한 해결책이 가장 효과적이라고 생각합니다.


친구, 불행히도 나는 현재 귀하의 답변을 찬성하는 것으로 명성이 없습니다 (그리고 나는 한 번만 할 수있을 것입니다. 첫 번째 솔루션에서 내가 찾고있는 것을 절대적으로 못 박았습니다. 환상적인 답변. 솔직히 감사!
매트 맥도날드

완전 즐거움 매트, 그것은 좋은 질문이며 두뇌를 구부릴 가치가 있습니다!
엔지니어

또한 코드를 거의 변경하지 않고 벨트 내의 작은 소행성에 적용 할 수 있다고 결정했습니다. 다시 감사합니다.
매트 맥도날드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.