물리적 시뮬레이션은 물리적 표준에서 일어납니다. 각 렌더링 표준마다 정확히 하나의 물리적 표준이 있으며, 오브젝트는 그 표준 간에 미러링되어 동기화 상태로 유지됩니다.
참고: Lua에서 플래그 Application.DISABLE_PHYSICS를 Application.new_world()로 전달해 어떠한 물리적 요소 없이도 표준을 생성할 수 있습니다. 표준이 완전히 비어 있다고 해도(약 0.5-1.0ms) 물리적 표준을 실행하는 작업은 매번 상당한 비용이 소요됩니다. 따라서 표준을 순수하게 그래픽 용도(GUI 등)로만 사용하는 경우에는 물리적 요소를 비활성화하십시오.
물리적 표준에는 다수의 액터 또는 강체가 있습니다.
액터는 단일 유닛으로 움직이는 물리적 오브젝트입니다. 액터는 여러 부분으로 구성되어 복잡한 모양을 할 수 있는데, 이 부분들은 항상 서로를 기준으로 동일한 위치에 고정됩니다. 예를 들어, 동상은 항상 전체로 움직이고 그 팔만 따로 위치를 조정할 수 없기 때문에 단일 액터입니다.
물리적 액터 생성을 참조하십시오.
봉제 인형은 팔과 다리를 서로 꼬고 굽힐 수 있어야 하기 때문에 여러 액터로 구성되어 있습니다. 그래서 봉제 인형은 각 부분마다 독립적인 움직임이 가능한 개별 액터가 필요합니다.
액터는 하나 이상의 충돌 모양을 가집니다. 이 충돌 모양이 액터가 다른 액터와 충돌하는 방식을 결정합니다. 예를 들어, 공이 바닥에서 튀어 오를 때 바닥의 충돌 모양에 닿아 튀는 현상을 일으키는 것이 바로 공의 충돌 모양입니다.
액터는 정적(Static), 키프레임(Keyframed) 또는 동적(Dynamic)의 세 가지 모드 중 하나일 수 있습니다. 정적 액터는 절대 움직이지 않습니다. 키프레임 액터는 게임 표준에 의해 제어되기 때문에 그 움직임이 물리적 표준에서 미러링됩니다(즉, 게임 표준이 마스터, 물리적 표준이 슬레이브의 역할을 함). 애니메이션에 의해 제어되는 오브젝트는 대개 키프레임 물리적 요소를 가집니다. 동적 오브젝트는 물리적 표준에 의해 제어되고, 게임 표준에 미러링됩니다.
경우에 따라 오브젝트를 키프레임에서 동적으로, 또 그 반대로 변경하는 것이 유용할 수가 있습니다. 예를 들어, 캐릭터가 주위를 달리고 있는 동안 봉제 인형 액터를 키프레임 설정하여 캐릭터를 따라가도록 할 수 있습니다. 그러다가 캐릭터가 죽으면 봉제 인형 액터를 동적으로 만들어 움직임이 물리적 표준에 의해 제어되도록 할 수 있습니다. 다른 옵션으로는 캐릭터가 죽을 때 봉제 인형 액터를 생성하는 방법도 있습니다.
키프레임 액터는 항상 애니메이션된 움직임을 따라합니다. 동적 액터의 경로는 충돌에 반응하여 수정되는 반면, 키프레임 액터는 애니메이션된 경로를 계속 따라갑니다. 키프레임 액터는 충돌 이벤트를 인식하기는 하지만 그 경로가 자동으로 수정되지는 않습니다. 키프레임 액터가 동적 액터와 충돌하면 항상 동적 액터가 밀리면서 경로를 이탈합니다. 마치 키프레임 액터가 무한 질량을 지닌 동적 액터였던 것처럼 동작합니다.
참고: 오브젝트를 애니메이션하고 싶지만 여전히 충돌 모양을 가지고 실제 물리적 오브젝트로 동작하게 하고 싶을 때가 있습니다. 닫히는 문을 애니메이션하지만 그 중간에 무엇이 있든지 상관없이 무한한 힘으로 닫히게 하고 싶지는 않은 경우를 예로 들어보겠습니다. 대신, 문이 일정한 힘으로 그 중간에 있는 오브젝트를 밀다가 무거운 오브젝트에 걸리면 멈추게 하려고 합니다.
이렇게 하려면 애니메이션을 동일한 움직임에 도달하지만 물리적 시스템에서 인식할 수 있는 물리적 힘으로 변환해야 합니다. 이는 사소한 문제도 아닐 뿐더러 항상 명확한 해결책이 있는 것도 아닙니다. 얼마나 많은 힘을 문에 가해야 할까? 애니메이션이 중간에 중단되면 어떻게 될까?
이 엔진은 이런 종류의 변환을 지원하지 않습니다. 물리적 애니메이션을 실행하고 싶다면 스크립트를 통해 오브젝트에 힘을 수동으로 적용해야 합니다.
각 물리적 액터에는 물리적 시뮬레이션에서 차지하는 공간을 나타내는 모양이 있습니다. 이 모양은 구, 캡슐 또는 상자 등의 일반 솔리드가 될 수 있으며, 액터와 연관된 메시와 일치하거나 Stingray가 메시에서 자동으로 계산하는 볼록 볼륨일 수 있습니다.
정적 액터는 (대개) 메시를 통해 가장 잘 모델링됩니다. 이렇게 하면 충돌 테스트에서 가장 정확한 결과를 얻을 수 있습니다.
키프레임 액터는 구, 캡슐 또는 상자로 가장 잘 구현됩니다. 키프레임 액터에 메시를 사용해야 할 때도 있습니다.
동적 액터는 메시를 전혀 사용할 수 없으며 구, 캡슐, 상자 및 볼록 모양을 사용해야 합니다. 오브젝트 모양에 충분한 정확도를 제공하지 않더라도 오브젝트를 여러 개의 작은 액터로 분할해 볼 수 있습니다. 예를 들어 의자의 경우 좌석과 다리를 포함하는 상자 모양의 액터와, 등판만 포함하는 더 얇은 상자가 있을 수 있습니다.
예를 들어, 게임 플레이 시 키프레임 오브젝트 가까이에서 정밀 사격을 하게 되는 경우 충돌이 그래픽 형상과 최대한 가까운 곳에서 발생하도록 하기 위해서는 메시를 사용해야 할 수 있습니다. 이 경우 최선의 옵션은 레이캐스팅만을 위해 사용되는 메시를 생성하는 것입니다. 이 메시는 그 밖의 다른 어떠한 물리적 오브젝트하고도 충돌하지 않도록 설정해야 합니다.
스크립트 프로그래머는 레이캐스팅 및 모양 쿼리를 사용하여 물리적 표준을 조사할 수 있습니다. 레이캐스트는 물리적 표준의 한 지점에서 물리적 표준의 다른 지점으로 이동하는 레이에 부딪치는 물리적 오브젝트를 찾습니다. 레이캐스트는 대개 총알이 명중하는 오브젝트가 무엇인지, 그리고 한 플레이어가 다른 플레이어를 볼 수 있는지 여부를 결정하는 데 사용됩니다.
모양 캐스트 또는 스윕 테스트도 레이캐스트와 비슷하지만 더 복잡한 모양을 사용합니다. 모양 S(즉, 구)를 A 지점에서 B 지점(A에서 B로의 경로를 따르는 지점)으로 이동하면 이 구는 첫 번째로 무엇과 충돌하나? 이 질문에 답을 해주는 것이 모양 캐스트입니다.
레이캐스트든 모양 캐스트든 이미 시작 지점에서 부딪치고 있는 오브젝트와의 충돌은 감지하지 않습니다. 예를 들어, 레이가 구 내부에서 시작하는 경우에는 이 구와의 어떠한 충돌도 반환하지 않습니다.
모양 쿼리는 모양과 교차하는 모든 물리적 오브젝트를 찾습니다. 모양 쿼리는 수류탄 효과(수류탄 폭발 범위 xm 이내의 모든 액터를 찾아 힘을 적용) 같은 것에 사용할 수 있습니다.
접합 또는 제약 조건은 두 오브젝트 간의 물리적 링크입니다. 노트북 힌지를 예로 들 수 있습니다. 이 힌지는 스크린과 키보드를 함께 고정시키면서 서로를 축으로 회전할 수 있게 해줍니다.
이 물리적 시스템은 오브젝트가 서로를 기준으로 다양하게 움직일 수 있게 해주는 여러 종류의 접합을 시뮬레이션할 수 있습니다. 힌지 접합을 사용하면 오브젝트가 공통 축 주위로 회전할 수 있습니다. 볼 및 소켓 접합을 사용하면 한 오브젝트가 다른 오브젝트를 기준으로 자유 회전할 수 있습니다(예: 여러 방향으로 회전할 수 있는 소켓에 끼운 볼).
접합은 한계와 힘으로도 구성할 수 있습니다. 한계는 접합이 회전할 수 있는 한도를 지정합니다. 예를 들면, 대개 노트북 힌지는 노트북이 완전히 일자가 되도록 180도로 돌릴 수 없습니다. 힘은 접합을 특정 방향으로 밀려고 할 수 있습니다. 힘은 자동 잠금장치가 있는 문 같은 예를 시뮬레이션하는 데 사용할 수 있습니다.
접합, 한계 및 힘을 사용하면 실제 물체와 비슷하게 동작하는 복잡한 오브젝트를 생성할 수 있습니다. 절대 정확하게 복제되지는 않는데, 그 이유는 물리적 시스템이 제공하는 추상적 접합이 실제 접합의 모든 특성을 미묘한 수준까지 캡처하지는 못하기 때문입니다.
봉제 인형은 사지(팔뚝, 상박, 넓적다리, 정강이, 머리, 몸통)를 표현하는 액터 세트, 그리고 그 움직임이 죽었거나 의식이 없는 사람을 흉내 내도록 액터를 결합시킨 접합 세트로 이루어집니다. 실제 봉제 인형 동작을 구현하려면 대개 상당한 미세 조정이 필요합니다.
봉제 인형 생성 및 가져오기를 참조하십시오.
물리적 시스템을 사용하면 어느 액터가 어느 액터와 충돌할지 결정하는 필터를 설정할 수 있습니다.
대개 필터는 성능 향상을 위해 사용합니다. 예를 들어, 레이캐스팅만을 위해 사용할 액터가 있다면 이 액터가 다른 액터와 충돌하지 않도록 설정할 수 있습니다. 돌이나 종이 조각 같은 작은 "잔해" 몸체가 지면에 많이 놓여 있는 경우 이 잔해들이 다른 잔해 오브젝트하고는 충돌하지 않고 보다 큰 오브젝트하고만 충돌하도록 설정할 수 있습니다(작은 오브젝트 간의 충돌은 시각적으로 큰 영향을 주지 않기 때문).
충돌 필터는 레이캐스트 및 쿼리에도 사용할 수 있습니다. 예를 들어, 방탄 유리를 시뮬레이션하려는 경우 이 유리가 "총알 레이"와 충돌하지만 "가시성 테스트 레이"하고는 충돌하지 않도록 필터를 설정할 수 있습니다.
무버 또는 캐릭터 제어기는 캐릭터를 물리적 표준에 표현하는 데 사용합니다. 실제 물리적 오브젝트는 캐릭터에게 원하지 않는 많은 동작을 가지기 때문에 캐릭터는 "실제" 물리적 오브젝트(액터)로 시뮬레이션되지 않습니다. 예를 들어, 물리적 오브젝트는 튀고, 미끄러지고, 뒤집히는 등의 동작을 할 수 있습니다.
그럼에도 캐릭터는 물리적 표준과 상호작용해야 합니다. 캐릭터가 움직이면 캐릭터가 표준의 다른 오브젝트를 관통하지 않는지 움직임을 확인해야 합니다.
그 해결책이 바로 무버입니다. 무버는 캐릭터를 감싸는 캡슐 모양입니다. 캐릭터가 움직이면 캡슐 모양이 물리적 표준에서 이리저리 움직이면서 특수 알고리즘을 사용하여 물리적 오브젝트와의 충돌을 테스트합니다. 이 알고리즘을 통해 게임 캐릭터에게 기대하듯이 무버가 표면에서 미끄러지는 것입니다.
캐릭터가 웅크리면 게임이 보다 작은 무버로 전환함으로써 보다 큰 무버는 접근할 수 없는 영역으로 캐릭터가 들어가게 해줍니다.
캐릭터의 어느 부분이 게임 표준을 관통하지 않도록 하려면 캐릭터의 모든 부분이 무버 모양 내부에 머물러야 합니다(표준과의 충돌에 대해 무버 모양만 확인하기 때문).
이는 때로 문제를 야기합니다. 발차기나 검 공격 같은 재미있는 애니메이션은 공간이 많이 필요합니다. 이를 모두 포함하려면 정말 큰 무버가 필요합니다. 하지만 큰 무버는 좁은 영역에 들어갈 수 없고, 때문에 플레이어에게 부자연스럽게 느껴질 수 있기 때문에 문제가 됩니다. 이 문제에 대한 완벽한 해결책은 없습니다. 타협할 만한 균형을 찾는 건 게임 플레이 코드에 달려 있습니다. 어느 정도까지 관통을 묵인해도 괜찮은 경우도 종종 있습니다. 그 외에는 캐릭터가 벽에 너무 가까이 서 있다면 캐릭터를 벽에서 밀어낼 수도 있지만 큰 움직임이 있기 전에 무버를 크게 변환하는 것이 나을 수도 있습니다.
벡터 필드는 공간 내 각 지점에 Vector3(실제로는 Vector4지만 대개 처음의 세 가지 구성요소만 고려)를 지정하는 기능입니다.
벡터 필드는 공간 내 여러 지점에 벡터 값을 가지는 모든 요소를 표현하는 데 사용할 수 있습니다. 가장 일반적인 경우는 벡터 필드를 사용하여 풍속과 유속을 표현하는 것이지만 자성이나 중력 같은 것을 표현하는 데 사용할 수도 있습니다. 벡터 필드를 바람을 표현하는 데 사용할 때에는 벡터 필드가 공간 내 각 지점에서 풍속을 제공합니다.
벡터 필드는 이에 대한 효과를 재생하여 생성합니다. 효과를 생성하여 폭발, 회오리바람, 통풍구의 상승기류 등 풍속에 영향을 미치는 다양한 종류의 요소를 표현할 수 있습니다.
벡터 필드를 통한 바람은 물리적 요소와 입자 모두에 적용될 수 있습니다.
자세한 내용은 벡터 필드(바람) 효과 설정을 참조하십시오.
차량은 유닛의 한 부분으로 해당 유닛 내 물리적 액터를 기반으로 합니다. 이 물리적 액터는 차량의 수명이 다할 때까지 차량에 필요하기 때문에 언제든 제거해서는 안 됩니다. 차량의 기본 액터에는 새시(차체)와 바퀴를 구성하는 다수의 모양이 포함되어야 합니다. 새시를 위한 충돌 모양 하나와 각 바퀴를 위한 추가 충돌 모양이 필요합니다. 각 차량 모양은 궁극적으로 볼록 메시여야 합니다. 볼록 메시를 작성하거나 엔진이 비볼록 모양을 기반으로 볼록 메시를 컴퓨팅하도록 하면 됩니다.
기본적으로 지원되는 차량 유형은 바퀴형과 탱크형, 두 가지입니다. 바퀴형과 탱크형 차량의 근본적인 차이는 차체의 동일 측면에 있는 탱크형 바퀴는 모두 같은 속도로 작동한다는 점입니다. 바퀴형 차량의 바퀴는 제각각 작동합니다. 탱크형 바퀴는 바퀴형 차량처럼 회전해서는 돌아가지 않습니다. 탱크는 각 트레드에 서로 다른 수준의 추력을 가하여 돌아갑니다.
Stingray에서는 키프레임 차량을 지원하지 않습니다.
차량 특성은 SI 유닛을 기반으로 합니다. 거리는 미터로 측정되고, 질량은 킬로그램, 시간은 초 단위로 측정됩니다.
차량 물리적 요소 설정 및 차량 물리적 특성을 참조하십시오.