비디오 게임에서 글 머리 기호는 어떻게 시뮬레이션됩니까?


86

나는 최근에 MW2와 같은 게임을 해왔으며, 프로그래머로서 게임을 어떻게 몰입시키는 지 스스로에게 묻는 경향이 있습니다. 예를 들어 총알 속도를 시뮬레이션하는 방법.

  1. NPC가 총에서 총알을 발사 할 때 총알이 실제로 총에서 지정된 대상으로 이동합니까? 아니면이 부분을 완전히 무시하고 대상에 총알 구멍을 줍니까?

  2. 총알이 실제로 총에서 대상으로 이동하는 경우 실제로 어떤 속도로 이동합니까?


25
블러디 스크린, 진짜!
AttackingHobo

6
촬영 : BOOOOORRRIIIING
mahen23

1
Megaman Legend의 총알을 총알이라고 부를 수 있는지 확실하지 않지만 Megaman에서는 느린 발사체를 총알로 사용합니다. 이 경우 촬영 중 원을 그리면 샷이 휘는 모습을 명확하게 볼 수 있습니다 (코리올리 효과).
Lie Ryan

답변:


84

대부분의 FPS 게임은 실제 게임 플레이에 레이 캐스팅을 사용합니다. 총알은 즉시 발사되어 발사 될 때 목표물을 때립니다.

그러나 대부분의 게임은 또한 "가짜"추적 프로그램을 사용합니다. 3 발 또는 다른 간격마다 추적자가 총알과 함께 발사되며 추적기는 실제로 빠르지 만 순간적이지는 않습니다. 이것은 시각적 효과로만 이루어지며 게임 플레이에는 직접 영향을 미치지 않지만 사수, 사수에게 신호를주고 방관자에게 총성에 대한 방향 참조를 제공합니다.

이러한 종류의 총알 물리를 사용하는 대부분의 게임은 리코 치가없고 총알 조각이 없으며 일반적으로 선형이기 때문에 비현실적입니다.

ARMA II, STALKER (전체 시리즈)와 같은 일부 게임은 이동 시간, 리 코팅 및 처짐 각도 침투와 함께보다 현실적인 탄환 물리학을 사용합니다. 이 시스템은 레이 캐스팅을 사용하고 있지만 총알 속도에 따라 제한되는 것으로 생각합니다. 이 게임을 통해 총구 속도는 ARMA II에서와 같이 사실적이거나 STALKER 에서처럼 보입니다.

총은 레이저가 아닌 발사체를 발사하기 때문에 현실적인 총알 물리학을 선호합니다.


1
언급 된 게임을하지 않았는데 이것이 게임 플레이에 어떤 영향을 미칩니 까? 콜 오브 듀티와 같은 게임에 총알 물리학을 사용하면 눈에 띄는 차이가 있습니까? 침투 각도가 게임을 바꾸는가? 플레이어는 자신의 캐릭터가 슈터와 관련하여 총알 구멍과 일치하지 않는다는 것을 알고 있습니까? 오버 헤드를 정당화하는 데 어떤 이점이 있는지 궁금합니다. 미리 감사드립니다.
Dutchie432

그것은 내가 좋아하는 슈팅 메카닉에 예측 불가능 성과 깊이의 층을 추가합니다. 총알은 즉각적이지 않습니다 !!! chuckhawks.com/rifle_ballistics_table.htm 600 피트에 대해 초당 2644 피트의 슬러그는 .2 초 이상 걸리며 추가 속도 저하를 고려하지 않고 목표물에 부딪 칩니다 . 직접 겨냥하면 달리는 목표를 놓치게됩니다. 거리가 멀어지면 슬러그가 사운드 속도보다 느리게 이동하여 사람들이 샷을 들으면지면이나 다른 곳으로 점프 할 수 있습니다.
AttackingHobo

이 답변에 부정확 한 진술이 여러 개 있으므로 삭제해야합니다. 아래에서 내 대답을 확인하십시오.
EddieV223

1
ArmA 2의 총알은 시뮬레이션 된 발사체입니다. 비행 중에 수정 (속도 변경, 방향 변경) 할 수 있으며 물체가 이동할 때 충돌 할 수 있습니다. 이것이 레이 캐스팅에 의해 수행되는지의 여부는 관계가 없으며 실제 물리 객체의 역할을합니다.
감속 캐비어

그래서 mw2? 레이 캐스팅? 그들은 총알 구멍과
그에

51

총알의 경우 일반적으로 실제로 공기를 통과하는 총알을 시뮬레이트하지 않고 발사되는 순간 총알을 대상에 꽂습니다. 로켓과 같은 다른 것들이 더 느리게 * 그리고 게임은 실제로 그들이 공중을 여행하는 것을 보여줍니다.

짧은 거리에서 총알이 프레임 사이의 시간 경과와 함께 이동하면서 슈터에서 어쨌든 1 프레임 사이 또는 1 프레임 내에 도달합니다.

* 실제로 로켓보다 느리므로 플레이어가 공중에서 날아 다니는 것을 볼 수 있습니다.


44

PlanetSide의 글 머리 기호 코드를 작성했습니다. 우리는 'hitscan'발사체를 몇 개 가지고 있었지만, CPU 제약 조건과 언제든지 사용할 수있는 총알 수를 감안할 때 최대한 발사체를 시뮬레이션했습니다.

히트 스캔의 경우, 종종 단일 레이 캐스트를 사용하여 입력을받는 것과 동일한 프레임에서 영향이 결정됩니다. 레이저 나 다른 초고속 발사체와 같은 무기에 적합합니다. 우리는 발사체의 초기 속도를 너무 높이 올려서 한 번의 틱으로 게임 보드를 가로 지르는 것으로 히트 스캔을했습니다.

히트 스캔이 아닌 총알은 그래픽 프레임 시간 또는 고정 된 타임 스텝에 따라 가속 (로켓 생각), 중력, 공기 마찰, 안내 (열 검색 발사체 생각) 등의 계산으로 적용됩니다. 목표는 타임 스텝에 대한 발사체의 최종 위치를 생성하는 것입니다. 시작점과 끝 점이 설정되면 비행 경로에 근접하고 비행 중에 발생한 충돌을 감지하기 위해 하나 이상의 광선을 캐스트 할 수 있습니다.

히트 스캔 및 히트 스캔이 아닌 발사체에서 충돌시 발생하는 일은 발사체 특성과 충돌하는 표면에 따라 다릅니다. 예를 들어 딱딱한 표면에 부딪 힐 수 있습니다.이 경우 바운스 수를 확인하고 반사 당 위치와 속도를 조정하거나 최대 바운스 수에 도달하면 발사체를 폭발시킬 수 있습니다. 이 시스템에서 로켓의 최대 바운스 카운트는 0입니다. 부드러운 표면에 부딪친 다음 관통력을 확인하여 발사체가 재료 등을 계속 통과해야하는지 여부를 확인하십시오.

작성하는 것은 재미있는 코드였습니다. 또한 비행 경로, 이벤트 등을 시각적으로 검사 할 수 있도록 진행중인 상황에 대한 우수한 디버그 시각화를 작성하는 것이 매우 유용합니다.


2
멋진 게임을 프로그래밍하기 전에 Planetside를 플레이했는데 코드가 재미있을 것 같습니다.
Anthony

18

게임과 정확성 / 현실성 수준에 따라 다릅니다.

멀티 플레이어 설정에서 촬영 및 손상 모델을 동기화하는 것은 총알이 언제 어디서 언제 발사되었는지, 대상에 부딪 쳤는지 여부 및 경로를 통과 한 다른 물체가 있는지 여부를 정확하게 결정해야하기 때문에 매우 어렵습니다.

따라서 가능한 한 게임 디자이너가 일부 샷을 순간적으로 처리하거나 (한 순간에 모든 사람의 위치 만 고려하면 됨) 총알의 범위를 제한하여 상황을 단순화 할 수 있다고 생각합니다. 운 좋게도 이것은 종종 실제 물리에 해당합니다. 예를 들어, 저격 소총은 고속 라운드를 발사합니다.

많은 게임에서 천천히 움직이는 물체 (예 : 포병, 폭탄, 마커 라운드 등)의 다단계 멀티 스냅 샷 경로를 시뮬레이션 할 수 있지만 비용이 많이 들고 동기화 문제가 더 자주 발생하여 재미있는 유튜브 비디오가 만들어집니다.

또 다른 관심사는 더 큰 공간의 환상을 만들기 위해 별도의 작은 "환경"(예 : 각 방은 개별적으로 시뮬레이션 됨)을 유지하는 게임에 관한 것입니다. 이 경우, "방"의 경계 안에있는 것들이 올바르게 시뮬레이션되어 방의 모든 사람들이 총알이 만드는 공간의 일련의 전환에 대해 업데이트되지만 해당 환경 외부의 사람들은 그렇지 않습니다.


14

눈이 볼 수있는 것보다 빠르게 이동하는 발사체의 경우 레이 캐스팅이 종종 사용됩니다. 총구에서 나오는 광선은 적절한 방향으로 계산되고 잠재적 대상 물체에 대해 테스트하여 맞은 대상을 결정합니다. 불릿 드롭과 같은 것을 시뮬레이션하려는 경우 다중 광선과 추가 계산으로 복잡 할 수 있습니다. 또한 프로젝트에 속도를 제공하고이를 사용하여 계산에 현실감을 더할 수 있습니다 (총알이 순간적이지 않음).


11

구현에 따라 다르지만 소스 엔진은 실제 총알 (발사체)을 전혀 사용하지 않았다는 것을 알았습니다. 플레이어에서 임의의 "적중 영역"원 (더 큰 반경 또는 더 작은 반경에 의존하는 광선)을 대상으로 광선을 던졌습니다. 그 중심이 플레이어가 목표로하는 지점 인 무기 발사 속도 및 플레이어가 발사 버튼을 누른 경우), 플레이어에서 무작위로 결정된 포인트까지 실제 광선을 결정하고 다른 요인에 따라 (예 : 총알 "무게"및 총구 속도 (모든 내부 번호), 물체 명중 등) 광선 캐스트가 여러 물체를 통과하거나 지형에 닿을 때까지 캐스트되었습니다.

반대로 Torque 3D Engine DID는 실제 발사체를 사용하며 설계자는 개별 속도, 질량 및 중력 수정 자에 영향을 줄 수 있습니다. 모든 엔진은 32 밀리 초마다 값을 업데이트했습니다.

편집하다

Torque 3D 엔진은 발사체를 사용하는 것 외에도 대안으로 레이 캐스트를 사용할 수있었습니다. (저는 "발사체"가 실제로 발사체가 광선 캐스트를 요구하는 것을 지원하지 않는 입자 효과 인 여러 게임을 만들었습니다.)


멋진 이야기 형제. 그러나 Torque 3D 엔진은 이러한 모든 물리학을 계산하기 위해 더 많은 처리 능력이 필요하다고 확신합니다.
mahen23

@ mahen23 당신은 놀랄 것입니다. Softbody 충돌을 전혀 처리하지 않고 단순한 경계 및 충돌 상자 만 처리했기 때문에 소스 엔진보다 물리 계산이 적었습니다.
Casey

10

Team Fortress 2 위키에는 발사체와 히트 스캔 무기의 동작에 대한 멋진 글이 있습니다.

http://wiki.teamfortress.com/wiki/Mechanics#Hit_detection


2
그 위키는 잘 읽었습니다.
mgiuca

이 섹션은 짧지 만 hitscan과 non-hitscan을 설명하고 hitbox가 무엇이며 어떻게 사용되는지 설명합니다.
jhocking 2016 년

해당 섹션 제목 바로 아래 "Projection"및 "Hitscan"하위 기사를 읽으십시오.
lunixbochs

5

실제로 많은 게임에서 GPU 렌더링 적중 테스트 알고리즘을 사용합니다. 기본 작동 방식은 다음과 같습니다.

1) 오프 스크린은 모든 지형이 검은 색이고 모든 문자가 검은 색이 아닌 현재 뷰의 렌더링을 생성합니다. 2) 십자선 아래에서 픽셀의 색을 얻습니다. 3) 검은 색이 아닌 경우 > 플레이어 매핑을하고 해당 대상에 적중을 적용하십시오.

이 방법은 픽셀 완벽하기 때문에 게임에서 수년 동안 사용되어 왔습니다. 플레이어 모자의 단일 픽셀이 벽 뒤에서 튀어 나와 있으면 그를 칠 수 있습니다. 만약 당신이 그것을 볼 수 있다면, 당신은 그것을 칠 수 있습니다. 이 유형의 정밀도는 간단한 레이 캐스팅 기술로는 불가능합니다. 둘째, 이러한 종류의 테스트는 매우 빠르며 GPU에서 수행 할 수 있습니다.


컬러-> 플레이어 조회가 고통 스럽습니까? 당신이 그것을 던져 캐스팅하면, 그것은 같은 효율이 아닐까요?
감속

실제로, 그것은 매우 빠릅니다. 렌더링에 소요되는 대부분의 시간은 실제 다각형의 음영 처리에 소요됩니다. 적중 테스트를 렌더링하는 경우 단색 다각형 만 사용됩니다. 또한이 적중 테스트는 GPU에서 완벽하게 수행 할 수 있으며 픽셀 완벽합니다. 대상에게 완벽한 타격을 가하는 것 이상으로 플레이어를 자극하는 것은 없습니다.
Timothy Baldridge

그러나 픽셀 공간을 월드 공간으로 변환 한 해당 객체로 어떻게 변환합니까?
감속

@Daniel : 답변에서 알 수 있듯이 적중 한 대상은 색상으로 식별됩니다. 각 문자는 다른 (단색) 색상으로 렌더링되므로 색상과 검정 = 미스 등을 확인하면 해당 색상으로 렌더링 된 사람을 조회 할 수 있습니다.
Dave Sherohman

@ 데이브 Sherohman, 내가 잘못 원래, 당신의 설명을 읽은 후 그가 ... 환호 무엇을 의미하는지 분명 듯 읽을해야했습니다
deceleratedcaviar

4

일부 게임은 의심 할 여지없이 총알 이동 시간과 드롭을 고려하여 현실적인 총알 물리학을 사용하지만 적어도 NPC에서는 대부분의 게임이 그렇지 않다고 생각합니다.

즉각적인 총알 이동 (드롭 없음)을하는 게임의 경우, 게임은 배럴 지점에서 가상 선 (벡터)을 추적합니다. 그런 다음 해당 줄이 교차하는 것을 계산하고 해당 지점에서 글 머리 기호 "적중"을 등록합니다. 벽과 같이 딱딱한 물체 일 수 있습니다.이 경우 충격이 총알 타격 데칼 및 연기 / 파편의 "퍼프"와 같은 효과를 유발합니다. 깨질 수있는 물체에 영향을 미치거나 깨지거나 물리적 물체에 영향을 미쳐 "킥"을 줄 수 있습니다. 또는 플레이어 나 다른 NPC에 타격을 입히고 체력에 타격을 줄 수도 있습니다. 하드 코어 시뮬레이션은 벽을 관통하는 총알을 모델링하고 출구쪽에 타격 효과를 유발하여 출구에서 총알의 피해를 줄입니다.

NPC는 완벽한 목표를 갖지 않기 때문에 많은 게임에서 벡터에 일종의 무작위 화를 추가하여 총알 확산을 모델링합니다. 이것은 실제 상황에서 볼 수있는 것입니다. 총알이 목표 위치를 중심으로하는 것이 아니라 목표 지점을 중심으로 한 패턴으로 맞습니다.

총알 확산을 시각화하려면 직선 (벡터) 대신 총에서 원뿔이 나오는 것을 상상해보십시오. 실제 총알 방향은이 원뿔 안쪽에 무작위로 있습니다. 사수가 실제로 목표에 가까워지면 퍼짐이 작고 정확도가 높습니다. 대상이 멀리 떨어져 있으면 원뿔이 더 넓어 지므로 사수가 대상을 칠 가능성이 줄어 듭니다.

이 샷콘 아이디어는 사수 정확도 (스킬), 무기 정확도 및 기타 조건을 모델링하는 데 사용할 수 있습니다. 예를 들어, 낮은 수준의 NPC에는 낮은 정확도의 샷 콘이 제공 될 수있는 반면, 숙련 된 NPC는 높은 수준의 정확도를 가질 수있다. 엉덩이에서 기관단총으로 사격하는 선수는 넓은 원뿔을 가지게되는데, 이는 달리기를 멈추거나 조준하면 줄어 듭니다. 저격 소총은 권총보다 탄 콘이 더 타이트합니다.


좋은 정보 +1. 그러나 AI가 실제로 더 큰 원뿔이 아닌 플레이어를 겨냥하는 데 나쁜 경우 시각적으로 더 좋을 것이라고 생각합니다. 또는 원뿔을 더 크게 만들고 싶다면 반동을 기준으로 가변 크기로 만들고 더 낮은 레벨의 적에게 더 빠른 크기 증가 속도를 제공하여 경험이없는 것처럼 보입니다.
AttackingHobo

1

Nexuiz 소스 코드에 대해 살펴 보았을 때, 실제로 A 지점에서 B 지점으로 '글 머리 기호'객체를 보내지 않았습니다. 발사 될 때 즉시 타격을 가하지 않으면 코드는 총이 가리키는 위치를 확인합니다. '화재'를 클릭했을 때 사람을 겨냥하고 (즉시 적중 무기 인 경우) 타격을가했습니다.

또한 Nexuiz가 서버 측에서 클라이언트 또는 서버에서 적중을 계산하는 옵션을 갖는 방법도 주목할 만합니다. 클라이언트가 부정 행위를하는 것으로 의심되는 경우이를 완화하기 위해 서버 측 적중 계산으로 전환 할 수 있습니다.


1

또 다른 전략은 모든 것을 렌더링하고 모든 것을 추적하는 하이브리드입니다. 모든 글 머리 기호를 렌더링 할 필요는 없습니다. 예를 들어, 총이 초당 30 발 발사되면 스트 래프는 수백 개의 입자를 생성 할 수 있습니다. "추적자 효과"를 사용하여 렌더링을 줄이고 매 3 번째 샷을 렌더링하고 다른 두 개를 광선 추적 할 수 있습니다. 플레이어는 여전히 적에게 초당 10 라운드를 발사합니다.

특정 상황에 맞게 조정하면 발사 속도가 낮을수록 더 많이 렌더링 할 수 있습니다.


세 번째 샷마다 추적 프로그램이있는 이유에 대한 정보를 포함해야합니다. 게임 개발자 개발이 아닙니다. 군대였습니다. 슬러그의 뒷면에 인이 박힌 트레이서 총알. 탄환이 발사되면 화약은 인을 점화시켜 총알 뒤에 밝은 흔적을 만듭니다. 트레이서 총알은 일반 총알보다 비싸므로 X 샷이나 돈을 절약하기 위해 사용되는 동안에도 쉽게 목표를 달성 할 수있는 의도 된 효과가 있습니다.
AttackingHobo

또한 렌더링과 업데이트에서 분할하는 것을 원하지 않습니다. 총알 물리학이 완전히 update 메소드로 완료되기를 원합니다. 모든 X 샷 등이 움직임과 방향을 표시하기 위해 총알보다 훨씬 느린 추적기 효과를 생성하기를 원합니다.
AttackingHobo

@AttackingHobo 나는 인 라운드를 특별히 생각하지 않고 총알이 날고있는 시각적 신호를 생각했습니다. 아이디어는 선택적인 압축을 사용하여 플레이어가 "누락"으로 등록하지 않았지만 시스템의 부담을 덜어주는 세부 수준을 제거하는 것이 었습니다. "모든 세번째 글 머리 기호"비트는 임의적입니다. 어떤 것이 잘 작동하는지 실험해야합니다. 당신의 대답에서 당신은 "가짜 추적자"라고 말했습니다.
Stephen

1

총알 속도와 프레임 속도가 문제가 될 수 있음을 잊지 마십시오. 물리적 물리 엔진을 충분히 코딩하지 않은 경우 총알이 맞지 않고 객체를 통과 할 수 있습니다. 그 문제에 대한 해결책이 있습니다.

어쨌든, 대기 시간이 30 또는 50ms보다 길어지면 불가능하지는 않지만 멀티 플레이어 환경에서 현실적인 총알을 보상하는 것은 매우 문제가 될 수 있다고 생각합니다.

하지만 언젠가 ISP는 지연 시간에 대해 조금 더 신경을 써서 다른 오퍼를 제공 할 수 있지만 FTTH가 없다면 여전히 꿈입니다 ...


1

나쁜 회사, battlefeild 3 및 스토커와 같은 게임에서 나는 총알이 "로켓"처럼 발사 된 실제 개별 개체라고 생각합니다. 총알이 목표물에 즉시 부딪히면 광선 추적이 필요하다고 생각합니다. 실체가 총알에 실리면 누군가를 때리는 지 확인하기 위해 똑딱 거리게됩니다.


0

콜 오브 듀티 (Call of Duty)에서 비디오 재생을 살펴보면 오렌지색의 Biped가 공기를 통해 의도 한 대상으로 날아가는 것을 희미하게 볼 수 있으며, 실제로 Attackinghobo는 대부분의 경우 올바른 답을 가지고 있습니다.

Hobo와 같은 richochet 효과를 원한다면 Halo 게임 중 하나를 실행하십시오. 더 가까운 위치에서 금속 벽을 쏘면 총알이 금속에서 리치 체팅되는 것을 볼 수 있습니다. 저격수는 적중하는 흔적을 남깁니다.

지연된 답변이 완료되었습니다. 나중에 다시 고칠 수 있습니다.


-5

스토커 시리즈 게임의 총알과 모든 물리학은 "Open Dynamics Engine"이라는 오픈 소스 라이브러리를 사용합니다.

http://en.wikipedia.org/wiki/Open_Dynamics_Engine

총알은 중력에 따라 떨어지고 벽에서 떨어져서 튀어 나와 매우 정확하게 튀어 나와도 스마트 한 경우 총알을 구부려서 볼 수없는 사람을 쏴서 자신의 위치를 ​​알 수 있습니다. 글 머리 기호는 실제 객체 모델입니다. 이것은 내가 본 것 중 가장 현실적인 방법입니다. 광선 추적 방법은 넓은 공간으로 이동할 때 실용적이지 않습니다. 그래도 레이저 총을 쏘는 것이 좋습니다.

BloodRayne 2, Call of Juarez, World of Goo, X-Moto 및 OpenSimulator를 사용하는 다른 게임.

또 다른 좋은 선택은 물리 라이브러리 "Bullet"입니다. http://en.wikipedia.org/wiki/Bullet_%28software%29

그랜드 테 프트 오토 4, 레드 데드 리 뎀션 등에서 사용되었습니다.

ps arma 2는 사내 물리 엔진을 사용하고 다음 게임 arma 3은 physX 물리 엔진을 사용합니다


3
글 머리 기호와 관련이없는 목적으로 ODE를 사용한 게임을 나열하는 것은 오도됩니다.
jhocking 2016 년

4
실제로 게임이 자체 독점 충돌 테스트를 사용하지만 ODE 솔버 만 사용하는 경우 스토커가 총알에 ODE를 사용한다고 오도합니다.
AttackingHobo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.