Kinematic Rigidbody에서 Velocity Vector 값 얻기
[스토리]
유니티에서 두 Object의 충격량을 계산하기 위해선 각 Obejct가 Kinematic아닌 Rigidbody를 가지고 있어야 한다.
하지만 현재 개발중인 VR탁구 게임에서 탁구채는 Kinematic으로 구현되어 있다.
(탁구채가 공에 맞았을 때 날아가거나 떨어지면 안되기 때문 == 물리력을 받으면 안된다.)
따라서 오늘은 Kinematic Rigidbody에서 Velocity Vector를 얻는 작업이 필요하다.
* 무의미한 참고) 현재 탁구채는 TrackedObject의 좌표를 받아 rigidbody.MovePosition(VRController.transform.position), rigidbody.MoveRotation(VRController.transform.rotation)으로 움직이고 있다.
1. 설계
당연하겠지만 Kinematic Rigidbody를 Component로 가지고 있는 GameObject의 Velocity를 받아 출력한다면
Zero Vector가 나올 것이다. 그렇다면 우리는 속도를 구하는 물리식을 활용해야 한다.
Step 1) V(속도) = S(거리) / T(시간)
Step 2) V = rigidbody.velocity, S = transform.position - prePosition, T = Time.deltaTime
Step 2) rigidbody.velocity = (transform.position - prePosition) / Time.deltaTime;
생각보다 간단하게 코드로 물리식을 구현할 수 있음을 확인할 수 있다.
2. 소스코드
1 2 3 4 | private void Start() { oldPosition = transform.position; } | cs |
1 2 3 4 5 6 7 8 9 | private void Update() { currentPosition = transform.position; var distance = (currentPosition - oldPosition); velocity = distance / Time.deltaTime; oldPosition = currentPosition; Debug.Log($"Kinematic Object's Velocity: {velocity}"); } | cs |
3. Debug
- Update 대신에 FixedUpdate를 사용했더니 Object가 움직이고 있음에도 불구하고 높은 빈도로 Velocity가 Zero일 때가 발생.
위 참고에서 Object가 MovePosition, MoveRotation으로 움직이고 있는데, 이 움직임은 Update함수로 작동된다. 하지만 FixedUpdate가 Update주기의 2배로 돌게 되면서 비정상적인 값을 가져오게 되었다.
→ Update함수에서 Velocity 값을 받아오니 정상적으로 작동 되었다.
'C# Unity3D' 카테고리의 다른 글
[Physics] 빠르게 움직이는 Object의 충돌 감지 (0) | 2019.03.22 |
---|---|
[Physics] Cast에 관해서 Gizmo 그리기 (0) | 2019.03.19 |
[Physics] 마그누스 효과, 공기저항 적용하기 (0) | 2019.03.14 |
[Physics] Raycast를 활용한 충돌감지 (0) | 2019.03.13 |
[Animation] Blend Tree를 활용한 단계별 움직임 적용 (0) | 2019.03.12 |