유도탄 (내적 + 외적)
Unity3D 2020. 11. 25. 00:24IEnumerator followTarget(GameObject _obj)
{
if (_obj != null)
{
while (gameObject.activeSelf)
{
Vector3 target = (_obj.transform.position - transform.position).normalized;
// 내적(dot)을 통해 각도를 구함. (Acos로 나온 각도는 방향을 알 수가 없음)
float dot = Vector3.Dot(transform.up, target);
if (dot < 1.0f)
{
float angle = Mathf.Acos(dot) * Mathf.Rad2Deg;
// 외적을 통해 각도의 방향을 판별.
Vector3 cross = Vector3.Cross(transform.up, target);
// 외적 결과 값에 따라 각도 반영
if (cross.z < 0)
{
angle = transform.rotation.eulerAngles.z - Mathf.Min(10, angle);
}
else
{
angle = transform.rotation.eulerAngles.z + Mathf.Min(10, angle);
}
// angle이 윗 방향과 target의 각도.
// do someting.
}
yield return new WaitForSeconds(0.04f);
}
}else
{
Debug.Log("Check Target : target is null");
}
}
벡터의 내적과 외적을 이용한 유도탄 스크립트입니다.
참고사항 - 해당 스크립트를 가진 객체는 발사된 총알(유도탄) 입니다.
매 시간(0.04초)마다 자신의 위치와 목표 위치를 비교하여 각도를 조금씩 트는 스크립트입니다.
Vector3.Dot - 벡터의 내적을 구하는 함수로, 현재 스크립트에서는 총알의 윗방향(나아가는 방향) 과 목표물 방향의 벡터 사이의 내적을 구하고 있습니다.
Mathf.Acos(dot) * Mathf.Rad2Deg 를 통해 내적을 각도 값으로 변환합니다.
이때 나온 각도는 딱 두 벡터의 각도를 의미합니다. 즉, 기준이 없습니다.
예를 들어, up 과 left의 값도 90이고, up과 right의 값도 90입니다.
Vector3.Cross - 벡터의 외적을 구하는 함수로, 현재 스크립트에서는 내적과 마찬가지로 총알의 윗방향과 목표물 방향 벡터 사이의 외적을 구하고 있습니다.
내적을 통한 각도값은 기준이 없기때문에 그냥 쓰면 계속 뺑뺑이 돕니다.... 그래서 외적을 통해 회전할 방향을 결정합니다.
외적은 두 벡터와 직교하는 하나의 벡터를 구하는 의미로, 같은 두 벡터를 연산하더라도, 순서에 따라( 기준에 따라) 음수나 양수가 나올 수 있습니다. 이를 통해 각도의 방향을 구한 것입니다.
* 아래 영상은 위 코드를 활용해 만들었졌던 유도탄입니다.
'Unity3D' 카테고리의 다른 글
유니티 좌표계 (0) | 2020.11.27 |
---|---|
외적 활용 (좌우 알아내기, 문의 앞뒤 알아내기) (0) | 2020.11.25 |
unity skill indicator shader (0) | 2020.11.24 |
Vector3.Dot (내적) (0) | 2020.11.24 |
TransformDirection, InverseTransformDirection, TransformPoint, InverseTransformPoint (0) | 2020.11.24 |