Houdini의 VEX에서 addprim과 addpoint의 행동에 대해

18012 단어 VEXHOUDINI
요전날 Houdini의 VEX내에 있어서의 addprimaddpoit 에 의해 생성되는 프리미티브나 포인트의 번호에 대한 거동에 성대하게 걸렸기 때문에 비망록을 겸한 기사가 됩니다.
잡은 VEX이지만 용서해주십시오.

실제로 만든 것



일반 그리드에서 45도 기울어 진 대각선 그리드를 생성하려고했습니다.
제일 상류가 되기 때문에, copy계의 노드를 사용하지 않고, VEX로 빨리 처리할 수 없을까 생각해, 기본적으로는 VEX로 실장했습니다

결과와 노드는 다음과 같은 느낌



두 개의 Attribute Wrangle에서 addpoint 또는 addprim

addprim과 addpoint로 걸린 거동



기본적으로 지금까지는 add계의 VEX를 사용할 때는 Run over를 Detail(once only)로 하고 있었으므로 문제는 되지 않았습니다만, Run over를 point나 primitive로 해, 동일 Wrangle내에서, 그 생성된 point나 primitive에 대해서 조작을 실시하고 싶은 경우, 각 번호는 어떻게 되는 것인가, 라고 하는 점이 문제가 되었습니다.
(나중에 사용한다.

결론에서 쓰면 Run over이 primative 또는 point인 경우, addprim이나 addpoint로 생성되는 각 요소의 번호는 현재의 @ptnum 이나 @primnum 의 애트리뷰트의 수치와 무관하게 생성됩니다. 순서대로,addvertex 또는 @numprim + n 입니다. (n>=0)

실제 노드에서의 구현



from_prim



VEX (from_prim)
int maxiteration = primvertexcount(0,@primnum);

int ptoffset = @numpt;
int primoffset = @numprim;

vector posarray[];
int ptnumarray[];

for (int i=0; i<maxiteration; i++){
int linearvtx = vertexindex(0, @primnum, i);
int pt = vertexpoint(0, linearvtx);
ptnumarray[i]=pt;
vector pos = point(0,"P",pt);
posarray[i] = pos;
}

for (int j=0; j<maxiteration; j++){
int num = (j + 1)%maxiteration;
vector vtxpos1 = posarray[j];
vector vtxpos2 = posarray[num];
vector middlepos = (vtxpos1 + vtxpos2)/2;
addpoint(0,middlepos);
}

addprim(0,"poly");

for (int k=0; k<maxiteration; k++){
addvertex(0, primoffset ,ptoffset + k );
}

removeprim(0,@primnum,1);


프리미티브를 구성하는 각 포인트의 인접한 2 정점의 중점에 @numpt + n 로 포인트를 생성해, addpoint 로 생성한 프리미티브에 addprim(범용성을 갖게 한다면 각 엣지를 기점에 처리를 해야 한다고 생각한다)

최소로 실행하면 다음과 같은 느낌


from_point



VEX(from_point)
int primoffset = @numprim;
int ptoffset = @numpt;

if (neighbourcount(0,@ptnum)==4) {

    int neighbourptnumarray[] = neighbours(0,@ptnum);
    int num2 = neighbourptnumarray[2];
    int num3 = neighbourptnumarray[3];

    neighbourptnumarray[2] = num3;
    neighbourptnumarray[3] = num2;

    neighbourptnumarray = reverse(neighbourptnumarray);

    addprim(0,"poly");

    int maxiteration = len(neighbourptnumarray);    

    for(int i=0;  i<maxiteration; i++){
        vector pos1 = point(0,"P",neighbourptnumarray[i]);
        vector pos = (@P + pos1)/2;
        addpoint(0,pos);
        addvertex(0,primoffset,ptoffset + i);
        }
}

removepoint(0,@ptnum,1);


4개의 포인트와 인접하고 있는 포인트에 대해서, 그것들과 자신과의 각 중점에 포인트를 생성해 프리미티브를 작성한다고 하는 것입니다.
(도중 분명하게 범용성이 누락되는 부분이 있으므로 요정일까라고 생각하고 있습니다.)

최소로 이렇게


각 Wrangle에서 addvertex 에서 대상 addvertex , prim_num 가 각각 point_num 또는 @numprim + n또, 이번은 자신의 가독성을 우선했기 때문에, primoffset이나 ptoffset와 변수 정의를 하고 있습니다만, 직접 @numprim 이나 @numpt 를 사용해도 문제 없었습니다.

여담



도중에 작성해, 실제로 addprim나 addpoint의 거동의 해결에 이르렀을 때의 것도 두어 둡니다
각 프리미티브의 중심에 포인트를 삽입하여 각 모서리와 연결되는 삼각형 다각형을 생성합니다.



VEX(insert_point)
int maxiteration = primvertexcount(0,@primnum);

int ptoffset = @numpt;
int primoffset = @numprim;



vector posarray[];

int ptnumarray[];

for (int i=0; i<maxiteration; i++){

int linearvtx = vertexindex(0, @primnum, i);
int pt = vertexpoint(0, linearvtx);

ptnumarray[i]=pt;

vector pos = point(0,"P",pt);
posarray[i] = pos;
}

vector pointpos = avg(posarray);

addpoint(0,pointpos);



for (int j=0; j<maxiteration; j++){

int firstpt = ptoffset ;
int secondptindex = j;
int thirdptindex = (j+1)%4;

addprim(0,"poly");
addvertex(0, primoffset + j ,firstpt );
addvertex(0, primoffset + j , ptnumarray[secondptindex]);
addvertex(0, primoffset + j , ptnumarray[thirdptindex]);

}

removeprim(0,@primnum,0);


샘플 파일



일단 샘플 파일을 둡니다.
h tps://d ゔぇ. 오, ぇ. 이 m/후ぃぇ/d/1r-GZゔぉ아t2아우 r3ㅎkrHbぺySN찜 Xc8jwV/ゔぃ에w? 우 sp = 샤린 g

실수와 질문 외에, 더 간단하게 써 주었다! 같은 것도 부담없이!

2021/10/24 추가



int로 변수 선언하고 나서 addpoint가 되어 addprim을 하는 것으로, 생성되는 요소의 번호를 반환값으로서 격납할 수 있다고 합니다.
라고 할까 공식의 VEX 문서에 보통으로 쓰여졌네요,,,
int hoge = addpoint(0,pos);

좋은 웹페이지 즐겨찾기