>> 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 Jun 28, 2011
첨부 '1'

ship_001.jpg

 

지면에 붙어다니는 자동차 바퀴, 바다위를 떠다니는 배같이 특정한 면에 종속되어 움직이는 물체를 마야에서 만드는 방법에 대해서 알아볼까 한다. 자동차는 서스펜션을 리깅해야 하는 복잡한 문제가 있으므로 접어두고, 바다위에 떠다니는 배를간단하게 만들어보자.

 

아마도 3D 를 하는 사람이라면 알겠지만, 물은 3D 에서 표현하기가 매우 어려운 물질이며, 가능하다면 그 누구도 얽히고 싶지 않은 문제일 것이다. 실상 필자도 이펙터가 아니기 때문에 물같은 물질과는 그다지 얽히고 싶지 않지만 때때로 아주 높은 퀄리티가 필요치 않으면서도 어떻게든(?) 물을 표현해내야 하는 경우가 있고, 특히 누군가 바다위에 거북선을 학익진으로 배치해야 한다고 할때, 그러한 경우에 요긴하게 사용할 수 있는 방법이다.

 

 

 

1. 필요한 기능

 

Constrain > Geometry, Constrain > Normal, Ocean Shader

추가적으로 있으면 좋겠지만 쓰기가 어려워서 전혀 권장하지 않는 기능 : 파티클, 다이내믹스

 

파도를 만드는데는 간단하게, Plane 에 Sine Deformer를 X/Z 방향으로 두개 만들어서 제어했고, 물표현은 OceanShader를 사용했다. OceanShader는 상당히 괜찮은 퀄리티를 보여주며, 바람의 방향대로 자동으로 애니메이션까지 되는 쉐이더 이므로 때때로 유용하게 사용할 수 있다. 다만 실제로 물의 잔파도를 만들기 위해서 Displacement를 이용해서 면을 변형시키기 때문에 렌더링이 무겁고 느리다는 단점이 있기는 하다. (그래도 파티클이나 Fluid 같은 연산에 비하면 훨씬 빠르다.)

 

 

 

예제 동영상(이번에도 당연히 720P를 지원한다.)



AIM/UP vector를 잘 설정해야 합니다.


 

 

 

 

2. 해도 되고 안해도 되는 배 움직임 Expression 제어

 

배의 실제 동체는 파도의 움직임에 다소 느리게 반응하며 무게에 맞게 어느 정도의 FollowThrough 가 있어야 하기 때문에, 대충 이런식으로 배의 움직임이 실제 움직임과 offset 되어 관성을 자동으로 제어되도록 만들 수 있다. 다만 이런 방식의 주의점은 렌더링을 여러대의 컴퓨터에서 하는 경우(특히 backburner) 렌더링전에 반드시 bake 시켜야 정상적으로 렌더링 된다.




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

 

float $shipoldX = `getAttr -time (frame - 5) WORLD_CTRL.rotateX`;

float $shipoldY = `getAttr -time (frame - 5) WORLD_CTRL.rotateY`;

float $shipoldZ = `getAttr -time (frame - 5) WORLD_CTRL.rotateZ`;

 

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

 

float $shipnewX = `getAttr -time (frame + 1) WORLD_CTRL.rotateX`;

float $shipnewY = `getAttr -time (frame + 1) WORLD_CTRL.rotateY`;

float $shipnewZ = `getAttr -time (frame + 1) WORLD_CTRL.rotateZ`;

 

// 배의 실제 움직임의 변이량(벡터)을 계산하여 관성을 가지도록 설정.

LOCAL_CTRL.rotateX = $shipoldX-$shipnewX;

LOCAL_CTRL.rotateY = $shipoldY-$shipnewY;

LOCAL_CTRL.rotateZ = $shipoldZ-$shipnewZ;




 

이를 응용하면 다음과 같이 만들 수 있다.



저런 바다에서 떠 다닌다면 멀미약도 소용없을 것!


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