캐릭터가 어디에서 멈출까요?


12

몇 년 전에 나는 예산 의사 3D 게임을 위해 AI를 코딩했습니다. 내가 실제로 가장 좋은 방법을 알지 못했던 계산이 하나 있었으며, 그것이 이제 멈추었을 때 적의 위치를 ​​계산하는 것이 었습니다. 예를 들면 다음과 같습니다.

  • 적이 현재 X = 540.0입니다.
  • 적은 프레임 당 10 픽셀로 오른쪽으로 움직이고 있습니다.
  • 적이 멈추기를 원할 때 속도는 0에 도달 할 때까지 프레임 당 1 픽셀 씩 떨어집니다.

적을 완전히 멈출 때 끝나는 위치를 알려주는 간단한 공식이 있습니까? 나는 필요에 따라 작동하는 오프셋을 미리 계산하고 하드 코딩했지만 속도가 다른 적에 대해서는 별도로 계산해야했습니다.

답변:


7

나는 일반적으로 John의 대답에 동의합니다. 나는 약간 수정 된 수식을 제공 할 것입니다 (그의 가치에 여분의 V / 2를 더합니다).

D = V / A * (V + A) / 2 

V = 10하고 A = 1, 그 가져 D =을 55. 이것은 정확하게 결과입니다

10 + 9 + 8 + 7 + .... + 3 + 2 + 1

이것은 적의 프레임 별 움직임입니다.

그 단계에 도달하는 방법은 다음과 같습니다.

  1. V : 현재 속도 = 10 픽셀 / 프레임, A : 현재 가속 = 1 픽셀 / 프레임 ^ 2
  2. T : 정지 시간 = V / A = 10 프레임.
  3. 10 프레임 이동 거리 = 프레임 1 + 프레임 2 + 프레임 3 + ... = V + (VA) + (V-2 * A) + ...
  4. 이것은 T * V-A / 2 * T * (T-1)과 같으며 위의 방정식을 단순화합니다.

+1 솔루션에서 로직 결함을 볼 수 없으며 솔루션을 어떻게 처리했는지 기억할 수 없습니다. 내 표현이 잘못되어야하고 작은 차이와 세부적인 테스트 부족으로 인해 눈치 채지 못했을까요? 속도의 절반 만 추가하면 내 표현이 정확 해 집니까?
존 맥도날드

나는 power calc를 사용하여 내 자신의 질문에 대답했다. 내 표현 + (v / 2)를 취하면 주어진 v와 a에 대한 표현과 항상 같은 것으로 보입니다.
존 맥도날드

@ 존과 당신 덕분에, 이것은 나에게 많은 노력을 아끼지 않았을 것입니다! 더 간단하고 효율적이기 때문에이 답변을 수락하지만 John의 답변도 높이 평가됩니다. 건배!
Kaivosukeltaja

6

게임을 할 때 똑같은 문제가 있었으며 수학을 제대로 이해하는 데 영원히 걸렸습니다. 그래서 여기 있습니다 :

minDistanceToStop = 0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0);

정규 수학으로 다시 작성 :

(Acceleration / 2) * (linearVelocity / Acceleration)^2

귀하의 경우 가속이 1이고 linearVelocity가 10 인 경우 :

(1 / 2) * (10 / 1)^2
= 50 units to stop

편집하다

지미의 결과와 설명이 모두 맞습니다. 내 공식에는 속도의 절반도 추가해야합니다.

minDistanceToStop = (0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0)) + (velocityLinear() / 2);

또는

((Acceleration / 2) * (linearVelocity / Acceleration)^2) + (linearVelocity / 2)
((1 / 2) * (10 / 1)^2) + (10 / 2)
= 55

2
기록을 위해 Math.Pow ()는 끔찍하고 끔찍한 아이디어입니다. 그것은 할 수있다 특별한 경우는 스마트 충분하면 '2.0'지수,하지만 큰 승리해야한다 '0.5 * linearVelocity * linearVelocity / 가속'로 그 표현을 재 작성 당신이 그것을 슬라이스 어떤 방법을.
Steven Stadnicki

4

속도 변화에 대한 계산은 미적분의 전체 요점입니다. 나는 한동안 그것을하지 않았기 때문에 나는 머리 꼭대기에서 기억하지 못하지만, 당신의 상황은 단순히 -1의 정수 (즉, 감속)를 취하고 있다고 생각합니다.


0

이것이 일정한 가속 운동이 아닌가?

X = Xi + V*t + (1/2) * a * (t^2)


위치 : X : 마지막 위치
Xi : 초기 위치
V : 속도
t : 시간
a : 가속

여기서 가장 까다로운 부분은 "t"를 결정하는 방법입니다. -1의 가속으로 속도를 늦추고 t = V / a를 계산 한 다음 t는 10입니다.

따라서
Xi : 540
V : 10
t : 10
a : -1

모든 것을 착용하십시오 :

X = 540 + 10*10 + (1/2) * (-1) * (10 ^ 2) 
X = 540 + 100 + (-50) 
X = 540 + 50 
X = 590

공식은 가속도 통합을 통해 발생합니다. 여기서 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.