정보의 연산 방식

  • float
  • int
  • vector
  • string

이전 포스트(링크) 에서 후디니에서 주로 사용되는 위의 네 가지 데이터 타입이 있다는 것을 배웠습니다.

Houdini-Beginner

Vex 언어를 사용하는 노드는 어트리뷰트 랭글(Attribute Wrangle) 노드만 있는 것이 아닙니다. 이번에는 새로운 Vop 노드에 대해서 알아보고자 합니다.

또한 서로 다른 데이터 타입들끼리 연산 했을 때 결과가 어떻게 결정되는지 알아보며 Vex와 Vop의 차이점에 대해서 다루겠습니다.

예를 들어 float ${+}$ int 를 연산하는 경우를 생각해봅시다.

float a = 1.5;
int b = 2;

@c = a + b;

이때 @c 의 데이터 타입은 어떻게 될까요?

  • Vex 에서는 연산 결과를 담아줄 변수의 데이터 타입이 미리 정해져 있어야 합니다.
  • Vop 에서는 연산 결과를 담아줄 변수의 데이터 타입을 후디니가 알아서 판단합니다.

Vex의 연산 방식

Houdini-Beginner Houdini-Beginner

Vex는 값을 미리 정해둡니다.

@c가 아니라 f@c라면 어떻게 연산하던 데이터 타입은 float일 것이며, i@c 라면 int입니다

결과가 int가 되면 소수점 부분을 버리고 정수 부분만 남는 것을 확인하실 수 있습니다.

Houdini-Beginner

int b 를 벡터(vector)에 더한다면 b의 정수 부분만큼 벡터의 모든 성분에 같은 값이 더해집니다.

Houdini-Beginner

float a를 더해도 같은 방식으로 벡터의 모든 성분에 같은 값이 더해집니다.

Vop의 연산 방식

Vop의 판단 기준은 연산 순서입니다.

Vop로 float ${+}$ int 를 계산하는 상황이라면 float이 앞에 있기 때문에 데이터 타입도 float으로 결정됩니다.
반대로 int가 앞에 있는 int ${+}$ float 상황이라면 데이터 타입도 int로 결정됩니다.

다음은 실제로 Vop 노드를 사용하며 자세히 알아보겠습니다.

Vop 노드 사용하기

Houdini-Beginner

노드를 생성할 때 ‘Attribute Vop’ 를 선택합니다.

Houdini-Beginner

노드를 더블 클릭하면 마치 마야(Maya), 언리얼 엔진의 블루프린트(BluePrint), 유니티 엔진의 셰이더 그래프(ShaderGraph) 같은 느낌의 유사한 그래프 에디터 UI가 나옵니다. 이는 Vop 노드 내부를 구성하는 그래프 에디터입니다.

Houdini-Beginner

Vop 노드 내부에서 값을 읽고 쓰기 위해서 먼저 상수(Constant) 노드를 만들어줍니다.

Houdini-Beginner

상수 노드를 선택하고 파라미터(Parameter)의 ‘Constant Type’에서 후디니에서 다룰 수 있는 다양한 종류의 상수를 설정해줄 수 있습니다.

Houdini-Beginner

float 을 선택하고 값을 3으로 설정합니다. 하지만 지금으로서는 아무것도 출력하지 않습니다.

Houdini-Beginner

‘const1’ 노드의 값을 어트리뷰트(Attribute)로 지정하여 출력하려면 바인드 익스포트(Bind Export) 라는 노드를 사용해야 합니다.

Houdini-Beginner Houdini-Beginner

바인드 익스포트 노드의 이름(name)은 k로 정하고 타입(Type)도 float으로 설정하였습니다.

그리고 ‘const1’ 노드와 인풋(intput)과 아웃풋(output)을 연결하면 값을 어트리뷰트 k로 내보낼 수 있습니다.

Houdini-Beginner

여타 다른 그래프 에디터 처럼 많은 연산 기능이 노드의 형태로 제공됩니다. 예를 들어 위 이미지 처럼 더하기(Add) 노드가 존재할 뿐만 아니라 상수들 끼리 모든 사칙연산이 가능합니다.

Houdini-Beginner

바인드 익스포트로 출력한 결과 ab의 아웃풋을 가지고 다시 연산을 수행할 수도 있습니다.

Houdini-Beginner

ab를 더하고 이를 다시 바인드 익스포트로 출력하는데, 이때 출력하는 값의 이름을 a로 정하면 위와 같이 a의 값이 2로 업데이트 되는 것을 확인 할 수 있습니다.

Houdini-Beginner

그렇다면 앞서 이야기한 Vop의 연산 순서를 생각해봅시다.

위 이미지와 같은 더하기 노드로 ${1 + 1.2}$를 연산할 때,

int가 앞에 있는 int ${+}$ float 상황이라면 결국 a의 데이터 타입도 int로 결정되고

a의 값은 소수 부분이 버려지고 정수 부분만 남은 ${2}$가 되는 것을 실제로 확인 할 수 있습니다.

Houdini-Beginner

GeometryVopGlobal 노드가 인풋(input) 입니다. 포지션 값인 PVector3 ${(1, 0, 0)}$ 를 더해서 포지션 값을 변경 할 수 있습니다.

GeometryVopOutput 노드가 아웃풋(Output)입니다. 앞서 계산한 결과를 연결해서 포지션 값을 변경할 수 있습니다.

Houdini-Beginner Houdini-Beginner

GeometryVopGlobal 노드의 값을 자세히 보시면 데이터 마다 색상이 다릅니다. 데이터 타입을 컬러로 표현하여 보기 쉽게 처리한 것입니다.

Vex / Vop 의 차이점

앞서 알아보았듯이 Vex가 할 수 있는 모든 작업을 Vop에서도 할 수 있으며 그 역(Converse)도 마찬가지입니다.

결국 둘은 본질적으로 같습니다. 같은 계산을 노드로 표현하느냐, 코드로 표현하느냐에서 발생하는 표현 방식의 차이가 필연적으로 연산 순서의 차이로 나타나게 되는 것입니다.

레퍼런스(Reference)