[PhysX] 5화 Material

Grphics 2009. 5. 12. 15:07
이번에 새 키보드를 질러서, 강좌를 쓰는 마음이 상당히 뿌듯하네요. 한 글자씩 쓸 때 마다 밀려오는 감동이란 >_<. 하지만 적응하려면 조금 오래 걸릴 것 같네요.

각설하고, 이번에는 소스보다는 많은 설명이 필요한 부분인 것 같네요. 이번엔 특별히 소스코드는 없고, 소스의 부분만을 설명드리도록 하겠습니다. 참고로, 이것은 NVIDIA PhysX를 설치하면 있는 Training Program 에 있는 Rigid Body > Lesson 105 Material을 기준으로 작성하는 것입니다. 함께 보시면 좀더 이해가 쉬울 것 같네요.

자 시작합니다.

1. 복원력/정지마찰력/운동마찰력

먼저 지난 강좌때 썼던 소스 코드를 열어보세요. 그리고 PhysX.cpp에 InitNx() 함수를 살펴보세요. 그럼 다음과 같은 부분이 있을 겁니다.   
    defaultMaterial->setRestitution(0.5);
    defaultMaterial->setStaticFriction(0.5);
    defaultMaterial->setDynamicFriction(0.5);
오늘은 이 부분을 설명할 겁니다. 근데 생각해보니 이미 1화 Primary Shape에서 이 부분을 언급했더라구요. 그래도 다시 한번 설명드리고 넘어가겠습니다.

먼저 Restitution입니다. t와 i가 참 많이 들어가는 단어네요. 이것은 복원력을 의미하는 단어입니다. 그럼 복원력이란 무엇일까요?

당구공을 생각해 봅시다. 당구공은 이상적인 상황에서는 멈춰있는 공을 빠르게 움직이는 공으로 치는 경우, 움직이던 공은 멈추고 멈추어있던 공운 움직이던 공의 속도로 움직이게 됩니다. 이때 작용하는 것이 복원력입니다. 복원력이 1일 수록, 충돌하였을 때, 속도가 보존됩니다. 0이라면 충돌하자마다 멈추겠죠. 그래서 1일때는 완전 탄성 충돌, 0일때는 완전 비탄성 충돌이라고 불리는 것입니다. 이게 바로 복원력입니다. 더 자세한 공식을 알고 싶으시면, 네X버를 사용하세요~> _<

다음은 Static/Dynamic Friction입니다. 한글로는 정지 마찰력, 운동 마찰력입니다. 이 두개의 개념은 거의 항상 같이 나오는 것으로 다음 그래프를 보면 좀더 이해하기 좋습니다.

그림 1. 정지 마찰력과 운동 마찰력의 관계

정지마찰력은 물체를 움직이기 위한 마찰력을 의미합니다. 예를 들어, 우리가 멈춘 차를 움직인다고 할 때, 처음 움직이기는 힘든데, 움직이기 시작하면 그리 큰 힘이 들지 않는 것을 경험을 통해 알고 있을 겁니다. 물체가 움직이기 시작하면 운동마찰력이 적용됩니다. 많은 경우에서 운동마찰력은 정지마찰력보다 작기 때문에 그런 경험을 할 수 있는 것입니다. 공식으로는 다음과 같습니다.

F = μmg

마찰력은 μ(마찰계수)*m(질량)*g(중력)으로 나타낼 수 있습니다. 여담이지만 면적이 넓다고 마찰력이 큰건 절!대! 아니니 어디가서 무식한 티 내지맙시다. 운동 마찰력은 정지 마찰력 계수보다 작기 때문에 F가 작은 것입니다.

(정지/운동 마찰력은 여기서 복사/붙여넣기 했습니다.)


자 그럼, 이제 실습을 해봅시다. 복원력과 정지마찰력과 운동마찰력의 수치를 바꾸면서 어떤 변화가 있는지 살펴보시기 바랍니다.

복원력이 1에 가까울 수록 위에서 떨어진 박스는 높이 튀어 오르는걸 보실 수 있을 겁니다. 0에 가깝다면 거의 튀어오르지 않겠죠.

정지마찰력은 일단 박스가 가만이 있을때 움직여보시면 알 수 있답니다. 얼마나 움직이기 힘든지를 보시면 됩니다. 잘 감이 안오면 전역변수인 gForceStrength 변수의 값을 낮추어서 실습해 보세요. 박스는 미끄러진다기보다는 모서리로 굴러간다는 느낌이 강할겁니다.

운동마찰력은 박스가 움직이기 시작할 때, 얼마나 빠르게 움직이는지를 보시면 알 수 있습니다.


자 그럼 다음으로 넘어가겠습니다.

2. 재질 조합 모드(Material Combine Modes)

지금까지 우리가 만든 환경은 모두 같은 재질을 가진 물체로만 이루어져있습니다. 만약 두개의 다른 재질로 만든 물체가 충돌한다면, 어떤 물체의 속성을 따라서 물리연산을 해야할까요??

PhysX에는 4가지의 조합모드가 있습니다.
  • NX_CM_AVERAGE : 속성의 평균값
  • NX_CM_MIN : 속성의 최소값
  • NX_CM_MULTIPLY : 속성값의 곱
  • NX_CM_MAX : 속성값의 최대값
기본적으로는 NX_CM_AVERAGE가 설정되어 있습니다. 만약, 다른 조합 모드를 가진 두개의 물체가 부딧치면 어떤 속성이 적용될까요? 여기에는 각 조합모드의 우선순위를 통해 가려집니다. 두개의 다른 조합모드중 우선순위가 높은 모드가 선택됩니다. 그럼 우선순위를 살펴보겠습니다.
  1. NX_CM_AVERAGE : 속성의 평균값
  2. NX_CM_MIN : 속성의 최소값
  3. NX_CM_MULTIPLY : 속성값의 곱
  4. NX_CM_MAX : 속성값의 최대값
위에 적어놓은 순서와 같습니다. 즉 NX_CM_MIN과 NX_CM_MAX를 가진 물체가 부딪치면 NX_CM_MAX의 모드가 적용되는 것입니다. 이런 모드를 설정하고 싶으면 NxMaterial::setFrictionCombineMode() 함수나, NxMaterial::setRestitutionCombineMode()를 이용하면 됩니다.

3. 마찰력 크기 변경하기

게임을 만들다보면, 기상조건에 따라, 마찰력을 다르게 조정해야할 필요가 있을겁니다. 예를 들어, 눈이 오면 아주 미끄러울 것이고, 비가 오면 눈보다는 아니지만 역시 미끄러울 겁니다. 하지만, 이렇게 바뀐다고 해서, 물체 전체의 재질을 변경하기는 힘들죠. 그래서 다음과 같은 옵션이 있습니다.
    gPhysicsSDK->setParameter(NX_DYN_FRICT_SCALING, 0.5);
    gPhysicsSDK->setParameter(NX_STA_FRICT_SCALING, 0.5);
이렇게 설정이 되면 모든 정지/운동 마찰력은 반으로 줄어들게 됩니다. 그래서 기상 조건에 따라 물체의 마찰을 조정할 수 있습니다. 참고로 기본값은 1입니다.

4. Bounce Threshold

gPhysicsSDK->setParameter(NX_BOUNCE_THRESHOLD, -100);

위의 함수는 물체가 튀어오를때, 속도가 100 이하라면 튀어오르게 하지 않는다는 의미입니다. 즉, 농구공과 같이 잘 튀어 오르는 물체를 떨어뜨리면 무한히 튀어오를겁니다. 이때, 속도가 얼마 이하가 되면 더이상 튀어오르지 못하게 하는 값을 설정하는 것입니다. 여기서 속도가 음수인 이유는 상대속도이기 때문입니다.


이번 강좌는 얼룽뚱땅 대충대충 넘어갔네요. 위에 언급했던 함수의 인자들의 속성을 바꾸어가면서 테스트해보세요~ 공부에 많이 도움이 될겁니다.

ps. 물체에 다른 재질을 어떻게 설정하는지 아시는 분은 저에게도 좀... 저도 공부하는 중이라..



posted by 스펜서.