2007년 04월 03일
천 애니메이션에서의 자연스러운 충돌처리
[ Advanced Character Physics ]
아티클에서는 파티클이 충돌체를 파고들지 못하도록 제한하고 충돌이 일어났을 경우 파티클을 충돌체에 Projection하여 처리한다. 간단하고 안정적이기는 하지만 충돌했을 경우 급격히 힘을 잃어버리는 문제가 생긴다. 이를 좀 더 자연스럽게 해주기 위해 파티클의 정규화된 진행 벡터와 충돌체와의 충돌점에서의 접촉면에서의 정규화된 법선벡터와의 합의 방향으로 파티클이 파고드는 만큼 밀어주면 자연스럽게 미끄러지는 결과를 보여줬다. 단, 이 방법은 충돌체가 구의 경우에만 가능하고 충돌 구 안에 있는 파티클은 고려하지 않았다.
/*
d = 파티클의 진행방향 벡터
c = 충돌 포인트
n = 충돌 포인트에서의 노멀벡터
p = 파티클이 충돌체(구)에 파고든 거리
*/
if( n*d >-1 )
{
pos = c + (n+d)*(p)
}
else
{
pos = c
}
충돌포인트를 구하기 위해 square root 를 하는 것 이외에는 뺏셈, 비교, 덧셈 등의 비교적 가벼운 연산이 추가로 수행된다. 더 나아가 바운드 되는 양을 조절함으로써 구의 마찰력을 구현 할 수도 있다.
/* f = 충돌구의 마찰력 ( 0 < f < 1 ) */
pos = c + (n+d)*(p-f)
구 이외에 충돌체에는 적용하기 힘들다는 단점이 있기는 하지만 제한된 환경에서는 비교적 가벼운 연산으로 보다 향상된 결과를 가져올 수 있다.
아티클에서는 파티클이 충돌체를 파고들지 못하도록 제한하고 충돌이 일어났을 경우 파티클을 충돌체에 Projection하여 처리한다. 간단하고 안정적이기는 하지만 충돌했을 경우 급격히 힘을 잃어버리는 문제가 생긴다. 이를 좀 더 자연스럽게 해주기 위해 파티클의 정규화된 진행 벡터와 충돌체와의 충돌점에서의 접촉면에서의 정규화된 법선벡터와의 합의 방향으로 파티클이 파고드는 만큼 밀어주면 자연스럽게 미끄러지는 결과를 보여줬다. 단, 이 방법은 충돌체가 구의 경우에만 가능하고 충돌 구 안에 있는 파티클은 고려하지 않았다.
/*
d = 파티클의 진행방향 벡터
c = 충돌 포인트
n = 충돌 포인트에서의 노멀벡터
p = 파티클이 충돌체(구)에 파고든 거리
*/
if( n*d >-1 )
{
pos = c + (n+d)*(p)
}
else
{
pos = c
}
충돌포인트를 구하기 위해 square root 를 하는 것 이외에는 뺏셈, 비교, 덧셈 등의 비교적 가벼운 연산이 추가로 수행된다. 더 나아가 바운드 되는 양을 조절함으로써 구의 마찰력을 구현 할 수도 있다.
/* f = 충돌구의 마찰력 ( 0 < f < 1 ) */
pos = c + (n+d)*(p-f)
구 이외에 충돌체에는 적용하기 힘들다는 단점이 있기는 하지만 제한된 환경에서는 비교적 가벼운 연산으로 보다 향상된 결과를 가져올 수 있다.
# by freewill | 2007/04/03 12:38 | 개발 | 트랙백(18) | 덧글(0)




