>> 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 Apr 18, 2011
첨부 '8'

f18_001.jpg

 

필자는 항공역학을 상당히 좋아한다. 그래서 심심할때면 면적법칙같은 각종 항공역학에 대해서 조사하거나 공부하는 편이며, 실상 이러한 역학을 이해하는 것은 애니메이터로서 그리고 Techincal Director 적인 면에서 상당히 중요하다고 할 수 있다.

 

오늘 만들고자 하는 비행기는 아래와 같다.

이 비행기는 과거 Central City 용으로 필자가 리깅한 데이터이다.

 

 

 

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



비행기에 구현된 기능은 대략적으로 다음과 같다.

 

   1. 순항중 오르내림(떨림) 자동 애니메이션

   2. 에어브레이크 전개시, 기수가 위로 자동으로 들림(항력으로 인하여)

   3. 비행기가 좌우로 롤하는 경우, 에일러론이 자동으로 움직임

   4. 비행기의 기수가 움직이는 경우, 승강타(엘리베이터-수평꼬리날개)가 자동으로 움직임

   5. 보조양력장치(플랩)이 움직임

   6. 에어브레이크 전개시, 실제 F18처럼 방향타도 안쪽으로 젓혀짐

   7. 요잉발생시, 방향타(러더)가 자동으로 움직임 

 

 

 

 1. 순항중 오르내림(떨림/쉐이킹) 자동 애니메이션 세팅

 

비행중에 비행기는 항력, 공기저항, 불안정성 때문에 실제로 미세하게 아래위로 요동을 치게 되는데, 이를 Fly-by-Wire 컴퓨터가 비행을 지속적으로 모니터 하면서, 러더/에일러론/엘리베이터를 미세하게 움직이면서 비행기를 정상경로로 돌려놓는 작업을 끈임없이 하게된다. 즉, 이 경우에는 비행기는 중심축에서 아주 미묘하게 움직이기는 하지만 경로를 크게 벗어나지 않으며, 항상 중심축을 기준으로 좌우/상하로 미묘하게 움직인다는 점이 중요하다.

 

이런식의 움직임을 제어하는 방법은 실상 여러가지가 있겠지만, 필자는 여기서 "삼각함수"를 사용하기로 했다.

rand 같은 랜덤함수를 이용할 수도 있겠지만, 이러한 항공기의 움직임은 랜덤이라기 보다는 부드러운 스플라인(spline)움직임이기 때문에, 연속성을 가지는 삼각함수가 더 적합하다고 판단했기 때문.

 

 

f18_002.jpg

중학교(어쩌면 고등학교, 요즘은 초등학생들도 한다는 소문이..)때 다들 기본적으로 배우는 삼각함수 그래프이다. 여기서 필요한것은 사인/코사인이고, 탄젠트는 비행기의 움직임을 표현하기에는 너무 Step 적인 느낌이 강해서 사용하지 않았다.

 

Maya Expression

 

// 현재 프레임을 애니메이터가 원하는 값으로 나누어 cos,sin 으로 움직임을 제어한다.

 

SHAKE_CTRL.translateY = 0.2*cos(frame/SHAKE_CTRL.TY_shake);

SHAKE_CTRL.translateX = 0.2*sin(frame/SHAKE_CTRL.TX_shake);

SHAKE_CTRL.rotateY = 0.5*cos(frame/SHAKE_CTRL.RY_shake);

SHAKE_CTRL.rotateZ = 0.5*sin(frame/SHAKE_CTRL.RZ_shake);

 

//RotateX 같은 경우는, 기수의 상하움직임으로 단순히 상하움직임만이 아니라, 에어브레이크의 전개로 인하여 기수가 자동적으로 들어지는 경우도 함께 제어하도록 뒤에 에어브레이크 설정이 포함된다.

 

SHAKE_CTRL.rotateX = 0.5*cos(frame/8)+1+($f18newbrake*0.6);

 

 

 

 

2. 조종면 제어하기.

 

비행조종면을 세팅하기 위해서도 역시 항공역학에 대한 지식이 어느정도 있어야한다. 물론 그렇게 어렵지 않으니 간단히 이미지만 봐도 이해할 수 있으리라 생각한다.

 

 

f18_003.jpg

이 이미지는 F16 파이팅팔콘의 조종면에 대한 그림으로, 항공기의 조종면에 대한 모든 기본적인 모습이 나와있다. 필자가 작업한 F18에 적용하면 아래와 같이 될 것이다.

 

f18_004.jpg

 

F16과의 차이점이라면, F18은 수직꼬리날개가 두개이기 때문에 방향타(러더)가 두개이며 그외의 큰 차이점은 없고, 필자는 슬랫은 리깅하지 않았으므로, 슬랫은 별도로 설명하지 않겠다. 또 한가지의 차이점이라면, F18의 경우에는 수직미익의 방향타(러더)가 에어브레이크 역활을 함께 수행하기 때문에, 에어브레이크가 전개되면, 러더도 안쪽으로 접혀지게 된다는 점이 F16같은 단일수직꼬리날개 기종과의 차이점이라 할 수 있다.

 

이러한 조종면의 자동애니메이션을 위해서 우선적으로 고려해야 하는점은. 비행기의 움직임을 알아야 한다. 는 것이다. 비행기의 기수가 아래로 향하는지 위로 향하는지, 요잉이나 롤링이 발생하는지 등을 알아야 하며, 이를 간단히 해결하기 위해서, Expression 을 이용하기로 한다.

 

 

f18_005.jpg

 

Maya Expression

 

// MELscript 를 이용해서 5프레임전의 비행기 움직임을 변수로 입력한다.

 

float $f18oldX = `getAttr -time (frame - 5) LOCAL_CTRL.rotateX`;

float $f18oldY = `getAttr -time (frame - 5) LOCAL_CTRL.rotateY`;

float $f18oldZ = `getAttr -time (frame - 5) LOCAL_CTRL.rotateZ`;

 

//에어브레이크 움직임 기억

float $f18newbrake = `getAttr -time (frame - 5) AirBrake_CTRL.AirBrake_Open`;

 

// MELscript 를 이용해서 현재보다 1프레임 앞을 변수로 입력한다.

 

float $f18newX = `getAttr -time (frame + 1) LOCAL_CTRL.rotateX`;

float $f18newY = `getAttr -time (frame + 1) LOCAL_CTRL.rotateY`;

float $f18newZ = `getAttr -time (frame + 1) LOCAL_CTRL.rotateZ`;

 

// 비행기 동체의 움직임의 변이량(벡터)을 계산하여 새로운 변수로 입력한다.

float $f18changeX = $f18oldX-$f18newX;

float $f18changeY = $f18oldY-$f18newY;

float $f18changeZ = $f18oldZ-$f18newZ;

float $additionleft;

float $additionright;

 

// 러더의 움직임, 러더는 말했듯이 에어브레이크와 함께 최종움직임이 결정된다.

 

Left_Rudder.rotateY = (-1)*$f18changeY*8+((-2)*AirBrake_CTRL.AirBrake_Open);

Right_Rudder.rotateY = $f18changeY*8+((-2)*AirBrake_CTRL.AirBrake_Open);

 

// 플랩의 움직임, 플랩은 애니메이터가 입력하는 플랩값만 따르는 것이 아니라, 에일러론과 함께 롤링에 도움을 주기 때문에 롤링시에 함께 움직인다. 물론 애니메이터가 입력한 값은 여기에 가감된다.

 

Left_wing_FLAP.rotateX = (((-1)*$f18changeX)+($f18changeZ))*0.5+(Left_Wing_Flap_CTRL.FLAP*2);

Right_wing_FLAP.rotateX = ((-1)*$f18changeX)+((-1)*$f18changeZ)*0.5+(Right_Wing_Flap_CTRL.FLAP*2);

 

// 에일러론의 움직임

 

Left_wing_alieron.rotateX = ((-1)*$f18changeX)+($f18changeZ)+(2)*$f18changeY;

Right_wing_alieron.rotateX = ((-1)*$f18changeX)+((-1)*$f18changeZ)+(-2)*$f18changeY;

 

// 승강타(엘리베이터)의 움직임

 

Left_horizontal_wing.rotateX = $f18changeX*2+($additionleft*0.2);

Right_horizontal_wing.rotateX = $f18changeX*2+($additionright*0.2);

 

 

 

 

항공역학적인 비행기 리깅하기 참 쉽죠?

msn034.gif


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