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 값을 받아오니 정상적으로 작동 되었다.


+ Recent posts