워크래프트3 로 투사체를 구현하려면,
유닛을 생성 후 더미로 만들어 추가적인 라이브러리를 이용해 충돌 판별을 하는데
작동이 무겁고 구현도 까다로운 단점이 존재함
이 라이브러리는 그러한 단점을 극복하기 위해 다음 과 같은 개선점을 가짐
- 함수 한줄로 끝내는 효율성
- 이펙트 기반이라 가벼움
간단하게 일직선으로 날라가는 기본 투사체
투사체가 땅으로 떨어지는 포물선 투사체임
해당 투사체는 위 수식을 통해 구현됨
구현은 위와 같음
가속도 수식
한 축에 대해서, 속도 v에 대해서 동일 거리를 움직이려면 2v/t 만큼 가속도를 줘야함
만약 미리 설정된 상수가 존재한다면, a에 대한 수식은 위와 같음
위 gif 처럼 각 축별로 독립적인 운동을 설정하고 이를 결합하면
꽤나 괜찮은 투사체 궤도를 얻을 수 있음
4엽장미 극좌표 함수를 응용해서 구현
아르키메데스 나선이라 불리는 극좌표 함수를 응용해서 구현
기본적으로는 위 그림과 같음,
atcos t , atsin t 형식으로 커스텀하면 크기를 조절할 수 있고, t값을 조절하면 돌 회전수도 조절 가능함
여기에 z축 운동까지 추가하면
꽤 멋있는 투사체 궤도가 나옴
이런식으로 응용해서 사용 가능함
애니메이션에 나오는 건담 미사일 같은걸 구현하고 싶었음
일단 공간좌표 2개를 잡아봅시다
출발점은 (origin_x, origin_y, origin_z) 이고
도착점은 (end_x, end_y, end_z) 입니다
그리고 두 좌표를 기반으로 커스텀 좌표축을 만듭니다
실제로 만드는건 아닌데, 마치 해당 좌표축인 것 마냥 여긴다는 겁니다, 가상 좌표축입니다
축 z1 은 출발점 도착점을 이용해서 벡터 표현하고
축 z2는 절대좌표축z 와 z1의 벡터외적
축 z3는 z1과 z2의 외적입니다
실제 연산이 아닌 개념상 정의
z1 z2 z3 축 유의해서 봐주세요
절대 좌표계 에서 보면 이런 모양이겠죠
대충 밑바탕은 이렇게 잡고 갑니다
커스텀 좌표축에서
해당 궤도의 미사일은 위 수식과 같음, 3축 가속도 투사체와 같음
z2, z3 축의 값은 0에서 출발해서 0으로 되돌아옵니다
z1 축은 0에서 출발해서 지정된 거리에 도착합니다
그러면 가속도 값을 구하기 위해서 다음과 같은 식이 됩니다
이걸 정리하면 아래와 같은 식이 됩니다
코드 상에서는 위와 같이 구현됩니다
가속도를 구하면 이제 이걸로 시간에 따른 위치를 구할 수 있습니다
코드로 구현하면 위와 같습니다
이제 커스텀 좌표축에서의 미사일 연출은 끝났습니다
투사체의 커스텀 좌표축 벡터함수는 위와 같습니다
이 함수를 절대 좌표로 변환하려면 아래와 같은 연산을 거쳐야합니다
그렇다면 M은?
우리는 출발점과 도착점을 이용한 가상 좌표축이 얼마나 회전되어있는지를 계산 할 수 있습니다
그렇다면 역회전 변환 행렬을 이용해서 M을 계산해낼 수 있습니다
회전 각도를 구하기 위한 각종 값들은 위 그림을 통해서 시각적으로 파악 할 수 있습니다
angle 은 어차피 사전에 주어진 값이라 의미 없고
pitch 값을 구해야하는데 이는 dist와 출발점과 도착점의 z값의 차이로 구할 수 있습니다
구현은 위 그림과 같습니다
우리가 가상으로 가정한 커스텀 좌표계는
절대 좌표계를 z축 기준으로 angle 만큼 회전하고, y축 기준으로 pitch 만큼 회전하면 구할 수 있습니다
그렇다면, 이걸 역으로 표현하면 커스텀 좌표계로부터 절대 좌표계를 구할 수 있습니다
우리가 원하는 커스텀 좌표계 -> 절대 좌표계
회전변환이 되는 것입니다
회전 변환 행렬은 아래와 같습니다
우리가 구하려는 M은 다음과 같습니다
코드로 구현하면 위 그림과 같습니다
이제 M도 구했으니 최종 절대좌표를 구할 수 있습니다
구현은 위와 같습니다
각도 고려 없이 미사일 함수를 제작할 경우,
리본이나 구형 구체는 괜찮지만, 검 같은 각도가 중요한 모델로 미사일을 만들면
궤도를 따라 이동하기는하나, 모델 각도가 고정되어있어서 위 그림처럼 단점이 도드라져 보임
정석은, 각 투사체 함수의 벡터함수 궤도를 정의하고,
미분 및 정규화를 통해 속도벡터를 얻어야 투사체의 각도를 구할 수 있음
하지만 이 방법은 두 가지 문제가 있음
- 궤도가 까다롭고 어려울 경우, 구현 자체가 어려움
- 구현 하더라도 연산량이 비쌈
그래서 이 문제를 해결하려면 수치 미분 방법을 써야함
투사체는 0.02초씩 이동하므로 꽤나 괜찮은 근사를 할 수 있음
이 방법의 장점은
아무리 어려운 궤도라도 쉬운 구현이 가능하고,
그리고 모든 투사체 함수가 해당 방법을 쓰므로 재사용성도 높음
수치 미분
그래프로 보면, 이 방법에 대해서 좀 더 직관적으로 이해할 수 있음
수치 미분 투사체 각도를 구하는 수식은 위와 같음
구현은 위와 같음
각 궤도함수 구현에
해당 함수콜 한번씩만 해주면 궤도 맞춰서 투사체 각도 조정됨
미적용
적용
미적용
적용
미적용
적용

























