승용차의 타이어를 이동에 맞춰 자동으로 회전시키는 리그와 이를 위한 도구를 Claude로 제작했습니다. 타이어에 키를 입력할 필요가 없으며, 주행 속도나 타이밍을 나중에 변경해도 회전은 자동으로 따라갑니다.
타이어 자동 회전 자체는 잘 알려진 기법입니다. 다만, 반지름이나 커브의 길이를 측정하여 공식에 넣고 리그가 바뀔 때마다 수정하는 작업은 번거롭습니다. 그래서 측정과 익스프레션(Expression) 작성을 통합한 GUI 도구인 'Car Wheel Rig Tool'을 만들었습니다.
작동 확인은 Maya 2026에서 진행했습니다.
타이어의 회전 각도는 전진 거리가 타이어 원주(1회전 길이)의 몇 배인지에 따라 결정됩니다.
- 원주 = 반지름 × 2 × 3.14
- 회전수 = 전진 거리 ÷ 원주
- 회전각(도) = 회전수 × 360
예시: 반지름이 30인 타이어의 경우, 원주는 30 × 2 × 3.14 = 188.4입니다.
회전각 = 전진 거리 ÷ (반지름 × 2 × 3.14) × 360
전진 거리는 차량을 움직이는 방식에 따라 달라집니다.
| 움직임 방식 | 전진 거리 |
|---|
| Transform(직선적으로 움직일 때) | 이동한 양 그대로 (예: translateZ) |
| Motion Path(커브를 따라 움직일 때) | uValue × 커브 길이 |
Motion Path의 uValue는 Parametric Length가 ON 상태일 때 0~1 사이의 값으로, 전체 커브에 대한 진행 비율입니다. 거리 그 자체가 아니기 때문에, 커브 길이를 곱하여 실제 거리로 변환합니다. 예를 들어, 커브 길이가 1000이고 uValue가 0.25라면, 전진 거리는 250이 됩니다.
위의 계산을 익스프레션으로 작성하면 다음과 같은 형태가 됩니다.
반지름과 커브 길이에는 측정된 값이 들어갑니다.
Transform으로 움직일 경우 :
FrontWheel_L_r.rotateX = 360 * (Car_GP.translateZ / (2 * 3.14159265 * 반지름));
Motion Path로 움직일 경우 :
FrontWheel_L_r.rotateX = 360 * ((motionPath1.uValue * 커브 길이) / (2 * 3.14159265 * 반지름));
스티어링용 _h 내부에 구름(rolling)용 _r을 중첩시키는 것이 이 리그의 핵심입니다.
후륜은 핸들로 방향을 바꾸지 않으므로, 좌우 2바퀴를 하나의 메쉬로 합치고, _h가 없는 BackWheel_r만 회전시킵니다.
후륜 처리는 일반적인 승용차의 경우입니다. 후륜도 조향하는 차량이나 지게차처럼 후륜으로 조향하는 차량이라면, 후륜에도 _h를 붙여주세요.
타이어마다 로케이터(Locator)를 만들고 차축 중심에 배치합니다 (Rotate 0 / Scale 1). 최상위 그룹과 차량 메쉬는 Car_GP와 Car처럼 다른 이름으로 지정해 주세요.
Car_GP의 피벗 위치는 후륜 중앙에 두어야 합니다. Motion Path가 커브를 따라 움직이는 것은 피벗의 위치입니다. 따라서 후륜이 커브를 그리게 되어, 후륜의 미끄러짐을 줄일 수 있습니다.
MotionPath로 움직일 경우에는 도구를 사용하기 전에 Motion Path를 추가하여 Car_GP를 주행하는 상태로 만들어 두어야 합니다.
Parametric Length 상태 확인: Attribute Editor의 motionPath 탭에서 U Value 아래에 있는 'Parametric Length'를 확인합니다.
Parametric Length 상태에 따라 uValue의 의미가 달라집니다. 도구의 'uValue 변환(Conversion)'은 이 상태에 맞춰 선택해야 합니다.
| Parametric Length | uValue의 의미 | 도구의 'uValue 변환' |
|---|
| ON (Fraction Mode가 ON) | 커브 길이 대비 비율 (0~1) | 비율(0~1) 그대로 사용 |
| OFF | 커브의 파라미터 값 (범위는 커브마다 다름, 예: 0~10) | 대응표를 통해 정확하게 변환 (권장) |
어떤 상태이든 도구는 uValue 키(애니메이션)를 변경하지 않고 계산할 수 있습니다.
① '측정'을 누르면, 상태에 맞춰 'uValue 변환'이 자동으로 전환됩니다.
이미 uValue에 키를 이미 설정한 경우에는 Parametric Length 체크박스를 나중에 변경하지 마십시오. 키 값의 의미가 바뀌면 차량의 움직임이 달라집니다. 설정을 바꾸지 않은 채, 툴의 'uValue 변환'을 현재 상태에 맞게 조정해 주십시오.
타이어 회전 익스프레션은 '측정 → 확인 → 생성'의 3단계로 만듭니다. 측정과 확인 단계에서는 씬(Scene)을 변경하지 않으며, 씬이 바뀌는 것은 마지막 '생성' 단계뿐입니다.
이 툴은 씬에 익스프레션 등의 노드를 생성합니다. 사용하기 전에 씬을 별도로 저장해 두는 것이 안전합니다.
툴의 스크립트(wheel_rig_tool.py) 내용을 Script Editor의 Python 탭에 붙여넣고 실행하면 창이 열립니다.
# -*- coding: utf-8 -
"""
wheel_rig_tool.py
...
"""
| 항목 | 설정 내용 |
|---|---|
| 차량 그룹 | Motion Path가 적용된 그룹(`Car_GP`) |
| ... |
1.① 측정: 타이어의 반지름과 지름, 커브의 길이가 입력란에 들어가고 익스프레션이 생성됩니다.
2. 확인: 로그와 입력란의 수치를 확인합니다. 수치는 직접 편집할 수 있습니다. 로그에는 커브 전체 길이를 주행했을 때의 회전수도 나오므로, 수치가 적절한지 판단하는 기준이 됩니다.
3. ②식 재생성: 수치나 체크를 변경했을 때 누릅니다. 손으로 편집한 식은 다시 만들어지면서 사라집니다.
4. ③Expression 생성/업데이트: 익스프레션 CarWheel_rollExp가 생성됩니다. 몇 번을 눌러도 기존 익스프레션의 내용을 덮어쓰기만 합니다.
반지름은 차량 축 중심에서 가장 먼 정점까지의 거리입니다. 타이어에 홈이 있어도, 노면에 접하는 트레드 바깥쪽이 반지름이 되므로 구름 계산에 사용하고 싶은 값과 일치합니다. 후륜처럼 두 개의 바퀴를 묶은 메시라도, 차량 축 방향을 제외한 2개 방향으로 측정하므로 문제없이 측정할 수 있습니다.
Motion Path를 사용하지 않고 Car_GP의 이동(translateZ 등)으로 차량을 움직이는 경우, 툴의 '거리 계산 방식'을 Transform으로 설정합니다. '거리에 사용할 속성'에 전진 방향의 속성(Car_GP.translateZ 등)을 지정하면, 이동량이 그대로 거리가 됩니다.

다만, 이 방법은 **차량이 커브를 그리며 진행할 때는 사용할 수 없습니다**. 이동량과 실제로 주행한 거리가 일치하지 않기 때문입니다. 직선에 가까운 움직임에서 사용해 주십시오.
또한, Car_GP가 Motion Path로 움직이는 경우에는 translateZ가 패스 상의 위치가 되므로, Transform용으로는 사용할 수 없습니다. 툴은 이 경우 에러를 출력하며 멈춥니다. Motion Path 씬에서는 '거리 계산 방식'을 Motion Path로 설정해 주십시오.
**애니메이션이 확정되면 Bake(베이크) 하십시오**. 익스프레션으로 움직이는 타이어의 회전을 키 값으로 변환합니다. 대상은 _r 로케이터의 회전입니다.
실제로 시도하며 막혔던 부분과 그 해결책을 정리했습니다.
**Motion Path에서 타이어가 몇 배나 빠른 속도로 회전하는 경우**: uValue의 키 값이 0~10처럼 1을 초과하지 않는지 확인합니다. Parametric Length가 OFF인데 'uValue 변환'이 '비율(0~1) 그대로 사용'으로 되어 있으면, 거리가 여러 배로 계산됩니다. OFF일 때는 '대응표'로 설정해야 합니다.
**회전이 미끄러져 보이는 경우**: 반지름이 어긋났습니다. 리그에 스케일이 적용된 경우에는 외형이 아닌 실제 치수로 반지름을 다시 측정해 주십시오. 폴리곤 수가 적은 경우에는 반지름을 몇 % 낮춥니다.
이번에는 Claude를 활용하여 Maya용 타이어 자동 회전 툴을 만들었습니다. 구현하고 싶은 기능을 텍스트로 전달하고 대화를 거듭하며 형태를 갖출 수 있기 때문에, 툴 제작에도 부담 없이 도전할 수 있게 되었습니다.
사내에서도 Claude의 활용을 진행하고 있으며, 일상적인 제작 과정에 AI를 도입하고 있습니다. 앞으로도 제작한 툴의 동작을 확인하면서 실무에 활용하여 작업 효율성을 높이고 표현의 폭을 넓히는 데 기여하고 싶습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40