본문 바로가기
Programming/Math

[Math] 벡터의 내적, 외적

by Blemish 2022. 7. 9.
  • 백터의 내적과 외적을 이해한다.

 

덧셈

  • 백터의 덧셈은 각 스칼라의 값을 더해서 구할 수 있다. 

출처 나무위키

 

스칼라 곱셈

  • 스칼라의 값을 벡터의 각 스칼라의 곱한다.

출처 나무위키

 

내적

  • 내적은 교환 법칙, 분배 법칙이 성립된다.
  • 내적의 결과값은 실수 값이다.
  • 내적의 결과값이 양수이면 예각, 0 이면 직각, 음수면 둔각이다. 

출처 나무위키

 

외적

  • 외적의 결과값은 두 벡터의 수직이다.
  • 내적과 다르게 외적의 결과값은 벡터 값이다.
  • 외적은 교환 법칙이 성립되지 않는다. 또한 값을 변경하면 반대 방향의 벡터 결과가 나온다.
  • 외각의 크기는 평행사변형의 크기와 같다.
  • 두 벡터가 이루는 외적의 방향은 오른손 법칙이 적용되어 엄지 손가락이 가리키는 방향이다.


 

벡터의 내적을 활용하여 오브젝트가 나보다 앞에 있는지 뒤에 있는지 판별이 가능하고 캐릭터의 시야각 안에 오브젝트가 있는지 판별이 가능하다.

 

Cos x값이 x > 0 이면 캐릭터보다 물체가 앞에 있으며 x < 0 이면 뒤에 있다는 것을 의미한다.

또한 내적을 구하여 각도 x를 구하게 되면 캐릭터의 시야각 값이랑 비교하여 시야각 안에 존재하는지 판별할 수 있다.

    // Update is called once per frame
    void Update()
    {
        Collider[] colliders = Physics.OverlapSphere(transform.position, radius, layerMask);
        for (int i = 0; i < colliders.Length; i++)
        {
            Transform col = colliders[i].transform;
            float dist = (col.transform.position - transform.position).magnitude;
            //Vector3.Dot은 벡터의 내적을 구할 수 있는 함수이다.
            float angle = Vector3.Dot(transform.forward, col.transform.position - transform.position)
                            / dist * transform.forward.magnitude;

            Debug.Log(angle);

            float cos_angle = Mathf.Acos(angle) * Mathf.Rad2Deg;
            Debug.Log(cos_angle);

            float v = Vector3.Angle(transform.forward, col.position - transform.position);
            Debug.Log(v);
        }
    }

1. 범위 내의 콜라이더를 탐지한다.

2. 콜라이더와 캐릭터의 거리를 계산하여 벡터의 길이를 구한다.

3. Vector3.Dot을 사용하여 벡터의 내적을 구한다. 

4. 벡터의 내적을 구하는 공식을 활용하여 angle을 구한다.

5. angle의 값이 0보다 크면 앞 작으면 뒤로 판별이 가능하다

6. Cos 값을 활용하여 캐릭터 기준에서 물체와의 각도를 구할 수 있다.

7.  cos_angle의 값과 동일하게 구할 수 있는 Vetor3.Angle이 있으므로 활용하는 것이 좋다.

 


출처

https://namu.wiki/w/%EB%B2%A1%ED%84%B0

https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%EC%88%98%ED%95%99-%EC%9D%B4%ED%95%B4/unit/75048?tab=curriculum

댓글