날 공격한 녀석이 뒤에서 때렸니 앞에서 때렸니??
Programing/게임에 적용 해보는 수학 2012. 5. 17. 15:15 |어느 날 기획자가 공격자가 피격자 뒤에서 공격 하면 데미지를 더 준다 던지
명중률이 더 올라간다던지 피격자가 등 뒤에서 맞았는지 앞에서 맞았는지 요구 한다.
1 ) 피격자의 시야각을 설정한다.
2 ) 피격자와 공격자의 위치를 안다.
3 ) 피격자의 방향벡터를 안다.
이 세 가지만 알면 해결 할 수 있다.
모 피격자의 시야각은 xml로 뺀다든지 해서 기획자가 고칠 수 있게 해주자.
피격자 시야 각 120도
O : 피격자
A,B,C : 공격자
우선 O와 A,B,C의 위치를 알기 때문에
피격자와 공격자의 위치를 빼주면 피격자와 공격자 사이의 위치 벡터가 생긴다.
피격자의 방향벡터도 안다.
A - O = T1
B - O = T2
C - O = T3
피격자 방향 벡터 = T4
자 이제 피격자가 공격받은 방향을 판단 할 수 있는 기본 정보가 다 모였다.
내적의 성질을 이용하면 된다.
시야각이 120이 되어있는데 딱 절반으로 나두면 된다. 그럼 60도 가 나온다.
절반으로 나눈 이유는
내적했을 때 0-90도 360-270도, 90-180도 270-180도 대칭 값이다.
무슨 말이 냐면 45도나 315도를 내적하면 0.7071....이라는 같은 값이 나온다.
그러면 그냥 315도를 45도라 생각하면 된다. 이 성질을 이용하면
120도가 다 필요없다 딱 나눠서 60을 이용하면 된다.
결론
cos(60) = 0.5
if( 0.5 > 피격자 방향벡터 · 피격자와 공격자의 방향벡터 )
앞에서 맞았음
else
뒤어서 맞았음
이렇게 된다.
0.5 > T1 · T4 = 거짓 (뒤)
0.5 > T2 · T4 = 참 (앞)
0.5 > T3 · T4 = 참 (앞)
'Programing > 게임에 적용 해보는 수학' 카테고리의 다른 글
네발 달린 동물이 지형을 걷다. (0) | 2012.05.17 |
---|