【Houdini】선택된 페이스의 외주 포인트만을 취득한다

5642 단어 VEXHOUDINI
또한 노드가 아닌 vex에서 해보자 메모 시리즈입니다.
페이스의 선택 범위로부터 외주의 포인트를 추출하고 있습니다.

아래 준비





이렇게 준비한 그리드에서 group1를 만듭니다. 설명에서 알기 쉽도록 선택 부분은 color SOP로 색상을 지정합니다.

실제 처리




먼저 Primitive wrangle SOP를 만들고 프리미티브 (페이스) 그룹을 포인트 그룹으로 변환합니다. 빨간색 문자로 포인트 번호가 표시되는 것이 새로 만들어진 around 그룹입니다. 아직, 외주만의 상태가 되어 있지 않습니다.
if(inprimgroup(0, "group1", @primnum)){
    int points[] = primpoints(0, @primnum);
    foreach(int pt;points) {
        setpointgroup(0, "around", pt, 1);
    }
}

프리미티브가 그룹에 포함되어 있는지를 결정하기 위해 inprimgroup 함수를 사용하고 있지만 노드의 Group 매개 변수 필드에 입력하는 것이 더 쉽습니다. 여기에서는 굳이 vex의 처리로 하고 있습니다. 그룹의 지정도 @group_around 와 같은 애트리뷰트 방식은 취하지 않고, setpointgroup 함수를 굳이 사용하고 있습니다. 이것은, 각각이 외부 파라미터로서 들어오는 것을 본 코드 예제로 하기 때문입니다. (하드 코드를 피하기 쉽습니다.)


또한 Point Wrangle SOP를 연결하여 외주만 추출했습니다.
if(inpointgroup(0, "around", @ptnum)) {
    int prims[] = pointprims(0, @ptnum);
    int same_group_cnt = 0;
    int numprim = len(prims);
    foreach(int prim;prims) {
        if(inprimgroup(0,"group1", prim)) {
            same_group_cnt++;
        }
    }
    if(same_group_cnt > 2 && same_group_cnt == numprim) {
        setpointgroup(0, "around", @ptnum, 0);
    }
}

로직으로서는, 우선 그룹화 된 각 포인트에 관련하고 있는 복수 페이스 (이 예의 경우 1 포인트에 최대 4개)를 pointprims same_group_cnt ) 합니다. 모든 페이스가 group1 에 속하고 있는 경우는 선택 범위의 안쪽의 점이라고 판단해 around 그룹방 제거합니다. 다만 관련 페이스수가 1의 경우는 전체의 모퉁이의 포인트, 2의 경우는 전체의 외주의 포인트이므로 그대로 남기고 있습니다.


상기 논리로 복잡한 선택 상태나, 삼각 폴리곤을 섞어 시험했습니다만 처리는 잘 되고 있는 것 같습니다. (5각형 이상의 이른바 n곤은 이용할 예정이 없기 때문에 확인하고 있지 않습니다.)

요약



가능한 한 하나의 wrangle 노드로 대응하고 싶었습니다만, 2개로 나누는 것이 편했기 때문에 그렇게 했습니다. detail 당으로 처리를 돌리면 할 수 없을 것 같지만 SIMD로 병렬 처리시키고 싶다고 Compile SOP로 둘러싸는 것도 가능했기 때문에 이것으로 좋을까라고 생각합니다. 그렇게 할 수있는 SOP 노드를 찾았지만 찾을 수 없습니다. 알고 계시다면 알려주세요. 그룹 노드계의 설정에 따라 가볍게 할 수 있을 것 같은 예감도 합니다.

좋은 웹페이지 즐겨찾기