벡터의 내적과 외적을 이용한 유도탄 스크립트입니다.


참고사항 - 해당 스크립트를 가진 객체는 발사된 총알(유도탄) 입니다.

매 시간(0.04초)마다 자신의 위치와 목표 위치를 비교하여 각도를 조금씩 트는 스크립트입니다.


    IEnumerator 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");
        }
        
    }


Vector3.Dot - 벡터의 내적을 구하는 함수로, 현재 스크립트에서는 총알의 윗방향(나아가는 방향) 과 목표물 방향의 벡터 사이의 내적을 구하고 있습니다.

  •  Mathf.Acos(dot) * Mathf.Rad2Deg 를 통해 내적을 각도 값으로 변환합니다. 
  •  이때 나온 각도는 딱 두 벡터의 각도를 의미합니다. 즉, 기준이 없습니다.
    • 예를 들어, up 과 left의 값도 90이고, up과 right의 값도 90입니다.


Vector3.Cross - 벡터의 외적을 구하는 함수로, 현재 스크립트에서는 내적과 마찬가지로 총알의 윗방향과 목표물 방향 벡터 사이의 외적을 구하고 있습니다.

  •  내적을 통한 각도값은 기준이 없기때문에 그냥 쓰면 계속 뺑뺑이 돕니다.... 그래서 외적을 통해 회전할 방향을 결정합니다.
  •  외적은 두 벡터와 직교하는 하나의 벡터를 구하는 의미로, 같은 두 벡터를 연산하더라도, 순서에 따라( 기준에 따라) 음수나 양수가 나올 수 있습니다. 이를 통해 각도의 방향을 구한 것입니다.



* 아래 영상은 위 코드를 활용해 만들었졌던 유도탄입니다.


Posted by 검은거북

블로그 이미지
프로그래밍 공부 요약 및 공부하며 발생한 궁금증과 해결과정을 포스팅합니다.
검은거북

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.7
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함