SlideShare a Scribd company logo
© 2016 Autodesk
Physics in Stingray with
PhysX
© 2016 Autodesk
Rendering World & Physics World
© 2016 Autodesk
 게임 물리의 목적은 게임 속 세상의 현실감 증대
 충돌 처리
 물리 법칙에 기반한 움직임 표현
 현실감과 게임성 사이의 조화와 균형이 필요
(예) 게임을 방해하는 예측하기 어려운 움직임을 억제,
게이머들이 익숙한 게임 아바타의 움직임은
물리 법칙에 반한다.
 렌더링 오브젝트와 물리 오브젝트의 동기화 확인
 physics debug on/off (in Stingray Editor)
Game Physics
© 2016 Autodesk
Workflow Change
PhysX 3ds Max Plug-Ins 설치
: 물리가 적용된 애셋 제작
게임 세상 속 물리 환경 설정
Stingray가 제공하는 PhysX 인터페이스를
이용해서 게임 코딩 (Flow, Lua)
© 2016 Autodesk
 Unit Editor (in Stingray Editor)
 사용하기 간편하다.
 그러나, joints, constraints를 지원하지 않는다.
 PhysX DCC 플러그인
http://www.nvidia.com/object/physx_dcc_plugins.html
물리가 적용된 애셋 제작 방법
© 2016 Autodesk
 Flow nodes
 Physics category
 Lua API
 stingray.PhysicsWorld
 stingray.Actor
 stingray.Joint
 stingray.Vehicle
 stingray.Raycast
프로그래밍 인터페이스
© 2016 Autodesk
 강체 (Rigid body)
 물체를 구성하는 부분의 상대적인 거리가 변하지 않는 물체
 즉, 모양이 변하지 않는 물체
 움직임의 단위
 3가지 종류
 static: 움직이지 않는다.
 keyframed: 렌더링을 따라 물리가 움직인다.
 dynamic: 물리를 따라 렌더링이 움직인다.
 physics debug on/off (in Stingray Editor)
Actors
© 2016 Autodesk
 Actor를 구성하는 부분
 충돌을 확인하는 단위
 왜 actor를 여러 개의 shapes으로 구성하는가?
 물체의 모양에 따라 충돌 확인 알고리즘이 달라지고,
각 알고리즘의 비용도 다르다.
 복잡한 모양의 충돌 확인 알고리즘을 한 번 처리하기보다
간단한 모양으로 나눠서 여러 번 처리하는 것이 싸다.
 구 < 박스 < 캡슐 < 메시(PhysX에서 다이나믹 액터는 불가)
Shapes
© 2016 Autodesk
 세상의 중심은 나!
게임 세상의 중심은 게이머의 아바타!
 게이머의 아바타는 물리적으로도 특별하다!
 충돌 처리: keyframed actor처럼 충돌에 영향을 안 받아도 안
되지만, dynamic actor처럼 튕겨나가도 곤란하다.
 물리 법칙: 아바타 움직임은 물리 법칙 아래 있어야 하지만,
게이머들은 물리 법칙을 벗어난 아바타의 움직임에 익숙하다.
 그러므로, physics world에서 게이머의 아바타를
표현하는 Mover가 필요하다.
Movers (Character Controller)
© 2016 Autodesk
 충돌 체크는 n2 복잡도를 가진 알고리즘 (n: 물체 개수)
 모든 물체가 충돌할 가능성이 있는 것은 아니다.
예> 다른 방에 있는 물체끼리 충돌 체크할 필요가 없다.
 게임에서는 모든 물체가 충돌하면 안된다.
예> NPC가 땅에 떨어진 아이템과 충돌해서 밀어버리면
안된다.
 충돌해야 하는 물체들만 충돌 체크 대상에 포함되도록
필터를 만들면 성능이 향상된다.
Collision & Filtering
© 2016 Autodesk
 global.physics_properties 파일 (SJSON 형식)
materials = {…}
collision_types = {…}
collision_filters = {…}
shapes = {…}
actors = {…}
Global Physics Properties
© 2016 Autodesk
materials = {
brick = {
density = 1922
dynamic_friction = 0.3
static_friction = 1
friction_combine_mode = "min"
restitution = 0.5
restitution_combine_mode = "average"
}
}
© 2016 Autodesk
collision_types = [
"default"
"character"
"projectile"
]
collision_filters = {
default = {is = ["default"] collides_with_all_except = []}
character = {is = ["character"]}
character_trigger = {collides_with = ["character"]}
}
© 2016 Autodesk
shapes = {
default = {
collision_filter = "default"
disable_collision = false
disable_raycasting = false
disable_response = false
disable_scene_queries = false
sweep = false
trigger = false
}
}
© 2016 Autodesk
actors = {
sample = {mass = 0 inertia = [0,0,0]
minimum_inertia_fraction = 0.1
linear_damping = 0.01
angular_damping = 0.05
dynamic = false kinematic = false
disable_collision = false
disable_response = false
disable_gravity = false
}
}
© 2016 Autodesk
 3ds Max PhysX 플러그/Maya PhysX 플러그인 사용
 PhysX Tools에서 PhysX 3.x 버전을 사용하도록 선택
 PhysX 익스포트 파일 중 RepX 확장자를 xml로 바꿈
 FBX 파일과 RepX 파일의 스케일이 100배 차이가 나므로
익스포트할 때 unit 설정을 그에 맞춰줘야 한다.
(예를 들어, Customize > Units setup > System Unit
Setup을 cm로 설정하고, Display Unit Scale을 m로
설정하고, PhysX Tools 맨 아래에 있는 Scaling에서
Units을 Display로 설정)
Joints & Ragdolls
© 2016 Autodesk
 한 무리의 물체에 위치에 따라 다른 힘을 가하는 방법
 .vector_field 파일에 HLSL과 유사한 문법으로 정의
 루아에서 stingray.World.vector_filed(),
stingray.PhysicsWorld.apply_wind() 함수를 사용
 여러 벡터 필드를 누적해서 사용할 수 있다.
 sleep 상태에 빠진 액터는 영향을 받지 않는다.
영향을 주기 원하면 PhysicsWorld.wake_object()로 미리
깨워야 한다.
Vector Fields
© 2016 Autodesk
 Raycast: 한 점에서 다른 점까지 사이에 물체가 있는지
용도> 총알 명중, 차폐 확인
 Shape cast: raycast와 유사하지만, 점이 아닌 물체를
움직일 때 충돌 확인
용도> 철퇴와 같은 원거리 공격 아이템
 Shape query: 일정 구역 안에 있는 물체들을 확인
용도> 수류탄과 같은 범위형 아이템
Raycasting & Shape Queries

More Related Content

PDF
My sql tde kr_v1.0
PDF
07_PhysX 강체물리 입문
PDF
효율적인 2D 게임 개발을 위한 2d skeletal 구조에 관한 연구 - Spine을 중심으로
PDF
NDC2014 랙돌을 활용한 물리기반 캐릭터 애니메이션
PDF
Flow - Visual Scripting System in Stingray
PDF
Lighting in Stingray
PPTX
Lua 문법 -함수
PPTX
Lua 문법
My sql tde kr_v1.0
07_PhysX 강체물리 입문
효율적인 2D 게임 개발을 위한 2d skeletal 구조에 관한 연구 - Spine을 중심으로
NDC2014 랙돌을 활용한 물리기반 캐릭터 애니메이션
Flow - Visual Scripting System in Stingray
Lighting in Stingray
Lua 문법 -함수
Lua 문법

Similar to Stingray with Physx (11)

PPTX
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
PPTX
Ndc2013 정리(upload버전)
PDF
Unity3D 엔진을 활용한 게임환경 분석 및 3D 그래픽스 기술 /제작 사례
PPTX
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
PDF
Modern gpu optimize
PDF
Modern gpu optimize blog
PPT
NDC11_김성익_슈퍼클래스
PPTX
Unity performanceoptimzation
PDF
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
PPTX
Start unreal
PDF
[NDC 2018] 유체역학 엔진 개발기
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
Ndc2013 정리(upload버전)
Unity3D 엔진을 활용한 게임환경 분석 및 3D 그래픽스 기술 /제작 사례
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
Modern gpu optimize
Modern gpu optimize blog
NDC11_김성익_슈퍼클래스
Unity performanceoptimzation
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
Start unreal
[NDC 2018] 유체역학 엔진 개발기
Ad

Stingray with Physx

  • 1. © 2016 Autodesk Physics in Stingray with PhysX
  • 2. © 2016 Autodesk Rendering World & Physics World
  • 3. © 2016 Autodesk  게임 물리의 목적은 게임 속 세상의 현실감 증대  충돌 처리  물리 법칙에 기반한 움직임 표현  현실감과 게임성 사이의 조화와 균형이 필요 (예) 게임을 방해하는 예측하기 어려운 움직임을 억제, 게이머들이 익숙한 게임 아바타의 움직임은 물리 법칙에 반한다.  렌더링 오브젝트와 물리 오브젝트의 동기화 확인  physics debug on/off (in Stingray Editor) Game Physics
  • 4. © 2016 Autodesk Workflow Change PhysX 3ds Max Plug-Ins 설치 : 물리가 적용된 애셋 제작 게임 세상 속 물리 환경 설정 Stingray가 제공하는 PhysX 인터페이스를 이용해서 게임 코딩 (Flow, Lua)
  • 5. © 2016 Autodesk  Unit Editor (in Stingray Editor)  사용하기 간편하다.  그러나, joints, constraints를 지원하지 않는다.  PhysX DCC 플러그인 http://www.nvidia.com/object/physx_dcc_plugins.html 물리가 적용된 애셋 제작 방법
  • 6. © 2016 Autodesk  Flow nodes  Physics category  Lua API  stingray.PhysicsWorld  stingray.Actor  stingray.Joint  stingray.Vehicle  stingray.Raycast 프로그래밍 인터페이스
  • 7. © 2016 Autodesk  강체 (Rigid body)  물체를 구성하는 부분의 상대적인 거리가 변하지 않는 물체  즉, 모양이 변하지 않는 물체  움직임의 단위  3가지 종류  static: 움직이지 않는다.  keyframed: 렌더링을 따라 물리가 움직인다.  dynamic: 물리를 따라 렌더링이 움직인다.  physics debug on/off (in Stingray Editor) Actors
  • 8. © 2016 Autodesk  Actor를 구성하는 부분  충돌을 확인하는 단위  왜 actor를 여러 개의 shapes으로 구성하는가?  물체의 모양에 따라 충돌 확인 알고리즘이 달라지고, 각 알고리즘의 비용도 다르다.  복잡한 모양의 충돌 확인 알고리즘을 한 번 처리하기보다 간단한 모양으로 나눠서 여러 번 처리하는 것이 싸다.  구 < 박스 < 캡슐 < 메시(PhysX에서 다이나믹 액터는 불가) Shapes
  • 9. © 2016 Autodesk  세상의 중심은 나! 게임 세상의 중심은 게이머의 아바타!  게이머의 아바타는 물리적으로도 특별하다!  충돌 처리: keyframed actor처럼 충돌에 영향을 안 받아도 안 되지만, dynamic actor처럼 튕겨나가도 곤란하다.  물리 법칙: 아바타 움직임은 물리 법칙 아래 있어야 하지만, 게이머들은 물리 법칙을 벗어난 아바타의 움직임에 익숙하다.  그러므로, physics world에서 게이머의 아바타를 표현하는 Mover가 필요하다. Movers (Character Controller)
  • 10. © 2016 Autodesk  충돌 체크는 n2 복잡도를 가진 알고리즘 (n: 물체 개수)  모든 물체가 충돌할 가능성이 있는 것은 아니다. 예> 다른 방에 있는 물체끼리 충돌 체크할 필요가 없다.  게임에서는 모든 물체가 충돌하면 안된다. 예> NPC가 땅에 떨어진 아이템과 충돌해서 밀어버리면 안된다.  충돌해야 하는 물체들만 충돌 체크 대상에 포함되도록 필터를 만들면 성능이 향상된다. Collision & Filtering
  • 11. © 2016 Autodesk  global.physics_properties 파일 (SJSON 형식) materials = {…} collision_types = {…} collision_filters = {…} shapes = {…} actors = {…} Global Physics Properties
  • 12. © 2016 Autodesk materials = { brick = { density = 1922 dynamic_friction = 0.3 static_friction = 1 friction_combine_mode = "min" restitution = 0.5 restitution_combine_mode = "average" } }
  • 13. © 2016 Autodesk collision_types = [ "default" "character" "projectile" ] collision_filters = { default = {is = ["default"] collides_with_all_except = []} character = {is = ["character"]} character_trigger = {collides_with = ["character"]} }
  • 14. © 2016 Autodesk shapes = { default = { collision_filter = "default" disable_collision = false disable_raycasting = false disable_response = false disable_scene_queries = false sweep = false trigger = false } }
  • 15. © 2016 Autodesk actors = { sample = {mass = 0 inertia = [0,0,0] minimum_inertia_fraction = 0.1 linear_damping = 0.01 angular_damping = 0.05 dynamic = false kinematic = false disable_collision = false disable_response = false disable_gravity = false } }
  • 16. © 2016 Autodesk  3ds Max PhysX 플러그/Maya PhysX 플러그인 사용  PhysX Tools에서 PhysX 3.x 버전을 사용하도록 선택  PhysX 익스포트 파일 중 RepX 확장자를 xml로 바꿈  FBX 파일과 RepX 파일의 스케일이 100배 차이가 나므로 익스포트할 때 unit 설정을 그에 맞춰줘야 한다. (예를 들어, Customize > Units setup > System Unit Setup을 cm로 설정하고, Display Unit Scale을 m로 설정하고, PhysX Tools 맨 아래에 있는 Scaling에서 Units을 Display로 설정) Joints & Ragdolls
  • 17. © 2016 Autodesk  한 무리의 물체에 위치에 따라 다른 힘을 가하는 방법  .vector_field 파일에 HLSL과 유사한 문법으로 정의  루아에서 stingray.World.vector_filed(), stingray.PhysicsWorld.apply_wind() 함수를 사용  여러 벡터 필드를 누적해서 사용할 수 있다.  sleep 상태에 빠진 액터는 영향을 받지 않는다. 영향을 주기 원하면 PhysicsWorld.wake_object()로 미리 깨워야 한다. Vector Fields
  • 18. © 2016 Autodesk  Raycast: 한 점에서 다른 점까지 사이에 물체가 있는지 용도> 총알 명중, 차폐 확인  Shape cast: raycast와 유사하지만, 점이 아닌 물체를 움직일 때 충돌 확인 용도> 철퇴와 같은 원거리 공격 아이템  Shape query: 일정 구역 안에 있는 물체들을 확인 용도> 수류탄과 같은 범위형 아이템 Raycasting & Shape Queries

Editor's Notes

  • #3: 렌더링이 게임 속 세상을 화면에 보이도록 해준다면, 물리 엔진은 그에 맞춰서 물체 간 충돌이 일어나고 충돌 결과 일어나는 움직임이 물리 법칙에 맞게 일어나도록 해줍니다. 렌더링 월드는 그에 대응되는 피직스 월드가 존재하고, 렌더링된 물체 중 다른 물체와 충돌이 일어나기 원하는 것들은 피직스 월드 안에 그에 대응되는 물체를 가집니다. 이 게임 스크린샷에서 와이어프레임으로 표시된 것이 피직스 월드 안에 존재하는 물체입니다. 렌더링되는 물체는 복잡한 모양일지라도 물리 엔진에서 사용되는 모양은 필요에 따라 단순화시킨 것을 볼 수 있습니다.
  • #4: 게임에 물리 현상을 구현하는 목적은 현실감을 높이기 위해서입니다. 그러나, 현실감에 집착하다 보면 자칫 게임의 재미를 망치고, 리소스를 과도하게 사용하게 될 수 있습니다. 물리 처리는 상당한 리소스가 들어갑니다. 예를 들어, 아무 물리적 물체가 없더라도 피직스 월드를 생성해서 업데이트하는 데만도 0.5~1.0ms가 들어갑니다. 그러므로, 게임에서 물리는 게임의 재미를 더해주는 방향으로 사용되어야 하고, 항상 리소스를 고려해야 합니다. 물리학 지식은 게임 물리를 구현하는데 도움이 되지만 필수는 아닙니다. PhysX과 같은 물리 엔진을 사용한다면 경험으로 대체 가능합니다. 즉, 물리학 지식이 없어도 값을 바꿔가면서 테스트해서 변수의 영향을 이해한다면 물리 엔진을 사용할 수 있습니다. 하지만, 변수들이 서로 영향을 미치는 경우가 많기에 물리학 지식이 없이 변수의 모든 영향을 이해할 수는 없을 것입니다. 당연한 말일 수 있지만, 이해하지 못하는 변수들은 가능한 디폴트 값을 변경하지 마세요. 이해할 수 없는 버그의 원인이 될 수 있습니다.
  • #8: 여기서 설명할 액터, 셰잎, 조인트 등은 PhysX에서 사용되는 개념이고, 이 개념을 실제로 Stingray에서 사용하는 방법은 Stingray와 연동하는 방식에 따른 것입니다. 그러므로, 게임엔진이 바뀌더라도 PhysX를 물리 엔진으로 사용한다면 거의 동일한 개념을 사용하겠지만, 사용법은 달라질 것입니다.
  • #12: Stingray에서 PhysX 설정에 사용되는 파일입니다.
  • #13: density: 밀도. kg/m^3, 물이 1000 dynamic_friction: 운동 마찰 계수, 보통은 0에서 1 사이, 1을 넘어도 된다. static_friction: 정지 마찰 계수, 현실에서 운동 마찰 계수보다 크다. friction_combine_mode: (average, min, multiply, max) 마찰은 두 물체 사이에 일어나는 일이므로, 두 물체의 마찰 계수 중 어떤 것을 적용할지 결정, (평균, 최소, 곱하기, 최대) 두 물체의 컴바인 모드가 다르면, max, multiply, min, average 순으로 선택 restitution: 탄성 계수, 보통은 0에서 1 사이. 충돌 전후의 속도비 탄성 계수가 r인 물체가 1m에서 떨어지면, r^2m만큼 튀어 오른다. (v^2/2 = gh) 탄성 계수가 0.2이면 1m에서 떨어지면 4cm 튀어 오른다. restitution_combine_mode: (average, min, multiply, max) 충돌도 두 물체 사이에 일어나는 일이므로, 두 물체의 탄성 계수 중 어떤 것을 적용할지 결정,
  • #14: collision_types: 충돌 그룹 리스트 collision_filters: 충돌 필터 리스트, 이 필터를 가진 shape이 어떤 충돌 그룹에 속하고, 어떤 충돌 그룹에 속한 shape과 충돌하는지 결정하는 필터 is = [] 이 필터를 가진 shape이 속하는 충돌 그룹 리스트 collides_wih = [] 이 필터를 가진 shape이 충돌할 상대 shape이 속하는 충돌 그룹 리스트 collides_with_all_except = [] 이 필터를 가진 shape이 충돌하지 않을 shape이 속하는 충돌 그룹 리스트 두 물체가 충돌하려면, 두 물체 중 하나라도 상대방과 충돌하도록 충돌 필터가 설정되면 충돌한다.