얼리버드(밤샘) 기상(아님)

반가워


오늘은 포병 유닛 추가하려고 포물선 운동에 대해 간단히 조사해봤다


https://ko.wikipedia.org/wiki/%ED%8F%AC%EB%AC%BC%EC%84%A0_%EC%9A%B4%EB%8F%99

viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cea8efa11d02831743ce42f276e54fea8bfbfa8995c18da39371325f4c1c87668ae4214ed57eb7cf02304d481676995aec66f4644a704d7a8de86


포물선의 변인은 대충

1. 초기속도

2. 시간

3. 발사각

세 개를 가지고 시간에 따른 위치의 함수로 나타낼 수 있다


근데 내가 필요한 건 거리와 초기속도가 주어졌을 때 이를 만족하는 발사각임.



viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cea8efa11d02831743ce42f276e54fea8bfbfa8995c18da39371325f4c1c87668ae42798055eb75ab811b9647b30e6e87297dad7ddcba7382c68f24

초기에 주어진 식

우측에 있는 건 시간 t에 따른 x축과 y축의 위치 그래프


이걸 y = 0으로 값을 주고 식을 변화시키면, 포물선이 도달했을 때의 시간 t가 나온다



viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cea8efa11d02831743ce42f276e54fea8bfbfa8995c18da39371325f4c1c87668ae42798055eb75ab811b9647b30e6e857a2efc2489b921d9d49025

그 시간 t를 고대로 위치 x에 대한 식에 집어넣으면 도달거리 d에 대한 식이 나온다


이 때 도달거리 d, 초기속도 v, 중력가속도 g는 모두 주어졌으니, 발사각만 구하면 된다.


2sin(발사각)cos(발사각) = sin(2*발사각) 공식으로 식을 간단하게 만들고

asin 씌워서 벗겨내면 발사각이 나온다.


이 때, 도달거리 d에 대한 발사각은 두 개가 나온다.

1. 발사각 (저각)

2. 90 - 발사각 (고각)


거기에 더해 거리 * 중력가속도 = 초기속력^2 * sin(2*발사각) 이라는 식에서

자연스럽게 타겟과의 거리는 초기속력^2 을 넘을 수 없다는 게 도출된다.


최대 사거리 = 초기속력^2


어찌저찌 발사각은 구했는데, 뭔가 부족하다.

일정 각도 이상 고각으로 발사하는 건 좋은데, 대상이 너무 가까우면 각이 너무 높아지는 문제가 발생함.


이를 막기 위해서 최소각 최대각을 미리 설정해야 했다.


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cea8efa11d02831743ce42f276e54fea8bfbfa8995c18da39371325f4c1c87668ae42798055eb75ab811b9647b30e6ed77f74ad20d9b173f03fd406


그래서 sin(2*발사각) * 초기속력^2 / 중력가속도 를 최소거리로 설정했다.

이를 통해 타겟과의 거리가 저것보다 가까우면, 필요한 각이 너무 높다는 걸 확인할 수 있게 되었다.


어찌저찌 각도와 최소거리, 최대거리를 모두 계산했다.

그럼 이제 끝인가?


생각해보니 어떻게 발사할지를 생각을 해야만 했다.


일단 걍 RigidBody.AddForce(Forcemode.Impule) 를 사용하기로 했음.


그런데 이 때 Forcemode.Impulse가 쓰는 값은 무슨 값일까 해서 생각을 해보니 충격량일 것이라는 생각이 들었다.



viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cea8efa11d02831743ce42f276e54fea8bfbfa8995c18da39371325f4c1c87668ae42798055eb75ab811b9647b30e6ed52a7ef17c83b17059564abf


이걸 보정해줘서

rb.AddForce(transform.forward * firePower * rb.mass, ForceMode.Impulse);

이렇게 박으면 포탄의 질량에도 대응할 수 있다.


물론 굳이 포탄 질량을 손 댈 일은 없을 것 같지만, 아무튼.



대충 테스트해봤다.

잘 된다.



3dbcc227e7dd34a73ff1c6bb11f11a391829b5df3d62f5

초기속도는 20이고, 한계각은 20' ~ 70'로 줬다.



3dbcc227e7dd34a720afd8b236ef203e96c6f43447f0cf

최소거리 최대거리 모두 잘 계산된다.

발사각도 제대로 측정된다.


아직 손 안 댄 문제도 있다.

1. 착탄까지의 시간을 결정할 수 없음. 정해진 시간 내에 도달하게 만들고 싶으면 꽤 많이 바꿔야 될 것 같음.

2. 발사높이와 착탄높이가 동일해야 함. 발사 높이와 착탄높이가 차이나면, 그 후부터는 등가속운동을 바탕으로 계산해야될듯.


그리고 실제로 유닛에 적용할 때는, 최대 사거리 최소 사거리를 직접 지정해주고 초기속도와 최소각도는 사거리를 기반으로 계산되게 할 거임.

2ebcc224eadc78ee3fe69ffb06df231d17e4cc8c2b805c1ff645

대충 이런 식으로.



2ebcc224eadc78ee3fe79ffb06df231d1e93dfd7e38496e525a498

테스트 코드


그럼 안녕

25