후들후들

foodybug.egloos.com

포토로그



drag가 적용된 Rigidbody의 이동 궤도를 예측하는 코드 Unity


포트리스같은 게임을 구현할 때 발사된 강체의 궤도를 미리 예측해서 보여줘야 하는 상황이 있습니다.



아래와 같이 프레임당 위치를 구할 수 있습니다.

List<Vector3> list = new List<Vector3>();
float unitTime = 1f / 50f; //초당 50프레임으로 계산
int steps = 50 * 10; // 10초 계산(총 500프레임)
for (int i = 0; i < steps; i++) {
velocity.y += Physics.gravity * unitTime; 
position += velocity * unitTime;
list.Add(position);
}


하지만 공기의 저항같은 상황을 구현하려면 drag를 이용해야 합니다.

위의 코드는 강체의 drag값이 0일 경우에만 해당합니다.

강체의 drag가 크면 시간이 지날수록 강체의 속도는 더욱 빠르게 느려집니다.


List<Vector3> results = new List<Vector3>();
Vector3 pos = origin;

float timestep = Time.fixedDeltaTime * Physics.defaultSolverVelocityIterations; // 실제 단위시간
Vector3 gravityAccel = Physics.gravity * timestep * timestep; // 단위시간당 중력가속도
float drag = 1f - timestep * rbBall.drag; // 실제 적용될 저항값
Vector3 moveStep = velocity * timestep; // 단위시간당 이동량

for (int i = 0; i < steps; ++i)
{
moveStep += gravityAccel;
moveStep *= drag;
pos += moveStep;
results.Add(pos); // 실제 경로 저장
}


위의 코드를 살펴보면 중력가속도가 적용된 moveStep에 drag가 곱해짐을 알 수 있습니다.

이것은 drag가 클수록 낙하하는 속도도 느려진다는 것을 의미합니다.

경험상 drag는 2를 넘어가면 강체의 낙하속도가 금방 느려져서 매우 비현실적으로 느껴졌습니다.

(우주 공간 같은 느낌을 원하신다면 오히려 좋을 수도 있습니다.)

개인적으로 1을 넘지 않도록 하는 편입니다.




덧글

댓글 입력 영역