http://www.gpgstudy.com/forum/viewtopic.php?p=57191
충돌체의 오차수정 | 올려짐: 2006-07-13 13:44 |
| 구의 충돌의 구현에서 정확한 충돌체의 움직임을 표현하기 위해선
정확한 시간 T를 알아야 한다고 알고 있습니다.
이때 시간을 2차 방정식의 근의 공식을 통해서 얻을수 있는 것도 알수 있습니다.
그런데 이때 구의 움직임이 등속도 운동인 경우에 변하게 되는 좌표 p2= p1+VT 정도로 얻을수 있습니다.
그런데 이 움직임이 등속도 운동이 아닌 등가속도 운동을 하고 있는 경우에는 어떻게 이 T값을 얻을수 있나요?
간단히 생각할때는 2차 방정식을 넘어서 4차 방정식까지 올라가던데
아무리 생각을 해도 4차방정식까지 올라간다는것은 바보 짓이라고 생각이 됩니다.
어떻게 하면 등가속도 운동을 하는 물체의 충돌시간 T를 구할수 있을까요? |
|
위로 | |
|
비회원 손님
| Re: 충돌체의 오차수정 | 올려짐: 2006-07-13 15:02 |
| 비회원 씀: | 구의 충돌의 구현에서 정확한 충돌체의 움직임을 표현하기 위해선
정확한 시간 T를 알아야 한다고 알고 있습니다.
이때 시간을 2차 방정식의 근의 공식을 통해서 얻을수 있는 것도 알수 있습니다.
그런데 이때 구의 움직임이 등속도 운동인 경우에 변하게 되는 좌표 p2= p1+VT 정도로 얻을수 있습니다.
그런데 이 움직임이 등속도 운동이 아닌 등가속도 운동을 하고 있는 경우에는 어떻게 이 T값을 얻을수 있나요?
간단히 생각할때는 2차 방정식을 넘어서 4차 방정식까지 올라가던데
아무리 생각을 해도 4차방정식까지 올라간다는것은 바보 짓이라고 생각이 됩니다.
어떻게 하면 등가속도 운동을 하는 물체의 충돌시간 T를 구할수 있을까요? |
지식이 짧아서 원하는 답변은 드리기 힘드네요...
정확한 충돌체의 움직임 대신에, 실시간으로 이동시켜서 직접 충돌체크를 하는 쪽이 나을겁니다... 이렇게 되면, 프레임과 프레임 사이에 2개의 구는 다소간에 뚫고 들어가거나, 아니면 아예 관통하는 경우가 생깁니다.
뚫고 들어가거나, 관통하는 경우에서, 두개의 구의 중심 거리가 2R과 비교해 크다면.... 타임스텝값은 오차가 큰 것으로 간주되므로.... 원래의 값으로 되돌리고 DeltaTime을 절반으로 줄이고 다시 계산합니다.. 그렇게 해서 오차가 정해놓은 문턱치보다 적다면...그때의 시간값을 구하시게 되면 되구요.....
아무래도 계산반복이 성능향상에 도움이 되지 않는다 판단되면.... 뚫고 들어가거나 관통하는 즉시, 충돌전과 이후에 두프레임 사이의 구간 거리 값을 간단이 보간해서 적당한 시간값을 맞춥니다...
물론 위와 같은 두식으루 체크하면 정확한 값을 얻지는 못합니다만.... 등속,등가속,비등가속에 상관없이 대충의 값을 얻어낼순 있습니다... // |
|
위로 | |
|
비회원 손님
| | 올려짐: 2006-07-13 15:45 |
| 음 그 생각을 저도 해보긴 했는데
매우 빠르게 이동하는 물체와 매우 느린 컴퓨터라면 문제가 생길거 같아서
선택하기가 힘들더라구요 ..
충돌전과 충돌후의 정보들을 이용해서
단순화된 직선의 식으로 바꿔서 사용하는 방법을 생각해 봤지만 이 역시 물체의 속도가 빨라질수록
오차가 생기게 되고
만약 프로그램적으로 저 값 을 찾을수 있다면 매우 유용할거 같아서 3일째 찾고 있습니다...
역시 아마추어에겐 저런건 무리인가요.....에휴
완전 느낌이 날라오는 대포동 미사일을 페트리어트 미사일로 맞추는거와 같군요;;; |
|
위로 | |
|
taiky
가입: 2004년 1월 13일 올린 글: 36 소속: 독립개발자
| | 올려짐: 2006-07-13 16:15 |
| 충돌시점의 시간을 1.0으로 스케일한 값으로 얻게 되면, 고정프레임이 아닌이상 해상도의 차이가 생기게 마련입니다.
이경우 보통 프레임간 간격이 너무 길어졌을 경우 몇번으로 나누어 계산하는 방법을 씁니다. 만약 하드 스왑등의 이유로 프레임 델타가 굉장히 길어졌을경우 오차가 아주 심하게 납니다. 또한 기본적으로 약간의 오차범위를 고려하여 t값을 그대로 적용하지않고 약간 여유를 두는 것도 좋을 것 같습니다. |
|
위로 | |
|
비회원 손님
| | 올려짐: 2006-07-13 16:53 |
| 이런 방법을 어떨까요? 갑자기 생각이 나서 확인을 하진 못했지만
문제는 알아야 할 값은 문제를 풀어보면 최종위치와 시간이 라는 두개의 미지수가 나오는데
식은 단지 하나라는게 문제 입니다.
이럼 당연히 문제를 풀수 없습니다.
비례식을 도입해서
반지름 10짜리 구 두개가 충돌을 하게 된다면
두개의 구의 중심거리가 20이 될겁니다.
그런데 실제로 어떠한 시간에 측정된 거리이 값이 10입니다.
그럼 분명 충돌을 한거겠죠. (거리가 다시 멀어지지 않은 상태라고 하겠습니다. 이건 측정할수 있으니)
이때 한개의 구가 4라는 속도를 지니고 있고 또 다른 구는 1이라는 속도를 가지고 있다고 하겠습니다.
이건 얻을수 있는 값이겠죠....
그럼 두구의 거리가 10이 되었다는 말은 충돌하고 나서 양쪽을 합쳐서 10이라는 거리만큼 이동을 했다는
말이 되겠죠. 그럼 10이라는 거리를 이동하기 위해선 어짜피 두 물체는 서로 접근하고 있을거고 양쪽이
매 시간 단위마다 5라는 거리를 좁히고 있겠죠. 10이라는 거리를 줄이기 위해선 단위시간으로
2가 필요하게 되겠죠. 측정된 시간 값은 알거고 그럼 이때의 시간을 알고 있으니 이 시간에서 2라는 값을
빼준다면 원하는 시간 T를 구할수 있지 않을까요? 이 역시 가속도라는 문제덕에 오차의 문제가 발생하겠지만
조금 더 응용하고 살을 붙이면 훨씬 오차를 적은 비용으로 줄일수 있을거 같은데 어떨까요? |
|
위로 | |
|
전외솔
가입: 2002년 7월 3일 올린 글: 517
타 사이트 ID(?): 102053962 | Re: 충돌체의 오차수정 | 올려짐: 2006-07-14 23:28 |
| 비회원 씀: | 구의 충돌의 구현에서 정확한 충돌체의 움직임을 표현하기 위해선
정확한 시간 T를 알아야 한다고 알고 있습니다.
이때 시간을 2차 방정식의 근의 공식을 통해서 얻을수 있는 것도 알수 있습니다.
그런데 이때 구의 움직임이 등속도 운동인 경우에 변하게 되는 좌표 p2= p1+VT 정도로 얻을수 있습니다.
그런데 이 움직임이 등속도 운동이 아닌 등가속도 운동을 하고 있는 경우에는 어떻게 이 T값을 얻을수 있나요?
간단히 생각할때는 2차 방정식을 넘어서 4차 방정식까지 올라가던데
아무리 생각을 해도 4차방정식까지 올라간다는것은 바보 짓이라고 생각이 됩니다.
어떻게 하면 등가속도 운동을 하는 물체의 충돌시간 T를 구할수 있을까요? |
바보같은 짓이 아닙니다.
해석적인 방법으로 계산하려 할 때는
VectorLength( 물체1의위치 - 물체2의위치 ) == 물체1의반지름 + 물체2의 반지름
의 조건이 맞는 t를 구하는 문제가 되고
위치가 t^2 에 대한 식이고, VectorLength는 sqrt를 수반하기 때문에 4차방정식을 풀어야 하는 것이 맞습니다.
그런데 이것은 일반적인 경우에 대한 식이고, 우리의 경우는 특수한 조건이 있습니다.
만일 두 물체의 가속도가 같다면 (a1==a2) 식이 좀 더 간단해져서 2차방정식으로 됩니다. (그것도 1차항이 없어서 sqrt한방으로 구할수 있는 형태로 나오더군요.)
좀 길지만 수학 공식을 싫어하시는 분들은 패스를 부탁드립니다 (_ _)
인용: |
| p1-p2 | = r1+r2
p1 = v1_0*t + 1/2*a*t^2
p2 = v2_0*t + 1/2*a*t^2
| v1_0*t + 1/2*a*t^2 - v2_0*t - 1/2*a*t^2 | = r1+r2
| v1_0*t - v2_0*t | = r1+r2
|( v1_0_x*t-v2_0_x*t, Y, Z )| = r1+r2
sqrt{ (v1_0_x*t-v2_0_x*t)^2 + Y^2 + Z^2 } == r1+r2
sqrt{ ((v1_0_x-v2_0_x)^2*t^2 + Y^2 + Z^2 } == r1+r2
LET v1_0_x-v2_0_x = dvx LET v1_0_y-v2_0_y = dvy LET v1_0_z-v2_0_z = dvz then
sqrt{ dvx^2*t^2 + dvy^2*t^2 + dvz^2*t^2 } == r1+r2
sqrt{ (dvx^2 + dvy^2 + dvz^2)*t^2 } = r1+r2
hence,
(dvx^2+dvy^2+dvz^2)*t^2 = (r1+r2)^2
LET dvx^2+dvy^2+dvz^2 = DV2 LET (r1+r2)^2 = R2 then
DV2*t^2 = R2
t^2 = R2 / DV2
|
4차방정식을 언급하시는 것으로 보아서 맨 위의 식은 설명드리지 않아도 아실거라 생각해서 설명은 생략합니다.
한 번 직접 풀어보셔도 별로 어렵지 않을겁니다. |
|
위로 | |
|
비회원 손님
| | 올려짐: 2006-07-15 16:56 |
| 인용: | | p1-p2 | = r1+r2
p1 = v1_0*t + 1/2*a*t^2
p2 = v2_0*t + 1/2*a*t^2
| v1_0*t + 1/2*a*t^2 - v2_0*t - 1/2*a*t^2 | = r1+r2
| v1_0*t - v2_0*t | = r1+r2
|( v1_0_x*t-v2_0_x*t, Y, Z )| = r1+r2
sqrt{ (v1_0_x*t-v2_0_x*t)^2 + Y^2 + Z^2 } == r1+r2
sqrt{ ((v1_0_x-v2_0_x)^2*t^2 + Y^2 + Z^2 } == r1+r2
LET v1_0_x-v2_0_x = dvx LET v1_0_y-v2_0_y = dvy LET v1_0_z-v2_0_z = dvz then
sqrt{ dvx^2*t^2 + dvy^2*t^2 + dvz^2*t^2 } == r1+r2
sqrt{ (dvx^2 + dvy^2 + dvz^2)*t^2 } = r1+r2
hence,
(dvx^2+dvy^2+dvz^2)*t^2 = (r1+r2)^2
LET dvx^2+dvy^2+dvz^2 = DV2 LET (r1+r2)^2 = R2 then
DV2*t^2 = R2
t^2 = R2 / DV2
|
이렇게 수식을 표현 하셨는데 한가지가 빠진것 같습니다.
p1 = v1_0*t + 1/2*a*t^2
p2 = v2_0*t + 1/2*a*t^2
가 아니라
p1= ps1 +v1_0*t + 1/2*a*t^2
p2= ps2 +v1_0*t + 1/2*a*t^2
초기의 물체의 위치가 필요 합니다. 이 부분이 빠진거 같은데요[/quote] |
|