GROUND_DESTROYED

2018. 7. 12. 02:00Study/Houdini


SCREEN SHOT



BASIC_GEO

GROUND 를 만들고 "drawcurve" 를 이용해서 부서질 부분을 정하는 과정



"VOP" 을 이용해 "mountain" 에서 부족했던 부분을 채운다. 또 Cd에 연결해줌으로써 viewport 에서 굴곡을 보기 쉽게 한다



cutter에서 사용했던 "noise vop"




MAIN_BOOLEAN

"Boolean" 을 이용해서 "CUTTER"를 통해 3조각으로 나눈다.



결과 이미지



"Boolean" 을 사용할때 쓰는 설정

"Boolean" 으로 나누게 되면 절단면에 normal 값이 없기 때문에 B inside A group 을 켜줌으로써 "Normal" 노드에서 Group을 지정해서 생성한다.

http://www.sidefx.com/docs/houdini/nodes/sop/boolean.html



"Split" 노드를 이용해서 선택하고 싶은 부분만 선택해 운용한다.




MIDDLE_CUT_BOOLEAN

"Boolean" 을 이용해서 쪼갠다.

"DrawCurve" 에서 가운데 Stroke 부분을 선택해 가지고 온다음 "Scatter" 를 통해 Point 생성후 RandNormal 을 만들어준다.

"Grid" 를 Point 에 "Copy" 노드를 통해 복사를 해준다음 Noise를 주고 "Boolean" 으로 쪼갠다.



결과물



"DrawCurve" 에서 가운데 Stroke 부분을 가운데로 정렬시킨다.

1
centroid("../GROUND/",D_Y)

cs




결과물



"Scatter" 로 Point 를 생성후 Normal 값을 Rand 하게 준다.



"Copy to point" 노드를 통해 Point에 "Grid" 를 복사한다.

다음 "Copy" 노드를 통해 현재 "Grid" Geo 들을 한번 복사해준다.

다음 "Connectivity" 노드를 통해 class attr를 만들어 준다.



class atti 를 통해 Geo 들을 "VOP"으로 가지고 오고 "Random" 을통해 노이즈를 rand 하게 준다. 



결과값



"Boolean" 으로 나눈다음 "Assemble" 을통해 name attr 를 생성한다.

각 piece 마다 volume 을 측정해야 함으로 packed 은 하지 않는다.




MEASURE

"Foreach Loop" 을 이용해서 각 piece 에 접근해 "Measure" 을 통해 volume attr 를 만든다.



centroid 를 이용해서 측정해준다.



이번 "Assemble" 에서 packed 을 해준다. 

Name attr 는 굳이 만들어주지 않아도 된다.



측정된 volume 값으로 SIZE 를 구분하여 "BIG" , "SMALL" 로 나눈다.




"BIG"



"SMALL"




BIG_BOOLEAN

"Foreach Loop" 을 이용해서 각 piece 에 접근해 "BOOLEAN" 을 통해 PIECE 를 만들고 RENAME 도 해준다.



결과물



조각으로 만들고 난후 RENAME 을 통해 어떤 Piece 안에서 얼마나 쪼개져 있는지 확인 할 수 있게 만든다.

1
2
string oldname = point(1"name"0);
s@name = sprintf("%s_sub_%s",oldname, i@class); 
cs



"Assemble" 에서 Packed 만 한다.



"Assemble" 에서 Packed 결과물



"Pack" 을 통해 큰 piece에 한 point 만 남게 한다.



"Pack" 결과물



CONSTRAINT

"Connect Adjacent Pieces" 을 이용해서 각 point 마다 line 을 연결해주어 Constraint 를 만들어 준다.



결과물



SMALL_BOOLEAN

BIG BOOLEAN 노드에서 조금만 변형한다.



결과물



너무 작은 Piece 들은 쪼개지 않아도 됨으로 volume attr 를 이용하여 분류한다.



결과물



분류한다음 매우 작은 piece 들은 SIM 하는데 있어 무겁기 때문에 죽여준다.

1
2
3
if(@P.y<ch("kill_parameter")){
    removeprim(0,@primnum,1);
    }
cs



우리가 보지 않는 쪽의 Piece 들은 "Boolean" 을 통해 삭제 해준다.



결과물



SIM 을 위해 time_offset attr 를 생성한다.

1
@time_offset = ch("time");
cs




START_FRAME ATTR / DIST ATTR

start_frame attr 와 dist attr 생성 / sim 을 위한 과정



"Ray" 노드를 이용해서 dist attr 를 만든다.




start_frame attr 와 can_activate attr를 만든다.

(can_ativate 타이핑 오류)

1
2
f@start_frame = ch("time_scale"* @dist + @time_offset;
i@can_activate = 1;
cs




SIDE

"Voronoi Fracture" 를 통해서 쪼개준다.

"Scatter" 에서 binsidea attr 만 선택에 point 생성후 진행




name attr 에서 piece 로 하면 겹칠수가 있어 outside attr 로 바꿈



CALC & ANIMATION

"VDB" 를 통해서 한쪽면을 포함시키고 attr 를 부여시긴다.





1
i@side = volumesample(1,0,@P) < 0;
cs



결과물



모든 point에 active = 0 을 부여해 sim 을 못하게 하고 animated =1 을 부여한다.

1
2
i@active = 0;
i@animated = 1;
cs


@side=1 attr 를 통해 animation 한다.



CONSTARINT

"Attrib Copy" 를 통해서 필요한 attr start_frame 을 가지고 온다.

Match by Attribute 를 name 으로 설정해 이름으로 match 시킨다.

p attr 로 하면 안된다.



결과물



attr copy 전에 "Unpack" 을 통해 attri copy 할 부분만 unpack 해주고 필요한 attr 들은 transfer 해준다.


offset_frame attr 작동하지 않는다. 이유를 모르겠다.

1
2
3
4
5
s@constraint_name="glue";
f@strength = 100000.0;
 
float offset_frame = fit(rand(i@class),0,1,ch("min"),ch("max"));
f@break_frame = @start_frame + @offset_frame;
cs




SIM



"Rigid Body Solver" 에 "Sop Solver"



attr 수정없이는 작동하지 않는다. 전에 active = 0; 을 했기 때문에 그렇기에 $F 에 맞추어 if 문을 써 start_frame attr 를 생성

1
2
3
@start_frame -= 2.5;
if($F>@start_frame)
    i@active=1;
cs



1
@mass = max(@mass,0.0001);
cs



constraint 의 "SopSolver" 는 "Relationship_geo" 에 연결해준다.

이것도 active 와 같이 frame 에 따가 broken 을 넣어준다.

1
2
if(@Frame>@break_frame)
    @group_broken=1;
cs








'Study > Houdini' 카테고리의 다른 글

BUILDING_FRACTURE  (0) 2018.07.27
SMOKE  (0) 2018.07.14
building_destroyed  (0) 2018.07.07
voronoi_fracture  (0) 2018.03.25
round_to_integer  (0) 2018.02.08