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) 이 될 것입니다!
사용 예시
- Bouncing Physics
- 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);
}
}