얼리버드(밤샘) 기상(아님)
오늘은 포병 유닛 추가하려고 포물선 운동에 대해 간단히 조사해봤다
https://ko.wikipedia.org/wiki/%ED%8F%AC%EB%AC%BC%EC%84%A0_%EC%9A%B4%EB%8F%99
포물선의 변인은 대충
1. 초기속도
2. 시간
3. 발사각
세 개를 가지고 시간에 따른 위치의 함수로 나타낼 수 있다
근데 내가 필요한 건 거리와 초기속도가 주어졌을 때 이를 만족하는 발사각임.
초기에 주어진 식
우측에 있는 건 시간 t에 따른 x축과 y축의 위치 그래프
이걸 y = 0으로 값을 주고 식을 변화시키면, 포물선이 도달했을 때의 시간 t가 나온다
그 시간 t를 고대로 위치 x에 대한 식에 집어넣으면 도달거리 d에 대한 식이 나온다
이 때 도달거리 d, 초기속도 v, 중력가속도 g는 모두 주어졌으니, 발사각만 구하면 된다.
2sin(발사각)cos(발사각) = sin(2*발사각) 공식으로 식을 간단하게 만들고
asin 씌워서 벗겨내면 발사각이 나온다.
이 때, 도달거리 d에 대한 발사각은 두 개가 나온다.
1. 발사각 (저각)
2. 90 - 발사각 (고각)
거기에 더해 거리 * 중력가속도 = 초기속력^2 * sin(2*발사각) 이라는 식에서
자연스럽게 타겟과의 거리는 초기속력^2 을 넘을 수 없다는 게 도출된다.
최대 사거리 = 초기속력^2
어찌저찌 발사각은 구했는데, 뭔가 부족하다.
일정 각도 이상 고각으로 발사하는 건 좋은데, 대상이 너무 가까우면 각이 너무 높아지는 문제가 발생함.
이를 막기 위해서 최소각 최대각을 미리 설정해야 했다.
그래서 sin(2*발사각) * 초기속력^2 / 중력가속도 를 최소거리로 설정했다.
이를 통해 타겟과의 거리가 저것보다 가까우면, 필요한 각이 너무 높다는 걸 확인할 수 있게 되었다.
어찌저찌 각도와 최소거리, 최대거리를 모두 계산했다.
그럼 이제 끝인가?
생각해보니 어떻게 발사할지를 생각을 해야만 했다.
일단 걍 RigidBody.AddForce(Forcemode.Impule) 를 사용하기로 했음.
그런데 이 때 Forcemode.Impulse가 쓰는 값은 무슨 값일까 해서 생각을 해보니 충격량일 것이라는 생각이 들었다.
이걸 보정해줘서
rb.AddForce(transform.forward * firePower * rb.mass, ForceMode.Impulse);
이렇게 박으면 포탄의 질량에도 대응할 수 있다.
물론 굳이 포탄 질량을 손 댈 일은 없을 것 같지만, 아무튼.
대충 테스트해봤다.
잘 된다.
초기속도는 20이고, 한계각은 20' ~ 70'로 줬다.
최소거리 최대거리 모두 잘 계산된다.
발사각도 제대로 측정된다.
아직 손 안 댄 문제도 있다.
1. 착탄까지의 시간을 결정할 수 없음. 정해진 시간 내에 도달하게 만들고 싶으면 꽤 많이 바꿔야 될 것 같음.
2. 발사높이와 착탄높이가 동일해야 함. 발사 높이와 착탄높이가 차이나면, 그 후부터는 등가속운동을 바탕으로 계산해야될듯.
그리고 실제로 유닛에 적용할 때는, 최대 사거리 최소 사거리를 직접 지정해주고 초기속도와 최소각도는 사거리를 기반으로 계산되게 할 거임.
대충 이런 식으로.
테스트 코드
그럼 안녕
댓글 5