본문 바로가기
vfxai 잡학지식 vfxai 잡학지식

바퀴가 거꾸로 도는 것처럼 보일 때: 차 속도와 바퀴 회전각 계산

vfx 잡학지식 읽는 시간 약 12분 조회 5

마차 바퀴 효과는 CG 차가 앞으로 가는데도 영상 속 바퀴가 멈추거나 거꾸로 도는 것처럼 보이는 현상입니다. 회전 방향을 잘못 준 걸까요, 프레임레이트를 바꿔야 할까요? 먼저 차 속도와 타이어 크기로 한 프레임 사이 회전각을 계산해 보세요. 이 글에서는 속도·바퀴 지름 또는 타이어 규격·프레임레이트·스포크 수로 겉보기 방향과 정지 속도를 구한 뒤 Blender 5.0 드라이버와 Maya expression에 연결합니다.

마차 바퀴 효과 계산기로 프레임별 회전을 비교하세요

차 속도는 km/h, 프레임레이트는 fps, 스포크 수는 개수로 입력하세요. 바퀴 크기는 지름(mm)으로 직접 입력하거나 225/45R17 같은 타이어 규격을 넣을 수 있습니다. 계산기는 실제 회전각과 같은 스포크 패턴이 다음 프레임에서 보이는 각도를 나란히 보여 줍니다.

바퀴 회전 샘플러

타이어 규격은 225/45R17, P225/60R16, LT235/85R16처럼 폭/편평비R림 지름 형식의 공칭 치수를 계산합니다. 뒤의 하중·속도 기호는 생략해도 됩니다. 실제 눌린 타이어의 유효 반지름과 다를 수 있습니다. 각도는 소수 둘째 자리까지 표시하며, 0.01°/frame 미만은 정지로 분류합니다.

실제 회전 · 기준 스포크 표시렌더 프레임 · 같은 스포크 패턴

왼쪽은 입력한 차 속도에 맞춰 연속 회전하고 기준 스포크를 표시합니다. 오른쪽은 입력한 fps의 각 프레임에서 같은 간격 스포크만 샘플링합니다. 프레임 슬라이더를 옮겨 각 프레임의 실제 각도와 겉보기 위상을 비교하세요. 계산과 그림은 스포크가 같은 간격으로 반복되는 바퀴를 전제로 합니다.

예를 들어 65 km/h, 225/45R17, 24 fps, 12개 스포크를 넣으면 타이어 지름은 634.3 mm, 반지름은 0.31715 m입니다. 이 조건에서 실제 바퀴는 한 프레임마다 약 135.91° 회전하지만, 같은 간격의 스포크 무늬는 약 14.09° 뒤로 이동한 것으로 보입니다.

같은 스포크 무늬는 360°가 아니라 한 칸마다 반복됩니다

스포크가 12개이고 모두 같은 모양이라면 한 칸의 각도는 360° ÷ 12 = 30°입니다. 바퀴를 30° 돌려도 다음 프레임에서 스포크 배열만 보면 같은 모양입니다. 실제 회전 전체가 아니라 스포크 사이 간격만큼 반복되는 무늬를 관찰하기 때문입니다.

65 km/h 예시의 실제 회전각 135.91°는 30° 간격의 4.53칸입니다. 두 프레임에서 가장 가까운 같은 스포크 위치를 비교하면 150° 앞으로 돈 경우와 같은 모양이 됩니다. 따라서 남은 변화는 135.91° − 150° = −14.09°입니다. 부호가 음수라서 프레임 사이에는 뒤로 움직인 것처럼 보입니다.

바퀴의 실제 회전이 멈춘 것은 아닙니다. 영상의 각 프레임이 바퀴를 정해진 시점에서 한 번씩 기록하고, 눈은 반복되는 무늬를 다음 프레임의 가장 가까운 위치와 맞춰 읽습니다. 이런 시간 표본화에서 반복 무늬가 실제와 다른 속도나 방향으로 보이는 현상을 시간 앨리어싱이라고 합니다. 바퀴가 멈추거나 거꾸로 보이는 사례를 마차 바퀴 효과라고 부르며, 스트로보 효과와 같은 표본화 원리로 설명할 수 있습니다.

프레임당 회전각은 속도와 반지름으로 구합니다

차 속도 v를 m/s로 바꾸고 프레임레이트로 나누면 한 프레임 동안 이동한 거리입니다. 그 거리를 바퀴 반지름 r로 나누면 회전각이 라디안으로 나옵니다. 도 단위가 필요하면 180/π를 곱합니다.

프레임당 실제 회전각(°) = (차 속도(km/h) ÷ 3.6 ÷ fps ÷ 반지름(m)) × 180 ÷ π
스포크 한 칸(°) = 360 ÷ 스포크 수
겉보기 회전각 = ((실제 회전각 + 한 칸/2) mod 한 칸) - 한 칸/2

타이어 규격이 225/45R17이면 폭은 225 mm, 편평비는 45%, 림 지름은 17인치입니다. 한쪽 사이드월 높이는 225 × 0.45 = 101.25 mm이고, 공칭 지름은 101.25 × 2 + 17 × 25.4 = 634.3 mm입니다. 계산기에서는 이 지름으로 둘레와 반지름을 구합니다.

이 치수는 타이어 규격에 적힌 공칭값입니다. 하중과 공기압으로 눌린 실제 타이어의 유효 반지름, 타이어 마모, 장면 스케일은 다를 수 있습니다. 휠이 바닥에서 미끄러지지 않는지까지 맞춰야 한다면 차가 한 프레임 동안 움직이는 실제 거리와 사용 중인 휠의 유효 반지름을 기준으로 확인하세요.

스포크 간격과 프레임레이트로 정지 속도를 찾습니다

스포크 한 칸이 30°라면 프레임마다 바퀴가 30°의 정수 배만큼 돌아갈 때 배열이 같은 위치에 도착합니다. 그래서 같은 무늬가 정지한 것처럼 보이는 속도는 하나가 아니라 여러 개입니다. 바퀴 둘레를 C, fps를 F, 스포크 수를 N, 정수 회전 칸 수를 k라고 하면 다음 식으로 구합니다.

멈춰 보이는 속도(km/h) = 둘레(m) × fps × k ÷ 스포크 수 × 3.6
k = 1, 2, 3, ...

225/45R17 타이어, 24 fps, 스포크 12개에서 처음 여섯 속도는 아래와 같습니다. 값은 규격으로 계산한 공칭 지름 634.3 mm를 썼으며, 소수 둘째 자리에서 반올림했습니다.

회전 칸 수 k멈춰 보이는 속도프레임당 실제 각도
114.35 km/h30°
228.70 km/h60°
343.04 km/h90°
457.39 km/h120°
571.74 km/h150°
686.09 km/h180°

57.39 km/h에서는 실제 바퀴가 매 프레임 120°씩 돌아도 12개 스포크 패턴은 네 칸을 건너 같은 위치로 돌아옵니다. 반대로 실제 회전각이 스포크 한 칸의 절반에 가까우면 다음 프레임에서 어느 방향으로 움직였는지 모호해집니다. 계산기는 정확히 절반인 경우 ‘방향 모호’로 표시합니다.

Blender 5.0 드라이버는 이동거리 ÷ 반지름을 씁니다

바퀴를 직선으로 굴릴 때 누적 이동거리 s를 반지름 r로 나누면 누적 회전각이 라디안으로 나옵니다. Blender의 회전 채널은 라디안 값을 받으므로 도 단위 변환을 덧붙이지 않습니다. Blender 기본 Z-up 좌표계에서 차가 +X 방향으로 이동하고 휠 축이 +Y를 향하는 예시입니다. 이때 바닥 접점은 -Z 쪽이므로 회전각은 양수이며, 모델의 축 방향을 반대로 잡았다면 부호를 바꾸세요.

회전각(rad) = 이동거리(m) / 반지름(m)
예: distance / 0.31715
  1. 휠의 회전축을 맞춘 뒤 회전 채널에서 우클릭해 Add Driver를 선택하세요.
  2. Drivers Editor에서 변수 하나를 추가하고, 차 이동을 나타내는 별도 컨트롤 오브젝트를 Transform Channel 변수의 대상으로 지정하세요. 직선 이동이면 전진 축의 Location을 고르고, 부모나 제약이 있는 리그라면 필요한 좌표계가 반영되는 World Space를 선택하세요.
  3. 드라이버 유형을 Scripted Expression으로 설정하고 표현식에 distance / 0.31715를 넣으세요. 이 예시는 반지름이 0.31715 Blender 단위이고 한 단위가 1 m인 씬을 가정합니다.
  4. 컨트롤 위치가 시작 프레임에서 0이 아니면 시작 위치를 빼서 이동거리 변화량만 계산하세요. 곡선 경로에서는 축 하나의 위치값 대신 경로를 따라 이동한 누적 거리를 써야 합니다.

Blender 5.0.0에서 별도 컨트롤 오브젝트의 X 이동 0.694444 m를 휠의 Y 회전 드라이버 변수로 연결하고 distance / 0.31715를 실행했습니다. 드라이버 값은 +2.1896391 rad로, 이동거리 ÷ 반지름의 기대값 +2.1896390 rad와 일치했습니다. Z-up에서 바닥 접점의 Y축 양의 회전은 -X 방향 접선 속도를 만들어 +X 이동과 반대가 되므로 부호도 맞습니다. 이 테스트는 단순 컨트롤과 휠 회전 채널에서의 확인이며, 완성된 차량 리그 전체를 검증한 것은 아닙니다.

Maya expression은 회전 단위와 축을 맞춥니다

Maya 예시는 차가 +Z 방향으로 움직이고 휠 회전축이 X인 경우입니다. 장면의 Angular Units가 Degree이고 Expression Editor의 Unit Conversion이 All 또는 Angular Only인 상태에서, 이동거리와 반지름을 같은 선형 단위로 입력하세요. 아래 반지름 31.715는 225/45R17의 공칭 반지름을 cm로 나타낸 값입니다.

float $radius = 31.715;
wheel.rotateX = -car.translateZ / $radius * 57.2957795;

차가 60 km/h로 움직이고 출력이 24 fps라면 한 프레임 이동거리는 0.694444 m, 즉 69.4444 cm입니다. 반지름 31.715 cm를 쓰면 식은 약 −125.46°를 회전 채널에 넣습니다. car.translateZ가 시작 프레임에서 0이 아니라면 초기 Z 위치를 빼서 이동 거리만 계산하고, 필요한 경우 초기 휠 회전 오프셋을 더하세요. Maya의 각도 단위가 radian이면 57.2957795를 곱하지 말고, 장면의 Angular Units와 Expression Editor의 Unit Conversion 설정을 확인하세요. 휠 축이나 차의 전진 축이 예시와 다르면 부호와 회전 채널을 바꿔야 합니다.

정답은 실제 회전과 프레임에서 보이는 회전을 나눠 계산하는 것입니다

처음 질문의 답은 이렇습니다. 실제 바퀴 회전은 이동거리 ÷ 반지름으로 맞추고, 멈춤이나 역회전은 프레임마다 본 스포크 무늬의 각도 차이로 판정하세요.

실제 회전을 화면에서 거꾸로 보인다고 드라이버 부호부터 바꾸면 타이어가 바닥에서 미끄러질 수 있습니다. 먼저 차의 이동거리와 반지름으로 회전을 맞춘 다음, 계산기에서 fps와 스포크 수를 넣어 샘플된 결과를 확인하세요. 촬영·출력 프레임레이트를 조정할 수 있다면 표본 간격이 달라지고, 고정된 프레임레이트에서는 실제 바퀴 무늬와 프레임 사이 각도 차이가 겉보기 방향을 정합니다.

계산기의 프레임 샘플은 모션 블러를 그리지 않습니다. 블러를 켰는데 회전 궤적이 끊기거나 각져 보이면 프레임 샘플링과 셔터 길이·모션 샘플 문제를 분리해 보세요. 모션블러 셔터 앵글과 표본 수를 확인하는 글에서 후자를 이어서 볼 수 있습니다.

한 줄 정리

마차 바퀴 효과가 보이면, 진짜 회전은 거리와 반지름으로 계산하고 화면의 방향은 스포크 간격과 프레임레이트로 따로 확인하세요.

참고 자료

vfx 잡학지식

함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.