본문 바로가기
이펙트 (FX)/이펙트 팁 : Houdini

[Houdini/VEX] 프리미티브의 어트리뷰트를 샘플링하는 두 가지 방법 : primuv()와 uvsample() 비교

by Minkyu Lee 2024. 9. 24.

개요

후디니에서 프로시주얼하게 메시를 다룰 때, 자주 사용하게 되는 프리미티브 샘플링 함수에 대해 알아본다.
알아볼 것은, primuv와 uvsample 함수 두 가지다.
개념을 정확히 하지 않으면, uv라는 용어 때문에 헷갈리므로 정리를 한 것이다.
 
결론적으로, 두 함수에서 지칭하는 uv는 각각 다른 것이다.
 

방법 1 : primuv()

바리센트릭 좌표를 이용해, 어트리뷰트를 샘플링하는 함수다.
 
- 바리센트릭 좌표란?
한 면마다 고유하게 존재하는 좌표다.
3개 이상의 버텍스들 사이의 면에 형성된 좌표를 의미한다.
이것은 일반적인 uv를 의미하는 것이 아니다.
따라서 primuv는 v@uv로 샘플링하면 올바른 결과가 나오지 않는다.
 
- 인자에 uvw라고 적혀있는 이유는?
바리센트릭 좌표를 뜻하는 것이다.
uv 값을 넣으라는 뜻이 아니다.
 
- 결론
intersect나 xyzdist를 이용해 바리센트릭 좌표를 얻어왔을 때 사용한다.
 
- 예시

int prim;
vector uvw;
int hit = xyzdist(0, v@P, prim, uvw);

vector near_pos = primuv(0, "P", prim, uvw);

 

방법2 : uvsample()

일반적인 (텍스처를 입히는 용도) uv 좌표를 이용해, 어트리뷰트를 샘플링하는 함수다.
 
- 결론
v@uv로 샘플링할 때 유용하다.
또는, 다른 어트리뷰트를 uv처럼 사용해 샘플링할 때 유용하다. 


- 예시
uv값을 이용한 포지션 샘플링

v@P = uvsample(1, "P", "uv", v@uv);

 

다른 어트리뷰트값 활용

// 현재 지오메트리, 대상 지오메트리 둘 다 어트리뷰트를 uv처럼 할당해주어야함
v@road_u_uv = set(f@road_u, 0, 0);

// 할당한 어트리뷰트로 위치값 샘플링
v@road_curve_pos = uvsample(1, "P", "road_u_uv", v@road_u_uv);




추가정보

바리센트릭 좌표 (무게중심 좌표)
https://wjdgh283.tistory.com/entry/%EC%82%BC%EA%B0%81%ED%98%95-%EC%95%88%EC%97%90-%EC%9E%88%EB%8A%94-%EC%A0%90%EC%9D%98-%EB%AC%B4%EA%B2%8C%EC%A4%91%EC%8B%AC-%EC%A2%8C%ED%91%9Cbarycentric-coordinate-%EA%B5%AC%ED%95%98%EA%B8%B0

 

삼각형 내부점의 무게중심 좌표(barycentric coordinate) 구하기

다음 그림과 같이 3차원 공간의 삼각형 pqr내부에 점 a가 있을 때 이 점의 무게중심 좌표 (α, β, γ)를 구해보자. 삼각형 pqr과 점 a는 같은 평면 위에 존재한다고 가정한다. 이 말은 α, β, γ의 합이 1

wjdgh283.tistory.com

 

댓글