변압기 로고 애니메이션

7382 단어 HOUDINI

소개



새해 복 많이 받으세요. 후지 야마 타카시입니다. 새해! 라고 하는 것으로 트랜스포머풍의 뉴이어 로고를 만들었으므로, 그것에 대해 가볍게 설명시키고 받으려고 생각합니다. 잘 부탁드립니다.



조각 세팅




우선은 divide나 무엇인가로 분할합니다.

PrimWrangle에서 i@baseid = @primnum;로 baseid를 만듭니다.


복사합니다.
복사 후 PrimWrangle을 사용하여 아래 코드의 polyneighbours로 인접한 다각형의 프리미티브 번호 목록을 가져옵니다.
i@primid = @primnum;
s@name = concat("piece",itoa(@primid));

i[]@neighbours = polyneighbours(0, @primnum); 



polyExtrude로 두께를 붙입니다.

Pack 후 prim 속성의 baseid와 neighbours를 포인트에 승격하고, 아래의 코드로 복사 대상의 축에 있는 인접 객체의 번호를 취득해 neighbours에 추가합니다.
string group = concat( "base_",itoa(i@baseid));
int moreNeighbours[] = pcfind(0, group, "P", @P, ch("radius"), 3);
moreNeighbours = moreNeighbours[1::];

append( i[]@neighbours, moreNeighbours );

지금까지의 조작은 인접 PackObject의 넘버 리스트마저 취득할 수 있으면 무엇이든지 좋다.

계층 설정



계층화는 이전에 쓴 확산되는 박스 의 방법과 비슷합니다.
Solver 내에서 인접 객체를 활성화해 가면서, 처리하고 있는 순서대로 그 ptnum 의 리스트를 추가해 갑니다. 이 처리에 의해 자신의 부모 계층의 리스트를 취득하게 됩니다.


Solver 전에 준비할 속성입니다. hierarchy에 계층 구조 목록을 저장합니다.
i@rootid = @ptnum;

if((rand(@ptnum + 123123)<0.6)){
    i@top = 1;
    i@connected = 1;

    i@level = 0;
    i[]@hierarchy = array(@ptnum);
    }

Solver 내의 코드, 미리 준비하고 있던 인접 오브젝트의 넘버를 추적해 갑니다.
i@top = 0;

i[]@neighbours;
int unconnecteds[] = {};
foreach(int i; i[]@neighbours){
    if(point(0,"connected",i) == 0){
        append(unconnecteds,i);
    }
}

int active = 0;
if( len(unconnecteds) != 0 ){
    if(i@top == 1){
        active = 1;
    }else{
        if(rand(@ptnum+999 + @Frame) <  0.1 )active = 1;
    }
}

///select Next
if( active ){
    int selNex = floor( rand(@ptnum * 12 + @Frame) * len(unconnecteds) );
    int nextP = unconnecteds[selNex];

    setpointattrib(0, "top", nextP, 1);
    setpointattrib(0, "connected", nextP, 1);

    setpointattrib(0, "rootid", nextP, i@rootid);
    setpointattrib(0, "level", nextP, i@level + 1);
    int hierarchyPlus[] = i[]@hierarchy;
    append(hierarchyPlus, nextP);
    setpointattrib(0, "hierarchy", nextP, hierarchyPlus );
}

매트릭스 계층의 애니메이션



계층 변환은 아이의 계층으로부터 부모를 향해 걸어 갈 필요가 있습니다. 변환의 행렬에는 maketransform을 사용합니다. 쉽게 Pivot을 설정할 수 있기 때문입니다.
matrix xform = ident();
for(int i=0; i<len(@hierarchy); i++ ){
    int index = @hierarchy[::-1][i];
    vector move;
    move[floor( rand(index + 11)*3 )] = fit01(rand(index + 110),-1,1) * 0.05; 
    vector rotation; 
    rotation[floor( rand(index + 22)*3 )] = rint( fit01(rand(index + 220),-1,1) * 3 ) * 90;
    vector pivot = point(0,"P",index);
    xform *= maketransform(0, 0, move, rotation, set(1,1,1), pivot);
}

@P *= xform;
setattrib(0, "primintrinsic", "transform", @primnum, -1, matrix3(xform), "set");

이것이 기본 코드입니다. int index = @hierarchy[::-1][i]; 에서 계층 구조의 번호를 반대로 추적합니다.
index를 사용하여 랜덤 시드를 사용합니다. 계층 중심점은 point(0,"P",index)로 얻을 수 있습니다.

rottimingList와 movetimingList를 정화하여 각 계층의 애니메이션 타이밍을 설정하고 나란히 한 상자를 이동해 봅니다.
i[]@hierarchy;

float rottimingList[] = {};
float movetimingList[] = {};
float startFrame = 1;
for(int i=0; i<len(@hierarchy); i++ ){
    append(rottimingList, startFrame);
    startFrame += 2 + rand(@hierarchy[i] + 666) * 1;

    append(movetimingList, startFrame);
    startFrame += 4 + rand(@hierarchy[i] + 999) * 1;
}
matrix xform = ident();
for(int i=0; i<len(@hierarchy); i++ ){
    int index = @hierarchy[::-1][i];
    float rottiming = rottimingList[::-1][i];
    float movetiming = movetimingList[::-1][i];
    vector move;
    move [floor( rand(index + 11)*3 )] = rand(index + 111) * 1 * fit(@Frame,movetiming,movetiming + 5,1,0);
    vector rotation; 
    rotation[floor( rand(index + 22)*3 )] = floor( rand(index + 222) * 3 ) * 90 * fit(@Frame,rottiming,rottiming + 5,1,0);
    vector pivot = point(0,"P",index);
    xform *= maketransform(0, 0, move, rotation, set(1,1,1), pivot);
}

@P *= xform;
setattrib(0, "primintrinsic", "transform", @primnum, -1, matrix3(xform), "set");


이런 느낌입니다. 이 코드는 거의 그대로 분획한 입체 로고에 적응할 수 있습니다. 다소 조정한 코드가 아래와 같습니다.
i[]@hierarchy;

float rottimingList[] = {};
float movetimingList[] = {};
float startFrame = rand(@rootid + 333) * 20 + 1;
for(int i=0; i<len(@hierarchy); i++ ){
    append(rottimingList, startFrame);
    startFrame += 5 + rand(@hierarchy[i] + 666) * 5;

    append(movetimingList, startFrame);
    startFrame += 5 + rand(@hierarchy[i] + 999) * 15;
}

matrix xform = ident();
for(int i=0; i<len(@hierarchy); i++ ){
    int index = @hierarchy[::-1][i];
    float rottiming = rottimingList[::-1][i];
    float movetiming = movetimingList[::-1][i];
    vector move;
    move[floor( rand(index + 11)*3 )] = fit01(rand(index + 110),-1,1) * 0.05 * fit(@Frame,movetiming,movetiming + 5,1,0); 
    vector rotation; 
    rotation[floor( rand(index + 22)*3 )] = rint( fit01(rand(index + 220),-1,1) * 3 ) * 90 * fit(@Frame,rottiming,rottiming + 15,1,0);
    vector pivot = point(0,"P",index);
    xform *= maketransform(0, 0, move, rotation, set(1,1,1), pivot);
}

@P *= xform;
setattrib(0, "primintrinsic", "transform", @primnum, -1, matrix3(xform), "set");



작성한 파일은 이쪽이 됩니다.
h tps://d ゔぇ. 오, ぇ. 이 m/후ぃぇ/d/1이 f2사 B즈x1오gkYM키에h6PjcHMrD응BGーh/ごぃえw? 우 sp = 샤린 g

폰트는 이쪽으로부터 다운로드 했습니다만, 샘플 파일의 텍스트는 프리즈 시키고 있습니다.
htps //w w. 흠 ts 파세. 코 m / 카테고 ry / t rans fur rs

그럼 이번은 이상이 됩니다. 여기까지 읽어 주셔서 감사합니다!

좋은 웹페이지 즐겨찾기