intersect 판정 (hasIntersected)

jumper의 아랫면과 platform의 윗면의 충돌 판정을 하고 싶었음

각각의 위치정보는 객체의 중앙을 저장하고 있어서 다음 수식을 통해 intersect 판정을 해주었음

jumper의 $x, z$ 좌표를 $x_j, z_j$, platform의 $x, z$ 좌표를 $x_p,z_p$라고 하고

jumper와 platform의 width를 각각 $W_J, W_P$, platform의 depth를 $D_P$라고 할 때 다음 알고리즘을 따라서 intersect 결과를 return한다.

$$ \begin{aligned} & X=x_j-x_p \\& Z=z_j-z_p \\& l = \frac{W_J}{2}+\frac{W_P}{2} \\& \textrm{if } -l<X<l \,\textrm{ and } -D_P < Z < 0 \textrm{ return true} \\& \textrm{else return false} \end{aligned} $$

이와는 별개로 $v_z>0$ 이라면 항상 return false를 해서 platform을 위에서 뚫을 수는 있으나 위에서는 그 위에 착지할 수 있게 했다.

중력 적용 (jumperUpdate)

$v_z,a_z$ 2개의 변수를 통해 중력을 구현하였음

onPlatform이 true일 때는 $v_z=0$으로 설정하고 false일 때는 $a_z$를 빼줌

플랫폼 위에서 움직이기 (Display of virtualLego)

모든 플랫폼과 hasIntersected 진행함

hasIntersected에서 true가 반환되면 $v_z=0$으로 설정해주고, firstTouch이면 해당 플랫폼의 index를 whereIdx에 저장

whereIdx를 저장하는 이유 : 다른 플랫폼과 hasIntersected를 판정하면 항상 false인데, 이 경우 onPlatform이 false가 되어버려서 공중에 있는 판정이 되는 시간이 있었음. 그래서 정상적으로 플랫폼 위에 서있어도 $v_z$가 변화해서 플랫폼을 서서히 뚫고 내려가는 버그가 있었음

firstTouch는 좌우 이동 시 플랫폼을 벗어나는가 판단하기 위해서 넣어줬음. 이게 없을 땐 점프가 아닌 좌우 이동으로 플랫폼을 벗어날 시 쭉 미끄러지는 버그가 있었음