Houdini

Houdini
Houdini Logo
발표일 1996년 10월 2일
최신(안정화) 버전 18.5.351 / 2020년 10월 20일
미리보기 버전 18.5.372 / 2020년 10월 20일
프로그래밍 언어 C++, Python
운영 체제 Windows, macOS, Linux
언어 영어, 일본어
종류 컴퓨터 그래픽스
라이선스 무료, 상용
웹 사이트 www.sidefx.com/products/houdini

1 개요[편집]

SideFX 사에서 개발한 3D 모델링을 포함한 VFX 제작 및 렌더링[1] 프로그램이다. 다른 여타 3D 그래픽스 소프트웨어들과는 다르게 워크플로우 자체가 노드를 기반으로 한 절차적 생성 방식으로 되어있다. 또 그러한 경향에 따라 프로그래밍과 매우 밀접한 관련이 있고 이는 일반적으로 알려진 Houdini의 난이도 상승 문제에 직결된 면이 있다.

1.1 버전[편집]

일반적으로 5가지 종류가 있다고 볼 수 있는데 각각 Apprentice, Indie, Artist, Studios, Education 버전이다.

이름 가격 제한 및 특이사항
Apprentice 무료 렌더링 등에 해상도 제한과 워터마크가 붙으며 타사의 서드파티 렌더러를 사용 할 수 없고, 특정 확장자의 경우 파일 출력 등의 경우는 불러오기만 가능하다. 당연히 상업적 사용도 불가능.
Indie[2] $299(연간), $399(2년간) 연간 총 소득액 10만 달러 미만의 스튜디오 중 사용자 3명 이하. 또한 영구적인 라이센스는 구매할 수 없다. 다른 상용 라이센스와 다르게 Houdini Engine을 시트 수만큼 무료로 제공한다.
Artist $1,995(Core), $4,495(FX), $499(Engine) 스튜디오 중 사용자 5명 이하.
Studios $2,995(Core), $6,995(FX)

1.2 Houdini Engine[편집]

다른 소프트웨어에 통합되어 사용할 수 있는 Houdini다. Houdini에서 에셋을 만들고 디지털 에셋으로 출력해 DCC 어플리케이션 등에서 Houdini Engine 플러그인을 적용 후 불러와 Houdini 내부에서 디지털 에셋을 사용하듯 인자 값을 조정해 에셋 자체를 수정하지 않고 인스턴스 마다 편집이 가능하게 된다.

지원하는 프로그램들은 다음과 같다.

Indie 라이센스를 제외한 다른 상용 라이센스에서는 추가적으로 구입해야 한다. 모든 라이센스가 영구적인 라이센스가 아닌 구독제 라이센스다.

2 노드[편집]

주로 노드를 연결해 모델링과 VFX 제작을 하는 프로그램인 만큼 수많은 노드들이 존재한다. 자세한 내용은 노드로.

3 VEX[편집]

Houdini 내부에서 사용하는 프로그래밍 언어. 단 스크립팅 언어를 대체하는 언어는 아니다[3]. C를 기반으로 하고 C++와 몇 가지 다른 언어에서 편리한 문법들을 차용했다. 실제로 vcc라는 vex 컴파일러가 C로 컴파일해 실행 된다.

3.1 문법[편집]

아래는 C와 다른 부분을 위주로 서술되어 있다.

3.1.1 변수[편집]

3.1.1.1 배열[편집]

기존 C 계열 언어와 동일한 방식으로 배열을 만들 수 있다. 리터럴도 중괄호로 감싸아서 표현한다. 단 리터럴의 경우 컴파일 타임에 변수 값을 읽을 수 없어 array 함수로 대신해주어야 한다. 또한 파이썬의 리스트처럼 쉽게 범위를 지정해 내부 값을 복사할 수도 있다.

float arr[];
string arr2[] = { "Hello", "World" };
int value = 1;
int arr3[] = array(value, 2, 3); // 리터럴의 경우 컴파일 에러!

int nums[] = { 0, 1, 2, 3, 4, 5 };
int start[] = nums[0:2];  // { 0, 1 }
int end[] = nums[-2:];  // { 4, 5 }
int rev[] = nums[::-1];  // { 5, 4, 3, 2, 1, 0 }
int odd[] = nums[1::2]; // { 1, 3, 5 }
3.1.1.2 문자열[편집]

따옴표로 문자열 값을 리터럴로 표현할 수 있다. 큰따옴표든 작은따옴표든 상관 없다.

string s = 'foo';
string t = "bar";
string py = r"Hello world\n";        // Python 스타일, "Hello world\\n"와 동일함.
string cpp = R"(Hello world\n)";   // C++ 스타일. "Hello world\\n"와 동일함.
3.1.1.3 속성[편집]

어트리뷰트라고도 한다. Houdini에서 가장 중요하다고도 말할 수 있을 정도로 많은 데이터가 속성 값에 들어있는데 예를 들어 디퓨즈 컬러, 위치, 노멀, 알파 값 등등은 전부 속성에서 접근할 수 있다. 조작하기 위해 대체할 수 있는 노드들도 있지만 vex를 이용해 접근하는 것이 훨씬 확장성이 높다. 속성 값은 @를 접두사로 써서 표현하는데 영어로 at이라 부르기 때문이다. 또한 타입에 따라 i(정수), f(실수), v(벡터), s(문자열)들을 @ 앞에 기입해 타입을 명확히 지시해서 사용한다. 이미 정의했거나 미리 지정되어 있는 속성 값에서는 이를 생략할 수 있다.

i@integer_value = 1; // 정수형 속성 값, integer_value가 이름이 되었다.
f@float_value = 1.f;   // 실수형 속성 값
v@vector_value = {0, 0, 0}; // 벡터형 속성 값
s@string_value = "hello houdini!"; // 문자열형 속성 값

위 vex 코드를 단일 Box 형태에서 Attribute Wrangle 노드를 이용해 입력했을 때 지오메트리 스프레드시트 탭에서 다음과 같이 변경된다.

Houdini example vex.jpg

대표적으로 다음과 같은 미리 정의된 속성 값들이 있다.

  • v@P 포인트의 위치 값이다. 이 값을 변경하면 포인트의 위치가 변경 된다.
  • v@N 노멀의 방향 값이다. 변경하면 노멀을 변경할 수 있다.
  • v@v 속도 값이다. 렌더러가 모션 블러를 추가할 때 사용한다. 자동으로 계산되지 않는 속성 값이다.
  • i@id 각 요소마다 고유한 id 값이다. 요소 순서 값과는 다르다. 지오메트리가 변경되어 포인트에 할당되었던 번호가 변경되었어도 여전히 같은 값으로 추적할 수 있다. 파티클 DOP에서 종종 사용 된다.
  • s@name 볼륨 혹은 패킹된 프리미티브와 같은 것들에 설정하여 이름별로 코드에서 탐색 가능한 값이다. 일부 노드가 사용하는 속성 값이다.
  • v@Cd 벡터로 나타낸 rgb의 디퓨즈 컬러 값이다. 변경하면 뷰포트에서 확인 가능하다.
  • f@Alpha 알파 투명도 값이다. 변경하면 뷰포트에서 확인 가능하다.

3.1.2 함수[편집]

아래와 같이 연속되는 같은 인자 값들의 타입을 생략 할 수 있다. 세미콜론으로 다른 타입의 인자와 구분 한다.

int test(int a, b; string c) {
    if (a > b) {
        printf(c);
    }
}

사용시 주의해야 할 점은 앞서 서술했듯이 C로 컴파일 된 후 실행되므로 함수가 재귀적으로 실행되지 않는다는 점이 있다[4]. 이땐 셰이더 호출을 사용해야 한다.

3.2 범위 기반 for[편집]

int arr = { 0, 1, 2, 3 };
foreach (int i; arr) {
    printf("%d\n", i);
}

4 각주

  1. 내장된 Mantra와 Karma
  2. 스팀에서 구입 가능한 유일한 버전이다
  3. 스크립팅 언어는 Python과 HScript라는 게 쓰이는데, 후자는 쉘 스크립트와 비슷한 문법을 가지고 있다. 이 HScript는 Houdini에서 VEX와 함께 같이 밀접하게 사용된다.
  4. 정확히는 재귀적으로 호출해야 할 함수가 아직 초기화 되지 않은 상태이기 때문에 컴파일러가 함수를 찾을 수 없어 에러를 띄운다.