2018. 7. 12. 02:00ㆍStudy/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) |
결과물
"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 |