>> LOGIN
-이 웹사이트는 다음 플랫폼에서 동작이 확인되었습니다. : Internet Explorer Mozilla FireFox Google Chrome Apple Safari Android 2.2(Froyo) Android 2.3(GingerBread) Android 4.0(IceCreamSandwitch) Android 4.1(JellyBean)

CGCODE.net |

자동차 바퀴 자동으로 굴러가게 만들기

by Devil on Aug 05, 2011
첨부 '5'

wheel_001.jpg

 

자동차 바퀴가 회전하는 방법은 사실 여러가지가 있지만, 자동차의 회전방향과 상관없이 자동차가 움직인다면 어디서나 자동차 바퀴가 알아서 굴러가도록 세팅을 해 볼까 한다. 물론 약간의 복잡한 Expression 을 사용해야 겠지만 알고보면 별로 복잡하지도 않다. (사진은 F1 레드불레이싱팀의 머신이다. 아마도 RB7 머신일 것이고, 2011 시즌은 베텔이 혼자 독주해서 재미가 별로 없다. 베텔과 해밀턴이 피터지게 싸워야 하는데. 필자는 개인적으로 알론소를 좋아하지 않으므로 알론소와 페라리가 고전하는 모습은 괜찮다.. 응?)

 

 

 

1. 아주 단순한 방식.

 

사실 가장 초보적인 자동차 바퀴 세팅은 아마 익히들 알고있듯이 아래와 같다.

 

Maya Expression

 

Wheel.rotationX = 3.14*Car.translateZ;

 

자동차 동체의 Z축 이동을, 원주율*이동거리로 계산해서 바퀴의 회전축에 연결하는 모양이다. 그러나 이러한 단순한 리깅의 가장 큰 문제점은 자동차가 회전하게 되어버리면, 이동축이 X, Z 등으로 변하기 때문에 바퀴가 따라가질 못한다는 점이다. 실질적으로 이런식의 간단한 수식은 정말 단순한 캐릭터가 아니라면 제대로 사용하기 어렵다.

 

 

 

2. 약간 복잡한 방식.

 

자동차의 회전방향과 상관없이 자동차의 움직인거리만 환산하여 바퀴의 회전으로 바꾸는 방법에 대해서는 많은 방법이 있지만 필자는 여기서는 Darvy 라는 유저가 개발하고, Undereath 라는 유저가 추출한 수식을 사용해 보고자 한다.

 

[Undereath웹사이트] : http://underearth.wordpress.com/2009/09/05/auto-rotation-of-tyrewheel-in-maya/

 

wheel_002.jpg

대충 이러한 방법이다.

굳이 한글로 설명을 하자면, 알아서 잘 만들면 된다. 오늘 강좌 끝.이 아니라..

 

Maya Expression

 

float $radius =1;
int $dirVec;

 

// 1프레임 전의 basePos_jnt 의 X,Y 축 값을 가져온다.

float $pastValX = `getAttr -time (frame-1) basePos_jnt.tx`;
float $pastValZ = `getAttr -time (frame-1) basePos_jnt.tz`;


//tipPosJoint에서 basePos_jnt 의 거리차를 계산한다.
float $currPosX = tipPos_jnt.translateX-basePos_jnt.translateX;
float $currPosZ = tipPos_jnt.translateZ-basePos_jnt.translateZ;


// 두개의 jnt가 1프레임전에서 거리의 이동이 있었는지 계산한다.
float $pastPosX = tipPos_jnt.translateX-$pastValX;
float $pastPosZ = tipPos_jnt.translateZ-$pastValZ;


// 실제 이동정도를 계산한다. mag 명령어는 벡터값을 연산하는 명령이다.

 

float $currMag = `mag << $currPosX,0,$currPosZ>>`;
float $pastMag = `mag << $pastPosX,0,$pastPosZ>>`;
if ($pastMag >= $currMag) $dirVec = 1;
else $dirVec =-1;


// 자동차 컨트롤러의 이동정도를 계산하고 위에서 계산한 값과 합산한다.


float $pastCtrValX = `getAttr -time (frame-1) placement_ctr.tx`;
float $pastCtrValZ = `getAttr -time (frame-) placement_ctr.tz`;
float $currDistX = placement_ctr.translateX-$pastCtrValX;
float $currDistZ = placement_ctr.translateZ-$pastCtrValZ;
float $distance = ($currDistX*$currDistX) + ($currDistZ*$currDistZ);
$distance = sqrt($distance);


// 자동차의 진행경로가 앞인지 뒤인지 벡터값에 맞게 바퀴를 돌려준다.


float $rotation = $distance /(2* 3.1428*$radius) *-360 * $dirVec;
$rotation += tyreRot.rotateX;
tyreRot.rotateX = $rotation %360;

 

 

이렇게 되겠다. 재미난점은 Undereath 의 웹사이트에서 코드를 복사하는 경우, "-" 기호가 실제로 빼기 기호가 아니라서 마야가 에러를 뿜어낸다. 야 Underath 맞을래?! (죄송합니다.) 그렇게 때문에 반드시 - 로 바꿔써야만 에러가 나지 않는다.

 

 

 

 

3. 애니메이터를 위한 약간의 수정

 

기본적으로 위의 익스프레션은 애니메이터의 입장에서는 몇가지 문제점을 가지고 있다.

 

1. 이유는 모르겠지만, 스크립트의 원제작자는 회전방향을 반대로 설정해두었다. (대체 왜?)

2. 애니메이터가 타이어의 회전을 조절할 방법이 없다. (스핀이나 브레이크는 대체 어떻게 표현하라는 건가?)

3. 트럭의 크기가 달라지면 회전정도가 달라지는 문제가 있다. (크기를 고정해놓고 쓰면 자유도가 떨어진다)

 

그래서 필자의 경우에는 컨트롤러에 Wheel_Rotation 이라는 attr 을 부여하고, 이를 다시 연결해주는 과정을 거쳤다.

 

수정 전 : float $rotation = $distance /(2* 3.1428*$radius) *-360 * $dirVec;

 

수정 후 : float $rotation = (($distance /(3.1428*$radius) * 360 * $dirVec)/10/Truck_World_CTRL.scaleX) * Tyre_LF_CTRL.Wheel_Rotation;

 

// 여기서 Truck의 모델크기에 적합하게 값을 나누고, -360 으로 되어있는 부분은 360으로 변경하여 양수방향으로 회전하도록 하며, 전체적인 회전수치에 애니메이터가 자유롭게 Tyre_LF_CTRL.Wheel_Rotation 을 가감함으로써 원하는 경우에는 회전정도를 더 높일수도 있고,(급가속시 타이어가 공회전하는 현상을 표현하고 싶을때), 반대의 경우에는 브레이크를 잡을 때, 차의 이동과 무관하게 타이어가 제동을 가는 장면을 표현할 수도 있도록 수정하였다.

(ABS 는 일단은 익스프레션으로 포함되지 않았으니, 알아서 애니메이션키를 잡으면 ABS 도 표현할 수 있겠삼)

 

 

■ 자동차 동체의 흔들림 자동제어

 

자동차 동체의 Shaking(흔들림)제어는 아래에 있는 자동으로 애니메이션 되는 비행기설계 편과 똑같이 삼각함수(sine)을 사용하였으므로, 해당편을 참고하기 바란다.

 

 

 

 

 

 

- 제작 동영상 - (음성설명은 없지만, 그래도 720P를 지원하니 고해상도로 볼수는 있다!)



 

 

 

 

 

 

 

 

 

이걸 여차저차 꿍짜꿍짜 응용하면, 아래와 같이 애니메이션 할 수 있다.

 

 

 720P를 지원하니 고해상도로 볼수있다! (그래봐야 Playblast 퀄리티..)


 

자동차 바퀴 굴러가게 리깅하기도 참 쉽죠? ^^

 

 


Designed by hikaru100

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

SketchBook5,스케치북5

SketchBook5,스케치북5

SketchBook5,스케치북5

SketchBook5,스케치북5

CGCODE.net의 모든 게시물 및 자료의 저작권은 CGCODE.net과 김진우에게 있습니다. 합법적 허가 및 출처의 명시없이 이를 도용,복사,사용하는 경우에는 관련 법령에 의거하여 처벌될 수 있습니다.
Since 2003. CGCODE and Devil.Genius all rights reserved. In the U.S, Korea(Republic of), and/or other countries. All information on CGCODE.net is developed by JinwooKIM.
All contents are protected by the copytight laws. Visitors are not supposed to use or edit any contents in this website without the authorization or permission.
CGCODE.net 
Ver 3.57 - Released Beta stage. WebMaster : geniusione@gmail.com