Houdini

121.164.67.75 (토론)님의 2020년 10월 25일 (일) 20:11 판 (→‎속성: 링크 오류 수정 2)
Houdini
Houdini Logo
소프트웨어 정보
종류 컴퓨터 그래픽스
언어 영어, 일본어
운영체제 Windows, macOS, Linux
라이선스 무료, 상용
웹사이트 www.sidefx.com/products/houdini

개요

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

버전

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

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

노드

/obj의 Tab 메뉴를 기준으로 작성되었다.

Primitives

틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드

Utility

틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드 틀:Houdini 노드

VEX

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

문법

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

변수

배열

기존 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 }
문자열

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

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"와 동일함.
속성

어트리뷰트라고도 한다. 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 알파 투명도 값이다. 변경하면 뷰포트에서 확인 가능하다.

함수

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

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

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

범위 기반 for

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


각주

  1. 내장된 Mantra와 Karma
  2. 스팀에서 구입 가능한 유일한 버전이다
  3. 정확히는 재귀적으로 호출해야 할 함수가 아직 초기화 되지 않은 상태이기 때문에 컴파일러가 함수를 찾을 수 없어 에러를 띄운다.