개요
요즘 회사를 다니면서 유니티를 소홀히 하는것 같아 유니티로 시뮬레이터를 만들어보기로 했다.
기능 구현 중 오랜만에 반사벡터를 구하게 돼 복습할 겸 기록한다.
반사 벡터
Reflect Vector: 입선벡터, 법선벡터를 이용하여 특정 사물에 부딪혔을때 반사각 계산하는 벡터
수학 공식은 아래와 같음
R = P + 2n(-P*n)
R: 반사벡터
P: 입선벡터
n: 법선벡터
코드
public float speed = 5f;
private Rigidbody2D rb;
Vector2 direction;
void Start()
{
rb = GetComponent<Rigidbody2D>();
rb.freezeRotation = true;
direction = Random.insideUnitCircle.normalized;
rb.linearVelocity = direction * speed;
}
void OnCollisionEnter2D(Collision2D collision)
{
Vector2 incomingVec = direction;
incomingVec = incomingVec.normalized;
Vector2 normalVec = collision.contacts[0].normal;
Vector2 reflectVec = Vector2.Reflect(incomingVec, normalVec);
reflectVec = reflectVec.normalized;
direction = reflectVec;
rb.linearVelocity = direction * speed;
}
일단 초기값으로 Rigidbody를 사용하여 랜덤한 방향으로 이동하는 코드를 Start에 구현하였다
방향은 충돌할때마다 입선벡터로 사용해야하기에 변수로 지정하여 관리했다
- Vector2 incomingVec: 입사각을 저장한다, 정규화하여 크기를 1로 한다
- Vector2 normalVec: 법선벡터를 가져온다 (충돌면 수직 방향을 의미한다)
- Vector2 reflectVec: 반사벡터를 구한다, 정규화하여 크기를 1로 한다
결과
고놈참 시원하게 잘 튀는구나
뭔가 멍때리고 보게되는 장면이 나왔다.
벽 뿐만 아닌 구체들끼리도 반사벡터를 구해서 잘 반영하는 모습을 볼 수 있다.