물리적 특성 파일은 모든 물리적 오브젝트가 공유하는 설정을 지정하는 전역 파일(항상 global.physics_properties)입니다.
global.physics_properties 파일을 위한 사용자 인터페이스가 없으므로 일반 텍스트 편집기를 사용하여 편집합니다. 파일은 다섯 부분으로 된 SJSON 파일입니다.
materials = {...} collision_types = {...} collision_filters = {...} shapes = {...} actors = {...}
재질 섹션은 물리적 오브젝트가 무엇으로 만들어졌는지, 물리적 재질에 대한 특성을 정의합니다 이러한 특성의 예로는 밀도와 마찰 등이 있습니다.
각 재질은 이름으로 식별되며 여러 가지 특성이 지정되어 있습니다. 예:
materials = { brick = { density = 1922 dynamic_friction = 0.3 friction_combine_mode = "min" restitution = 0.5 restitution_combine_mode = "average" static_friction = 1 } clay = { density = 1089 dynamic_friction = 0.3 friction_combine_mode = "min" restitution = 0.5 restitution_combine_mode = "average" static_friction = 1 } copper = { density = 8920 dynamic_friction = 0.3 friction_combine_mode = "min" restitution = 0.5 restitution_combine_mode = "average" static_friction = 1 } }
재질 특성은 아래처럼 정의됩니다.
density = 1000
SI 단위로 나타낸 오브젝트의 밀도(kg/m^3)입니다. (Stingray 엔진의 모든 특성은 SI 단위로 지정됩니다.) 물의 밀도는 1000입니다. 부동 오브젝트의 밀도는 1000 미만이며 가라앉는 오브젝트의 밀도는 1000 이상입니다.
dynamic_friction = 0.1
오브젝트가 표면 위 슬라이딩할 때 사용되는 마찰 계수입니다(일반적으로 0~1 범위지만 1보다 높은 값도 가능).
static_friction = 0.1
오브젝트가 표면 위에 머물러 있을 때 사용되는 마찰 계수입니다. 정적 마찰은 일반적으로 동적 마찰보다 높습니다. 오브젝트를 움직이게 한 다음 계속 움직이게 하려면 더 많은 힘이 필요합니다.
friction_combine_mode = "average"
(옵션: "average", "min", "multiply", "max")
현실에서 오브젝트 간 마찰은 오브젝트의 재질에 따라 달라집니다. 그러므로 단일 재질에서는 마찰이 없습니다. 하나의 재질이 특정 마찰이 있는 다른 재질과 조합되었을 경우에 생깁니다. (벨크로 조각은 다른 벨크로 조각과 닿으면 마찰이 높고, 직물과 닿으면 마찰이 어느 정도 높으며, 다른 오브젝트와 닿으면 마찰이 낮습니다.)
하지만 물리적 엔진은 재질의 가능한 모든 조합을 처리할 수 없기 때문에 각 재질에 마찰 계수를 할당합니다. 그렇다면 서로 다른 계수의 두 재질(예: 0.1과 0.3)이 만나면 어떻게 될지 문제가 됩니다. 이는 friction_combine_mode에 의해 결정됩니다.
어떠한 결합 모드도 절대적으로 맞거나 틀리지 않습니다. 프로젝트에 잘 맞는 것을 찾는 문제일 뿐입니다. min을 사용하면 "미끄러운 바닥"뿐만 아니라(바닥에 마찰을 낮게 지정하면 모든 것이 그 위에서 슬라이딩함) "미끄러운 오브젝트"(오브젝트에 낮은 값을 지정하면 모든 것 위에서 슬라이딩함)를 생성할 수 있으므로 좋은 선택이 될 수 있습니다. 이는 보통 두 개의 가장 흥미로운 마찰 효과입니다.
두 개의 오브젝트가 서로 다른 friction_combine_modes인 경우 목록의 average, min, multiply, max 중 가장 최신 모드가 선택됩니다. 즉, min이 average를 충족한다면 min이 사용됩니다.
restitution = 0.2
Restitution은 오브젝트의 탄력을 지정합니다. 좀 더 자세히 설명하자면 오브젝트가 바운스된 이후 현재 속도를 어느 정도 유지할 것인지를 지정합니다. v^2/2 = gh이므로 r의 복원 값으로 1m에서 낙하하는 오브젝트는 r^2의 높이로 바운스됩니다.
값의 범위는 0~1 사이여야 합니다.
0.2라는 값은 오브젝트가 속도의 20%를 유지한다는 의미로 1m의 높이에서 낙하하는 경우 4cm 바운스됩니다.
restitution_combine_mode = "average"
(옵션: "average", "min", "multiply", "max")
마찰과 마찬가지로, 복원 값은 실제 바운스와 연관된 두 오브젝트에 따라 달라집니다. 이 매개변수는 오브젝트의 복원 값이 각기 다를 때 사용될 복원 계산 방법을 지정합니다.
충돌 유형 및 충돌 필터는 서로 충돌할 오브젝트를 결정합니다.
collision_types = [ "default" "character" "vehicle" "projectile" ] collision_filters = { default = {is = ["default"] collides_with_all_except = []} character = {is = ["character"]} character_trigger = {collides_with = ["character"]} }
collision_types는 각기 다른 충돌 유형에 대한 고유 이름 목록입니다.
collision_filter는 충돌 방법을 지정하기 위해 물리적 오브젝트에서 실제로 사용되는 것입니다. 충돌 필터는 두 목록으로 구성됩니다. 오브젝트가 무엇인지 알려주는 목록과 오브젝트가 충돌할 대상을 알려주는 목록입니다. 오브젝트는 하나 이상일 수 있다는 점을 참조하십시오. 예를 들어 오브젝트는 차량이자 발사체일 수 있습니다.
충돌 필터에 대해 다음 특성을 설정할 수 있습니다.
is = []
이 오브젝트가 무엇인지 지정하는 충돌 유형 목록입니다.
collides_with = []
이 오브젝트가 무엇과 충돌할지 지정하는 충돌 유형 목록입니다.
collides_with_all_except = []
거의 모든 것과 충돌할 오브젝트를 지정하는 편리한 방법입니다. 오브젝트는 목록에 기재된 것을 제외한 모든 것과 충돌합니다.
A와 B라는 두 오브젝트는 A가 B의 충돌 대상인 경우 또는 B가 A의 충돌 대상인 경우 충돌합니다.
모양 특성은 물리적 액터의 개별 모양에 적용됩니다. 액터는 여러 가지 모양으로 구성할 수 있습니다. 예를 들어 아령 액터는 두 개의 구와 이를 이어주는 캡슐 모양으로 만들어질 수 있습니다.
모양 목록은 모양에 대한 템플릿을 지정합니다. 물리적 오브젝트를 정의할 때 각각의 모양이 사용할 템플릿을 지정합니다.
예:
shapes = { default = {} trigger = {trigger = true} sweeper = {sweep = true} character = {collision_filter = "character"} character_trigger = {trigger = true collision_filter = "character_trigger"} }
모양에 대해 설정할 수 있는 특성은 다음과 같습니다.
collision_filter = "default"
모양이 사용하는 충돌 필터를 지정합니다.
disable_collision = false
True인 경우 이 모양에 대한 충돌이 완전히 비활성화됩니다. 이는 레이캐스트 및 겹침 쿼리에만 사용되는 모양에 대해 사용할 수 있습니다.
disable_raycasting = false
True인 경우 이 모양에 대해 레이캐스트가 비활성화됩니다.
disable_response = false
True인 경우 이 오브젝트에 대한 충돌 응답(바운스)은 비활성화되지만 접점은 계속 생성됩니다.
disable_scene_queries = false
True인 경우 이 모양은 장면 쿼리 테스트에 참여하지 않습니다(예: 겹침 테스트).
sweep = false
True인 경우 이 모양에 대해 스윕 충돌이 사용됩니다.
물리적 엔진은 별개의 단계로 오브젝트를 이동하며 시뮬레이션하므로, 속도가 높은 소형 오브젝트는 단일 단계에서 표면을 완전히 통과할 수가 있습니다. 이런 경우 충돌 이벤트는 생성되지 않으며 오브젝트는 표면을 통과하는 것으로 보입니다. 이는 종이 통과 탄환 문제로 알려져 있습니다.
한 시뮬레이션 단계에서 오브젝트가 이동하는 거리인 vdt*(v는 속도, dt는 시간 단계)가 그 반지름 r보다 클 때 종이 통과 탄환 문제가 발생할 위험이 있습니다. 기본적으로 우리는 60Hz의 물리적 단계를 사용하며, 이는 v > 60r인 경우 위험이 발생한다는 의미입니다.
이를 해결하기 위해 작고 빠르게 움직이는 오브젝트에 대한 스윕 충돌을 활성화할 수 있습니다. 스윕 충돌이 활성화되면 오브젝트는 시뮬레이션 시작 시 위치에서 종료 시 위치로 스윕되며 그 사이의 모든 충돌이 감지됩니다. 스윕 충돌을 사용하면 성능이 저하되므로 모든 오브젝트에 대해서가 아니라 작고 빠르게 움직이는 오브젝트에 대해서만 활성화하는 것이 좋습니다.
trigger = false
True인 경우 해당 모양을 트리거 모양으로 지정합니다.
트리거 모양은 일반 물리적 시뮬레이션에 참여하지 않습니다. 대신, 물리적 오브젝트가 그 안에 들어갈 때 이벤트를 생성해야 하는 볼륨을 지정합니다. 흐름을 사용하여 이벤트 처리를 설정할 수 있습니다.
액터 템플릿은 액터에 적용될 특성을 지정합니다. 물리적 액터를 정의할 때 사용하려는 액터 템플릿을 지정합니다.
예:
actors = { static = {dynamic = false} dynamic = {dynamic = true linear_damping = 0.1 angular_damping = 0.1} keyframed = {dynamic = true kinematic = true linear_damping = 0.1 angular_damping = 0.1} }
액터 템플릿에서 다음 특성을 사용합니다.
mass = 0
액터의 질량을 지정합니다. 질량을 지정하지 않으면 액터 모양의 볼륨과 재질의 밀도를 사용해 자동 계산됩니다.
inertia = [0,0,0]
주요 축 주변 액터의 회전 관성을 지정합니다. 관성을 지정하지 않으면 모양과 밀도를 사용해 자동 계산됩니다.
minimum_inertia_fraction = 0.1
물리적 엔진은 각기 다른 축 주변 관성에 큰 차이가 있는 경우 잘못 동작합니다. 이러한 매개변수는 관성에 허용될 차이가 어느 정도인지를 지정합니다. 0.1이라는 값은 가장 큰 관성의 10%보다 작은 관성을 가진 축이 없음을 의미합니다. 이 값을 변경하게 되는 경우는 거의 없습니다.
linear_damping = 0.01
액터의 선형 이동에 적용되는 일반 댐핑 요소입니다. 댐핑은 액터를 멈추게 하는 요소가 없을 때도 시간이 지나면 액터를 멈춰줍니다. 댐핑 값이 높을수록 액터를 더 빨리 멈추고 고정시켜 시뮬레이션의 안정성과 성능이 높아집니다. 그러나 액터가 너무 빨리 멈추면 이상해 보일 수 있습니다.
angular_damping = 0.05
액터의 회전 이동에 적용되는 일반 댐핑 요소입니다. 흔히 linear_damping보다 더 높은 angular_damping을 사용할 수 있습니다.
dynamic = false
True인 경우 액터가 동적입니다. False인 경우 액터가 정적입니다.
kinematic = false
True인 경우 액터가 키프레임된 것입니다. 이 특성은 dynamic이 true일 경우에만 유효합니다.
disable_collision = false disable_response = false
해당 모양 플래그로, 전체 액터에 적용합니다.
disable_gravity = false
True인 경우 이 액터는 중력의 영향을 받지 않습니다.