유니티 Vector3.Reflect

Vector3 incoming = new Vector3(1, 1, 0);
Vector3 normal = new Vector3(0, 1, 0);
Vector3 normal_flipped = new Vector3(0, -1, 0);
Vector3 reflected = Vector3.Reflect(incoming, normal);
Vector3 reflected_flipped = Vector3.Reflect(incoming, normal_flipped);
Debug.Log(reflected); // Output: (1, -1, 0)
Debug.Log(reflected_flipped); // Output: (1, -1, 0)

Vector3.Reflect란?

지정된 법선을 사용하여 표면을 벗어난 벡터의 반사를 계산합니다. Reflect 함수는 두 가지 인수를 사용합니다.

  • inDirection: 반영하려는 들어오는 벡터의 방향입니다.
  • inNormal: 입력 벡터가 반사될 표면의 법선 벡터입니다.

결과는 표면에서 반사된 새로운 벡터입니다!


 

예제

Vector3 incoming = new Vector3(1, 1, 0);
Vector3 normal = new Vector3(0, 1, 0);
Vector3 normal_flipped = new Vector3(0, -1, 0);
Vector3 reflected = Vector3.Reflect(incoming, normal);
Vector3 reflected_flipped = Vector3.Reflect(incoming, normal_flipped);
Debug.Log(reflected); // Output: (1, -1, 0)
Debug.Log(reflected_flipped); // Output: (1, -1, 0)

시각자료

위 예시 코드를 보면 incoming은 (1,1)입니다.

normal(법선벡터)은 (0,1) 혹은 (0,-1) 입니다. 두 법선 벡터는 Reflect할 때 동일한 결과를 생성하는데, 이는 Reflect될 때 법선 벡터에 수직인 평면에 대해 대칭이기 때문에 법선 벡터의 방향을 뒤집어도 결과가 변경되지 않습니다!

따라서, reflect된 벡터는 (1,-1)이 되는 것입니다!

 

법선벡터가 (1,0) 혹은 (-1,0)이 된다면 결과는 (-1,1) 이 될 것입니다!


사용 예시

  1. Bouncing Physics
  2. Mirror Effects
public class BouncingBall : MonoBehaviour
{
    public float speed = 10f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        rb.velocity = transform.forward * speed;
    }

    void OnCollisionEnter(Collision collision)
    {
        Vector3 normal = collision.contacts[0].normal;
        Vector3 reflectedVelocity = Vector3.Reflect(rb.velocity, normal);
        rb.velocity = reflectedVelocity;
    }
}
public class MirrorEffect : MonoBehaviour
{
    public Transform originalObject;
    public Transform mirrorObject;

    void Update()
    {
        Vector3 relativePos = originalObject.position - transform.position;
        Vector3 mirroredPos = Vector3.Reflect(relativePos, Vector3.forward);
        mirrorObject.position = transform.position + mirroredPos;

        mirrorObject.rotation = Quaternion.LookRotation(Vector3.Reflect(originalObject.forward, Vector3.forward), Vector3.up);
    }
}