충돌 해소 및 강제 이동 (충격량 계산 및 j, 각속도, 선속도) - Whitmem
충돌 해소 및 강제 이동 (충격량 계산 및 j, 각속도, 선속도)
물리 프로그래밍
2026-03-02 03:03 게시 4df031554ae603e20c0d

0
0
4
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
몸이 좀 안좋다. 그래서 그런지 집중도 제대로 되지 않는다. 잠을 청하려고 해도 머리가 띵해서 집중이 잘 안되는데,,,,, 일단 기록한다. 일단 물리 엔진을 완전하게 구현한 건 아닌데, 대략이나마 충돌 해소를 구현했다.
물리 충돌량 법칙에 대해서는 아직 정확하게 수식을 유도한 것은 아니라, 존재하는 충돌량 수식을 구해서 사용했다.
일단 선 속도만 가정했을 때 유도 과정은 다음과 같다. 이 계산의 핵심은 충격량을 구하는 것이다. 충돌 전과 충돌 후의 충격량은 동일하다. 물론 방향 벡터는 서로 반대일 것이다. 이 식으로부터 구하고자 하는 v1', v2' 의 식으로 유도한다.
J에 대한 식을 v1', v2' 에 대한 식으로 변형할 수 있다.
한편 J는 어떻게 구하는가?
반발 계수식을 활용한다. v1', v2' 을 대입해주면,
J 꼴로 유도할 수 있다. 즉 e 값은 0이면 비탄성, 1이면 완전 탄성이고, 충격량을 완전히 구할 수 있는 식이 완성되었다. (선속도 한해서)
물론, 여기서는 선 속도만 계산했는데 각 변환도 구현하고자 하는 경우 충돌 지점까지의 각속도를 방향 벡터에 곱해주는 형식으로, 즉 t = r * F 식을 활용해야 한다. 토크 = r * F, r은 r은 원점에서 충돌 지점을 향하는 벡터이고 F는 해당 지점에서 작용하는 힘이다. 이 때 공식 t = ia 이므로, r * F = ia, a = r * F / i 이다.
현재 물체의 최종 토탈 속도를 구하기 위해서
임의 충돌 지점이 있고, 해당 토탈 속도를 구한다고 할 때
k까지의 벡터를 외적하여 90도 오른쪽으로 향하는 벡터를 구하고, 이 벡터에 대해서 각 속도 w를 곱해주면 된다.
이렇게 구하면 해당 각속도로 향하는 하나의 벡터가 나오고, 이 벡터와 선 속도 벡터를 더하면 된다. 아무튼 이런 식들을 포함하여 j 가 나오게끔 다시 유도하면 된다.
한편 방향도 계산해야 하는데, 물체의 상대 속도가 부딪히는 방향으로 오는지, 멀어지는 방향으로 떨어지고 있는지 계산해 줘야 한다. 즉 A가 B에 부딪혀 올 때, A가 50속도로 다가오고, B는 가만히 있을 때 B의 입장에서 A를 보면 50 속도로 다가온다. 만약 B가 10으로 A랑 가까워지고 있고 A가 50으로 B로 오고 있다면, B의 시점에서 A의 상대 속도는 60이다. 한편 B는 A와 10만큼 멀어지고 있고, A는 B쪽으로 50만큼 가고 있다면 B에서 A를 바라보는 상대 속도는 40이다. 이 속도와 충돌하여 경계선에서 충돌선을 향하는 노말 벡터와 내적을 한다.
즉 ReferenceNormal 은 이전에 구한 MTV 이다. 필요에 따라 Incident 면일 수도 있다. 이것에 따라 내적 값 비교문이 달라질 수는 있다. 아무튼 여기서는 상대 속도와 ReferenceNormal 의 내적이 음수일 때 가까워지는 방향으로 충돌한 것이다. 즉 가까워지는 방향으로 충돌한 경우에만 충돌 해소 처리를 해줘야 한다.
물론 충돌 해소를 하고 즉시 일정 간격 끊어놓는 작업이 필요하다. 그렇지 않으면 속도가 매 프레임마다 폭발하거나, 또는 관통하는 문제가 있을 수 있다.
무게에 비례하여 일단 깊이만큼 분배하여 서로 반대 방향으로 (MTV 방향 및 MTV 반대 방향)일단 position을 강제 이동해주는 것이다. 이 방법에 문제가 하나 있는데 속도를 즉시 해소해주지는 않는다는 것이다. 일단 물체가 부딪혀서 강제로 떼어 놓더라도 속도는 여전히 존재한다. 속도를 빼주기 위해 MTV 방향으로만 다시 역을 더해주어 해당 방향으로 빼줄 수는 있는데, 이러면 회전이 반영되지 않는다...이 부분도 추가 계산이 필요할 것으로 보인다.
댓글 0개
댓글을 작성하는 경우 댓글 처리 방침에 동의하는 것으로 간주됩니다. 댓글을 작성하면 일회용 인증키가 발급되며, 해당 키를 분실하는 경우 댓글을 제거할 수 없습니다. 댓글을 작성하면 사용자 IP가 영구적으로 기록 및 부분 공개됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.