본문 바로가기
vfxai 잡학지식 vfxai 잡학지식

VEX 속성 타입 접두사 f@·v@·i@·s@

vfx 잡학지식 읽는 시간 약 9분 조회 1

VEX에서 같은 @속성 표기를 썼는데, 한 결과는 벡터 전체가 옮겨지고 다른 결과는 첫 값만 남을 수 있습니다. 어떤 코드는 0으로 보입니다. f@·v@·i@·s@ 접두사를 생략해도 되는 경우와, 잘못 썼을 때 값이 어떻게 달라지는 경우를 어떻게 구분할까요?

여기서는 접두사 표, 알려진 속성의 예외, Houdini 19.5.435에서 실행한 최소 예제를 살펴봅니다. 마지막에는 속성과 표기를 직접 바꿔 결과를 비교할 수 있습니다.

$F·$T·@Frame·@Time의 시간 변수 설명과 구분해야 합니다. 여기서 f@weight의 @는 geometry 속성을 읽고 쓰는 VEX 표기입니다. 시간 변수가 아니라 속성 타입 바인딩을 다룹니다.

재현 범위는 SOP의 Point Attribute Wrangle 한 개 input과 point 속성입니다. 실행 환경은 Houdini 19.5.435 Commercial입니다.

VEX 접두사 f@·v@·i@·s@는 어떤 타입을 고를까요?

Wrangle 코드에서 @이름은 geometry 속성을 가리킵니다. 접두사는 그 속성을 VEX 코드 안에서 어떤 타입으로 다룰지 지정합니다.

VEX 타입접두사예시값 모양
floatf@f@weight숫자 하나, 예: 2.5
vectorv@v@flow세 성분, 예: (1, 2, 3)
inti@i@count정수 하나, 예: 7
strings@s@label문자열, 예: hello

사용자 정의 float 속성은 접두사를 쓰지 않아도 기본 float로 읽힐 수 있습니다. 그래도 코드에서 속성 타입을 접두사로 드러내면 어떤 값으로 처리하는지 바로 확인할 수 있습니다.

알려진 속성 이름은 접두사를 생략할 수 있습니다

Houdini는 몇몇 표준 속성 이름에 타입을 미리 연결합니다. 이런 이름은 접두사를 생략해도 해당 타입으로 바인딩됩니다.

속성 이름접두사 없는 타입예시
@P, @Cd, @N, @vvector@P = set(0, 1, 0);
@id, @ptnumint@id = @ptnum;
@orientvector4p@orient도 가능
@namestring@name을 문자열로 읽음

이 목록은 사용자 정의 속성을 저장된 geometry에서 자동으로 학습한다는 뜻이 아닙니다. flow처럼 목록에 없는 이름은 속성이 실제로 vector여도 타입을 쓰지 않으면 float로 바인딩됩니다.

접두사 바인딩 체험

속성과 VEX 표기를 하나씩 골라 결과를 비교하세요. 각 선택은 입력에 같은 이름의 point 속성이 이미 있고, 새 Wrangle 한 개에서 독립 실행하는 조건입니다.

선택 결과@flow

재현 기준: Houdini 19.5.435 Commercial, SOP Point Attribute Wrangle. 기록한 조합만 결과를 표시하며, 시험하지 않은 타입 조합은 결과를 추측하지 않습니다.

한 번 만들고 다음 Wrangle에서 읽어 봅니다

먼저 한 Wrangle에서 사용자 속성 네 개를 만듭니다. 다음 코드를 Point Attribute Wrangle에 넣으세요.

f@weight = 2.5;
v@flow = set(1, 2, 3);
i@count = 7;
s@label = "hello";

두 번째 Wrangle을 연결하고 타입 접두사를 맞춰 복사합니다. Houdini 19.5.435 hython 재현에서 네 값은 그대로 복사됐고, 노드 오류나 경고는 없었습니다.

f@weight_copy = f@weight;
v@flow_copy = v@flow;
i@count_copy = i@count;
s@label_copy = s@label;

이번에는 사용자 정의 vector에서 접두사를 빼 보겠습니다. 같은 입력에서 flow는 (1, 2, 3)이지만, 아래처럼 쓰면 결과는 vector 전체가 아닙니다.

f@x_only = @flow;

19.5.435에서 x_only는 float 1.0이었습니다. @flow가 사용자 정의 이름이어서 기본 float binding을 사용했고, vector의 첫 성분 x만 읽었습니다.

입력 속성접두사를 생략하거나 틀린 표기19.5.435 point Wrangle에서 본 결과맞는 표기
flow vector (1, 2, 3)@flow 또는 f@flowfloat 1.0, 첫 성분만 읽힘. f@flow = 9;로 쓰면 (9, 2, 3)v@flow
count int 7@count 또는 f@countfloat binding으로 읽어 7.0i@count
label string “hello”@label 또는 f@label이 재현에서는 0.0s@label
입력에 없는 does_not_existf@out = @does_not_exist;새 out float에 0.0입력 속성 이름과 생성 노드를 확인
weight float 2.5@weight기본 float binding으로 2.5f@weight로 명시 가능

0이 나오는 경우는 있지만 모든 접두사 오류가 0으로 끝나지는 않습니다. 같은 재현에서 vector는 첫 성분만 읽히거나 그 성분만 바뀌었고, 작은 int는 float 값 7.0으로 읽혔습니다.

0이나 한 성분만 보이는 결과만으로 접두사 오류라고 단정할 수는 없습니다. 기존 속성의 타입과 VEX binding type이 다르면 첫 성분만 읽히거나 값이 변환될 수 있습니다. 이 재현에서는 입력에 없는 float 속성을 읽은 결과도 0.0이었습니다.

같은 Wrangle 코드 안에서는 처음 타입을 지정한 뒤 같은 속성의 다음 참조에서 접두사를 생략할 수 있습니다. 다음 예제는 하나의 Snippet에서 실행하며, 결과는 (2, 4, 6)입니다.

v@flow = {1, 2, 3};
@flow *= 2;

이 타입 지정은 Wrangle 사이에 이어지지 않습니다. 첫 Wrangle에서 vector를 만들었더라도, 다음 Wrangle에서 사용자 정의 속성으로 읽을 때는 v@flow를 다시 써 주세요.

Geometry Spreadsheet에서 이름과 클래스를 확인하세요

값이 이상하면 접두사를 바꾸기 전에 입력 geometry의 클래스와 정확한 이름부터 확인하세요. 같은 이름이 있어도 point가 아니라 primitive나 vertex 속성일 수 있습니다.

  1. 문제가 난 Wrangle 입력을 선택하세요. Geometry Spreadsheet에서 속성이 Point, Vertex, Primitive, Detail 중 어디에 있는지 확인하세요.
  2. 속성 이름과 값을 확인하세요. 대소문자나 철자가 다르면 새 이름으로 읽거나 쓸 수 있습니다. 값이 실제로 있는지도 확인하세요.
  3. 타입에 맞는 접두사를 쓰세요. float는 f@, vector는 v@, int는 i@, string은 s@로 맞추세요.
  4. Wrangle을 다시 cook하세요. Geometry Spreadsheet에서 복사된 값과 기존 값의 모든 성분을 비교하세요.

오타가 난 출력 이름은 오류 대신 새 속성을 만들 수 있습니다. v@flwo처럼 철자를 바꾸면 기존 flow를 바꾸지 않고 flwo라는 새 이름이 생길 수 있습니다. Spreadsheet에서 속성 목록도 함께 확인하세요.

두 번째 input의 속성은 예외가 있습니다. SideFX 문서에 따르면 @opinput1_flow처럼 다른 input을 읽을 때는 자동 타입 캐스팅이 적용되지 않으므로 v@opinput1_flow처럼 타입을 명시하세요.

SideFX Houdini 19.5 공식 문서에서 알려진 속성 이름과 다른 input 규칙을 더 확인할 수 있습니다.

접두사를 생략해도 되는지 헷갈리면 알려진 속성 이름인지 먼저 확인하세요. 사용자 정의 속성이라면 실제 타입에 맞춰 접두사를 쓰고, Geometry Spreadsheet에서 결과를 검증하세요. 속성 타입부터 맞추세요.

vfx 잡학지식

함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.