Lesson 5: VOP 포인트클라우드

포인트 클라우드의 개념을 이해하고 VEX 에서 어떻게 활용할 수 있는지 알아보자.


포인트 클라우드(Point Cloud) 란?

많은 사람들이 이 Point Cloud 를 이해하는데 어려움을 겪는다.

특히 초보자에게는 개념을 이해한 후에도 그것이 작업 과정에서 어떻게 쓰이는지 감을 잡기 쉽지 않다.


포인트 클라우드가 기능하는 방식은 다음과 같다.

예를 들어, A 라는 사람과 B 라는 사람이 있다.

A 가 B 에게 가까이 갈수록 A 는 B 의 성격을 닮아 간다.

반대로, A 가 B 에게서 떨어질수록 A 는 본인 성격을 되찾아 간다.


지오메트리 A, B 가 있고 각각에 소속된 점 a, b 가 있다.

만약 a 를 기준으로 특정 거리 안에 b 가 위치하면, b 가 갖고 있는 데이터를 a 가 취할 수 있다.

여기서 데이터라 함은 다름아닌 점의 어트리뷰트 값을 말한다.


위 그림에서 점 a2 는 b2 의 데이터를 취할 수 있지만 b1, b3 로부터는 취할 수 없다.

아직 감이 오질 않는가? 다음 예제를 보면 쉽게 이해할 수 있을 것이다.



포인트 클라우드 예제

후디니를 열고 /obj 에 스피어 지오메트리를 하나 만든다.



만들어진 'sphere' 노드를 더블클릭하여 Geometry 레벨로 들어간다.



'sphere1' 파라미터에 있는 'Primitive Type' 속성은 기본값을 유지한다.

기본값 'Primitive' 는 점의 개수도 한 개, 면의 개수도 한 개인 도형이다.



이제 그리드를 하나 만들어 주자.

이 그리드는 스피어가 색상 정보를 참조할 대상이 될 것이다.


역시 Geometry 레벨에서 Grid SOPColor SOP 을 생성한다.

Color SOP 은 지오메트리의 점이나 면의 색상을 컨트롤 하는 기능을 한다.

다음과 같이 연결하고 'color1' 노드의 파라미터창을 수정해 준다.



다음과 같이 다양한 그래디언트 색상을 가진 그리드가 되었다.

'color1' 노드의 'Color Type' 속성에 관한 자세한 설명은 생략한다.



이제 VEX 에서 포인트 클라우드를 사용할 차례다.

포인트 클라우드를 이용해서 스피어가 그 위치에 따라 그리드의 색상 정보를 전달 받을 것이다.

Attribute VOP 노드를 하나 생성해서 다음과 같이 연결해 준다.

'attribvop1' 에 연결시 그 순서에 주의하도록 한다. 그리드는 참조 역할만 하기 때문에 Input1 에 연결되어서는 안 된다. 색상을 변화시킬 대상인 스피어를 Input1 에 연결해 준다.


'attribvop1' 노드를 더블클릭해서 VEX Builder 레벨로 들어간다.

Point Cloud Open VOPPoint Cloud Filter VOP 을 하나씩 만들어서 다음과 같이 연결해 준다.

Point Cloud Open VOP 은 스피어 점 위치에서 가장 가까운 거리에 있는 그리드 점들을 걸러낸다.

Point Cloud Filter VOP 은 걸러낸 그리드 점들로부터 어떤 어트리뷰트를 얻을지 정한다.


파라미터창을 보면서 하나씩 차근차근 이해해 보자.

우선, 'pcopen1' 노드에서 'Point Cloud Texture' 속성( = file 인풋) 은 참조할 지오메트리를 말한다.

앞서 우리는 참조 대상인 그리드를 상위 레벨에 있는 'attribvop1' 노드 두 번째 인풋에 연결했었다.

그 두 번째 인풋을 의미하는 OpInput2 를 'pcopen1' 노드의 file 속성에 연결한다.


'Query Position' 속성은 어느 위치를 기준으로 가장 가까운 거리에 있는가를 파악한다.

즉, 현재 스피어의 위치가 그 기준점이 된다.

스피어의 위치값인 P 를 'pcopen1' 노드의 'Query Position' 속성( = P 인풋) 에 연결한다.



'Search Radius' 속성은 기준점에서 반경 몇 미터 이내에 있는 점들만 참조할지 정하는 범위이다.

기본값 0.1 은 스피어 위치에서 반경 0.1 미터 이내에서 발견된 점들에 한해서만 참조한다는 뜻이다.

이 값이 너무 작으면 점들이 아예 발견되지 않기 때문에 충분한 값을 넣어준다(9999).



'Number of Points' 속성은 반경 이내에서 발견된 것 중에 최대 몇 개의 점까지 참조할 것인지를 정한다.

만일 반경 이내에서 30개의 점이 발견되었다면 그 중 기준점에서 가장 가까운 10개의 점만 참조된다.

이 속성의 기본값이 10 이기 때문이다.

이 값이 1 이상일 경우, 또 다른 복잡한 설명글이 필요하므로 일단 1 값을 입력하도록 한다.




지금까지 'pcopen1' 노드가 수행한 일을 다시 한번 정리해 보자.

스피어 지오메트리가 참조할 대상으로 그리드 지오메트리를 선택한다(Point Cloud Texture).

스피어 위치(P) 를 중심으로 반경 9999미터(Search Radius) 이내에서 발견되는 그리드 점들을 걸러낸다.

발견된 그리드 점들 중에 P에 가장 가까운 점 한 개(Number of Points) 만 결정적으로 참조한다.

9999미터는 아주 큰 숫자이므로 그리드 지오메트리의 모든 점이 발견될 것이다.


자, 마지막까지 살아남은 한 개의 그리드 점을 참조하는 이유는 무엇인가?

그것은 그 점의 특정 어트리뷰트 정보값을 얻기 위해서이다.

얻고자 하는 어트리뷰트 이름을 'pcfilter1' 노드에서 정해준다.

'pcfilter1' 노드에서 'Channel' 속성값을 P 에서 색상정보인 Cd 로 바꿔준다.



'pcfilter1' 노드로부터 얻은 그리드 점의 색상정보를 'geometryvopoutput1' 노드 Cd 에 연결해 준다.

연결을 하자마자 스피어 색깔이 변하는 것을 확인할 수 있다.

'pcopen1' 과 'pcfilter1' 노드 사이에 연결된 'handle' 에 대해서는 일단은 무시하도록 한다.



포인트 클라우드 예제 마무리

결과를 확인하기 위해 VEX Builder 레벨에서 상위 Geometry 레벨로 이동한다.

키보드의 ctrl 키를 누른 상태로 'color1' 노드의 'template flag' 를 클릭한다.

SOP 노드의 Display Flag 에 대한 자세한 정보는 여기 에 있다.



다음과 같이 씬 뷰에서 스피어와 그리드 모두 볼 수 있다.

'sphere1' 노드를 선택하고 씬 뷰에 마우스를 댄 상태에서 엔터키를 누른다.

나타난 핸들을 이용해서 스피어를 그리드 위에서 여기저기 움직여 본다.

스피어의 색깔이 변하는 것을 볼 수 있는가?

ctrl 키를 누르지 않고 'template flag' 를 클릭할 경우, 색깔이 적용된 그리드를 볼 수 없다.


다음은 스피어를 그리드 위에서 회전시킨 영상이다.

스피어 위치가 변함에 따라 근처에 있는 그리드 점 색깔이 스피어로 전달되고 있다.