중요했던 부분:
- nearpoints() & foreach 복습
우선적으로 nearpoints()와 foreach를 활용하여 pointclounds와 같은 형상을 만들어 보았다. 이는 box안에서의 랜덤한 위치의 7개의 점들로부터 box안을 꽉꽉이루는 포인트들중 가장 가까운 포인트들을 골라 addpoint()로 점을 생성해주어 7개의 포인트의 주위에만 점들이 반경안으로 생성되게끔 설정해보았다. 이를 실현시켜주기 위해 우선 아래와 같이 노드를 꾸며보았다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 1번인풋으로 들어온 geometry를 이루는 점들중
특정 반경안에서 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer array variable pts에 저장*/
int pts[] = nearpoints (1, @P, chf ("D"), chi ("NUM"));
// 방금 만든 integer array pts를 integer array attribute pts로 보여줌
i[]@pts = pts;
// 각기 필요한 variables을 선언함
int pt; // array pts에서 각각의 값을 불러오기 위한 integer variable pt설정
// integer variable pt의 값의 포인트 넘버를 가진 포인드들의 위치를 저장시키기 위한 vector
varaible pos*/
vector pos;
foreach (pt; pts) { // integer array variable pts안에서 pt값을 모두
pos = point (1, "P", pt); // pt에 해당하는 포인트 넘버를 가진 포인트들의 포지션값을 pos에 저장
addpoint (0, pos); // 위에 정한 pos값에 해당하는 위치에 점들을 모두 생성
}
이와 같이 코드를 작성해보아 위에서 설명했듯이 7개의 포인트들의 가까운 포인트들을 반경안으로 만들어주어 cloudpoints같은 모양을 완성해 보았다.
- pcfind(): PC Find Function & setpointattrib(): Set Point Attribute Function
pcfind()은 array의 정보를 구해주며 nearpoints()와는 다르게 어떠한 attribute의 정보를 기반으로 찾아줄지 정해 줄 수 있다. 이는 두번째 정보로 입력해 줄 수 있으며 이와 같이 식을 작성해 줄 수 있다.
/* 1번 인풋으로 들어온 geometry의 모든 포인트 위치 정보랑 0번 인풋으로 들어오고 있는 원본에 포지션정보를
대조하여 점을 찾는다. 이때 반경은 d의 값 그리고 점의 갯수는 num의 값으로 조절된다.*/
pcfind (1, "P", @P, chf("D"), chi("NUM"));
setpointattrib()은 특정 값을 불러와 attribute를 생성하여 거기다가 특정포인트들에 저장해 주는 function이다. setpointattrib()도 마찬가지로 다섯개의 정보가 들어가며 첫번째로는 geohandle인 0, 어떤이름을 가진 attribute를 만들어 줄지, 어떤 포인트인지, 값, 그리고 정보를 안착시켜줄 "set"을 입력해준다.
이때 이를 더욱 확연하게 볼 수 있게 색깔 값을 지정해 주어봤는데 이와 같이 중심점만 빼고 색깔값이 이루어진 것을 확인 할 수 있었다. 우선 attribute vop으로 box안의 내부의 점들의 색깔을 noise에 맞게끔 정해주었다.
이때 위에 작성했던 코드와 같이 7개의 점들로부터 가장 가까운 점들만 생성이 되게끔 코드를 작성해주고 이에 해당되는 색을 지정해주기 위해 이와 같이 작성해주었다. 이때 새로운 function들일 사용해주었는데 지금까지 배웠던 nearpoints()와 매우 유사한 것을 알 수 있었다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 1번인풋으로 들어온 geometry를 이루는 점들중
특정 반경안에서 가장 포지션적으로 가까운 포인트들의 포인트 넘버들를 찾아 integer array variable pts에 저장*/
int pts[] = pcfind (1, "P", @P, chf ("D"), chi ("NUM"));
// 방금 만든 integer array pts를 integer array attribute pts로 보여줌
i[]@pts = pts;
// 각기 필요한 variables을 선언함
int pt;
vector pos; // array pts에서 각각의 값을 불러오기 위한 integer variable pt설정
// integer variable pt의 값의 포인트 넘버를 가진 포인드들의 위치를 저장시키기 위한 vector
varaible pos*/
vector col; // vector varaible col값을 선언하여 포인트들의 색을 지정시켜줄 variable생성
foreach (pt; pts) { // integer array variable pts안에서 pt값을 모두
pos = point (1, "P", pt); // pt에 해당하는 포인트 넘버를 가진 포인트들의 포지션값을 pos에 저장
col = point (1, "Cd", pt); // pt에 해당하는 포인트 넘버를 가진 포인트들의 컬러값을 col에 저장
int mp = addpoint (0, pos); /* 위에 정한 pos값에 해당하는 위치에 점들을 모두 생성하여 integer variable
mp라는 file값으로 저장한다*/
// col값을 불러와 Cd라는 attribute를 생성하여 거기다가 mp값이라는 포인트들에 저장해준다.
setpointattrib (0, "Cd", mp, col, "set");
}
- minpos() 복습
rubbertoy와 circle을 활용하여 minpos()가 기본적으로 어떻게 작동되었는지에 대해 간단히 복습해보았다. circle이 0번 인풋으로 들어와서 메인 geometry로 생성해준다음 rubbertoy를 1번 인풋으로 연결하여 레퍼런스로 지정해주어 minpos()를 적용하여 circle의 포인트 위치값들이 rubbertoy를 이루는 point들중 가장 가까운 포인트들로 재설정되도록 설정해주었다.
/* 0번인풋 geometry로 부터 1번 인풋 geometry까지의 가장 가까운 포인트들의 위치로 0번 인풋 geoemetry를
이루는 포인트들을 재설정하여라*/
@P = minpos (1, @P);
이때 방금 배운 nearpoints()와 foreach를 활용하여 비슷하지만 약간씩 다른 모양의 쉐입을 완성해보았다. (이는 minpos()는 vector값을 내보내어 primitive의 중심에도 포인트가 위치할 수 있지만 nearpoints()는 integer 값을 내보내어 primitive의 포인트부분만 포인트가 위치되기 때문에이다)
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 1번인풋으로 들어온 geometry를 이루는 점들중
특정 반경안에서 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer array variable pts에 저장*/
int pts[] = nearpoints (1, @P, chf ("D"), chi ("AMOUNT"));
// 각기 필요한 variables을 선언함
int pt; // array pts에서 각각의 값을 불러오기 위한 integer variable pt설정
// integer variable pt의 값의 포인트 넘버를 가진 포인드들의 위치를 저장시키기 위한 vector
vector pos;
foreach (pt; pts) { // integer array variable pts안에서 pt값을 모두
pos = point (1, "P", pt); // pt에 해당하는 포인트 넘버를 가진 포인트들의 포지션값을 pos에 저장
}
// 위에서 선언한 pos값에 해당하는 위치에 0번 인풋 geometry를 이루는 포인트들의 위치를 모두 재설정
@P = pos;
이때 nearpoints()와 또 거의 유사한 function을 사용하여 동일한 쉐입을 만들어 주는 것이 가능한데 이는 pcfind()를 이용해보았다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 1번인풋으로 들어온 geometry를 이루는 점들중
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer array variable pts에 저장*/
int pts[] = pcfind (1, @P, chf ("D"), chi ("AMOUNT"));
// 각기 필요한 variables을 선언함
int pt; // array pts에서 각각의 값을 불러오기 위한 integer variable pt설정
// integer variable pt의 값의 포인트 넘버를 가진 포인드들의 위치를 저장시키기 위한 vector
vector pos;
foreach (pt; pts) { // integer array variable pts안에서 pt값을 모두
pos = point (1, "P", pt); // pt에 해당하는 포인트 넘버를 가진 포인트들의 포지션값을 pos에 저장
}
// 위에서 선언한 pos값에 해당하는 위치에 0번 인풋 geometry를 이루는 포인트들의 위치를 모두 재설정
@P = pos;
이때 addpoint를 활용하여 rubbertoy를 구성하는 포인트들의 위치에 nearpoints()로 생성된 위치에 새로운 포인트들을 생성해주면 이와 같이 모션을 만들어 줄 수 있었다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 1번인풋으로 들어온 geometry를 이루는 점들중
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer array variable pts에 저장*/
int pts[] = pcfind (1, @P, chf ("D"), chi ("AMOUNT"));
// 각기 필요한 variables을 선언함
int pt; // array pts에서 각각의 값을 불러오기 위한 integer variable pt설정
// integer variable pt의 값의 포인트 넘버를 가진 포인드들의 위치를 저장시키기 위한 vector
vector pos;
foreach (pt; pts) { // integer array variable pts안에서 pt값을 모두
pos = point (1, "P", pt); // pt에 해당하는 포인트 넘버를 가진 포인트들의 포지션값을 pos에 저장
addpoint (0, pos); // 위에 선언한 pos값에 해당하는 위치에 포인트들을 생성
}
이와 같이 circle로 부터 가장 rubbertoy를 이루는 가장 가까운 포인트들이 생성된것을 볼 수 있었다.
이때 위와 같은 방식으로 가장 가까운 포인트들을 새롭게 형성하면 여러개의 포인트들이 rubbertoy표면에서 생성되는 것을 볼 수 있다. 이때 이들의 점들값의 위치의 평균값을 구해 오직 하나의 포인트만 circle을 이루는 포인트의 대응해 생기게 할 수도 있었다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 1번인풋으로 들어온 geometry를 이루는 점들중
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer array variable pts에 저장*/
int pts[] = pcfind (1, @P, chf ("D"), chi ("AMOUNT"));
// 각기 필요한 variables을 선언함
int pt; // array pts에서 각각의 값을 불러오기 위한 integer variable pt설정
// integer variable pt의 값의 포인트 넘버를 가진 포인드들의 위치를 저장시키기 위한 vector
// 평균값을 구하기 위해 pos값을 우선 0으로 지정
vector pos = 0;
foreach (pt; pts) { // integer array variable pts안에서 pt값을 모두
pos += point (1, "P", pt); // pt에 해당하는 포인트 넘버를 가진 포인트들의 포지션값을 pos에 저장
addpoint (0, pos); // 위에 선언한 pos값에 해당하는 위치에 포인트들을 생성
}
/* 누적하여 얻어진 vector variable pos에 array pts값을 나누어 생성된 포인트들의 위치 평균값을 내어
circle의 @P값으로 생성하여라*/
@P = pos/len (pts);
- pcopen(): PC Open Function
pcopen()은 pcfind()와 비슷하지만 file의 형태로 내보내어 특정 variable에 저장될 수 있게 해준다. 이는 addpoint()로 만들어진 값을 integer variable로 저장해주는 행위와 비슷하게 작동된다고 생각하면 된다. 들어가는 정보는 위에 쓰여진 pcfind()와 동일하다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 1번인풋으로 들어온 geometry를 이루는 점들중
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer variable mypc에 File로 저장*/
int mypc = pcopen (1, "P", @P, chf ("D"), chi ("AMOUNT"));
- pcfilter(): PC Filter Function
pcfilter()은 Point Cloud로 불러와진 정보에 평균을 내준다. 이는 아까 평균을 구해준 원리와 동일하게 작동되는 것을 알 수 있으며 정보로는 pcopen()으로 만들어진 가장 가까운 포인트들의 정보를 가진 file과 어떤 attribute값의 평균을 구하여 원본 포인트안에 저장해줄지 들어간다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 1번인풋으로 들어온 geometry를 이루는 점들중
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer variable mypc에 File로 저장*/
int mypc = pcopen (1, "P", @P, chf ("D"), chi ("AMOUNT"));
// 위에서 선언한 mypc값들 즉 여러 가까운 포인트들의 @P 포인트 위치값의 평균을 구하여 원본 포인트 위치로 저장
@P = pcfilter (mypc, "P");
위와 같은 방법으로 포인트들의 평균을 구하여 이와 같이 pcfind()로 반경이 크고 여러개의 포인트를 구할지라도 circle을 이루는 포인트 하나에 대응되는 하나의 포인트들만 생성되게끔 구현해주었다.
이때 포지션값이 아닌 여러 가까운 포인트들의 @N 포인트 노멀값에 평균을 구하여 원본 노멀값으로 저장해주기 위해 아래와 같은 코드를 작성해주기도 하였다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 1번인풋으로 들어온 geometry를 이루는 점들중
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer variable mypc에 File로 저장*/
int mypc = pcopen (1, "P", @P, chf ("D"), chi ("AMOUNT"));
// 위에서 선언한 mypc값들 즉 여러 가까운 포인트들의 @N 포인트 노멀값의 평균을 구하여 원본 포인트 위치로 저장
@N = pcfilter (mypc, "N");
// normal값을 크게 보기 위하여 noramlize()를 사용하여 vector크기값을 1로 만들어주고 5를 곱해 길이를 늘려줌
@N = normalize (@N)*5;
- uvquickshade
uvquickshade노드는 geometry표면상에 uv값에 알맞게 사진이나 그림을 scene view상에서 보여줄 수 있게끔 할 수 있게 하는 노드로 texture map -> open floating file chooser을 통해 알맞는 파일을 설정 해 줄 수 있다.
- 본격적인 pcopen()과 pcfilter() 활용
이때 cgwiki님에 제공하신 여러 예제들을 직접 실행해보아 pcopen()과 pcfilter()같은 function들이 어떠한 원리로 작동되는지 어떠한 결과를 낳는지 실험해보았다. 우선 아래와 같은 방법으로 노드들을 구성해주었다. grid에 texture map으로 특정 그림을 scene view상에서 드러나게 한다음 scatter로 grid를 모두 포인트들로 만들어주고 그다음에 vop으로 texture map을 uv값으로 부터 Cd값으로 나오게끔 모든 포인트들의 색이 그림의 uv값에 알맞게 설정되게끔 하였다.
이 그림을 pcfilter()로 색깔값들 사이에 평균치를 두어 마치 blur가 적용되는 것 같은 것이 구현 가능하였는데 이는 이러한 코드로 원리가 실행되었다. 이로인해 포인트들 끼리 가까운 사이에 평균값들이 적용되어 마치 사진이 흐려진것 같은 형상을 구현할 수 있었다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 1번인풋으로 들어온 geometry를 이루는 점들중
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer variable pc에 File로 저장*/
int pc = pcopen (0, "P", @P, chf ("DIST"), chi ("MAXPOINTS"));
// 위에서 선언한 pc값들 즉 여러 가까운 포인트들의 @Cd 포인트 컬러값의 평균을 구하여 원본 포인트 위치로 저장
@Cd = pcfilter (pc, "Cd");
이때 만약 grid의 색깔 값이 아닌 @P값으로 평균치를 만들어 주어 grid의 @P값으로 보여주면 어떻게 될까? 이는 설명하기는 힘들지만 (CGWiki님도 interesting but useless라고 언급하심) 아래와 같이 grid가 생각보다 maxpoint값의 파라미터 값이 커질 수록 더욱 파괴된 형태로 형성되는 것을 알 수 있었다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 1번인풋으로 들어온 geometry를 이루는 점들중
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer variable pc에 File로 저장*/
int pc = pcopen (0, "P", @P, chf ("DIST"), chi ("MAXPOINTS"));
// 위에서 선언한 pc값들 즉 여러 가까운 포인트들의 @P 포인트 위치값의 평균을 구하여 원본 포인트 위치로 저장
@Cd = pcfilter (pc, "Cd");
또한 pighead와 같이 입체적인 geometry를 통해 pcfilter()가 어떤 방식으로 작동되는지도 한번 실험해보아 흥미로운 결과를 얻어보았다. 우선 아래와 같이 노드를 구성하여 보아 pighead의 color값이 @N값에 따라 나타나도록 설정한 다음 add를 통해 point들만 남기고 전부 삭제해 두어 점으로 구성되게끔 세팅해두었다.
그다음 아래와 같은 vex code를 완성해보아 흥미로운 결과를 나타나게끔 유도해주었다. 아래와 같이 작성된 코드는 아까 grid의 두번째 실험에서 작성한 코드와 동일하며 grid가 평평하여 2d적인 결과를 불러왔던 것과는 달리 3d적으로 조금더 점들이 분사되고 maxpoints의 파라미터값을 늘릴 수록 더욱 형태가 붕괴되는 뷰를 완성해보았다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 1번인풋으로 들어온 geometry를 이루는 점들중
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer variable pc에 File로 저장*/
int pc = pcopen (0, "N", @N, chf ("DIST"), chi ("MAXPOINTS"));
// 위에서 선언한 pc값들 즉 여러 가까운 포인트들의 @P 포인트 위치값의 평균을 구하여 원본 포인트 위치로 저장
@P = pcfilter (pc, "P");
- Ambient Occlusion
Ambient Occlusion은 물체에 빛이 얼마나 맺힐지의 대한 하나의 표현 방식중 하나로써 기존 Day 9때 배웠던 것과 같이 표면상에서 위치상 움푹 들어갈 수록 어둡고 튀어나와 있을 수록 밝아보이는 원리에 대해 알 수 있었다. 그러므로 Cgwiki님은 crag를 활용하여 또 재미있는 pcfilter()의 활용의 예시를 제시해주었다. 우선 아래와 같은 코드로 pcfilter()가 어떠한 방식으로 ambient occlusion을 구현해 낼 수 있을지 보여주었다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 0번인풋으로 들어온 geometry를 이루는 점들
중 (즉 자기 자신을 레퍼런스로 보내버림)
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer variable pc에 File로 저장*/
int pc = pcopen (0, "P", @P, chf ("D"), chi ("AMOUNT"));
// 위에서 선언한 pc값들 즉 여러 가까운 포인트들의 @P 포인트 위치값의 평균을 구하여 vector variable pcp에 저장
vector pcp = pcfilter (pc, "P");
/* 이에 distance()로 geometry를 이루는 모든 포인트들로부터 위에서 선언한 vector variable pcp까지의
거리를 구해 float variable dist값에 저장*/
float dist = distance (@P, pcp);
// 방금전 구한 dist값을 @Cd 컬러값으로 보여주면서 움푹 들어간 값은 어둡게 튀어나온 값은 밝게끔 설정해줌
@Cd = dist*3+0.3;
위의 코드로 인해 모든 포인트들 상에서 평균값들의 거리로써 컬러값이 정해지도록 하여 울퉁불퉁함을 표현해주었다. 근데 float variable dist값에 문제가 있는데 distance()는 안에 들어가는 수치가 무엇이든 절댓값으로 양수를 내보내 주는데 이는 어두워야할 부분에 밝게 표현해 준다는 문제가 있다. 그치만 느낌을 내는 정도로는 이쯤으로도 도움이 된다는 것을 알 수 있다.
이때 포지션의 값이 아닌 노멀값에 dot()을 적용하여 ambient occlusion을 구현해주면 어떠한 원리로 작동될까와 어떠한 결과를 낳을까?
이는 dot()을 활용하면 실제 노멀과 주변에 있는 평균 노멀에 의한 dot product를 지정하여 실제 normal과 평균 normal의 각도 차이가 적게 나면 밝게, 각도차이가 많이 나면 어둡게 표현되게끔 설정할 수 있게끔 하여 이러한 방식을 채택해보았다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 0번인풋으로 들어온 geometry를 이루는 점들
중 (즉 자기 자신을 레퍼런스로 보내버림)
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer variable pc에 File로 저장*/
int pc = pcopen (0, "P", @P, chf ("D"), chi ("AMOUNT"));
// 위에서 선언한 pc값들 즉 여러 가까운 포인트들의 @N 포인트 노멀값의 평균을 구하여 vector variable pcn에 저장
vector pcn = pcfilter (pc, "N");
/* dot()을 활용하여 실제 노멀과 주변에 있는 평균 노멀에 의한 dot product를 지정하여 실제 normal과
평균 normal의 각도 차이가 적게 나면 밝게, 각도차이가 많이 나면 어둡게 표현되게끔 설정하였다*/
float dot = dot (@N, pcn);
// 이때 구해진 float variable dot값을 @Cd 컬러값으로 표현해주어 ambient occlusion을 표현하였다
@Cd = dot;
근데 도저히 똑같이 코드를 작성해보아도 ambient occlusion이 실행되지 않아 당황스러웠다... 계속 rgb값이 (0, 0, 0)이렇게 검게 나타나는 것이었다... 이는 우선 챗방에서 물어보기로 하고 복습일기 작성때 다시 시도해 보기로 다짐해 두었다.
ps) 스팅고님께서 pcn값과 dot값을 attribute로 변환하여 geometry spreadsheet에서 확인해보라고 조언해주셨는데 둘다 모두 0으로 나타났다. 이로인해 이 부분이 문제라는 사실을 알 수 있었다. 하지만 여전히 geometry input과 lighting문제가 올바른데도 무엇이 문제라서 아래와 같은 결과가 나타나는지 알 수 없었다.
미미하게 효과가 났던 처음 효과를 두번째 효과에 더해주어 더욱 리얼하게 ambient occlusion을 scene view상에서 나타나게끔 설정해주었다.
// 아래에 값들을 지정해줄 알맞은 variable들을 선언해주었다.
vector pcp, pcn;
float dot, dist;
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 0번인풋으로 들어온 geometry를 이루는 점들
중 (즉 자기 자신을 레퍼런스로 보내버림)
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer variable pc에 File로 저장*/
int pc = pcopen (0, "P", @P, chf ("D"), chi ("AMOUNT"));
// 위에서 선언한 pc값들 즉 여러 가까운 포인트들의 @P 포인트 위치값의 평균을 구하여 vector variable pcn에 저장
pcp = pcfilter (pc, "P");
// 위에서 선언한 pc값들 즉 여러 가까운 포인트들의 @N 포인트 노멀값의 평균을 구하여 vector variable pcn에 저장
pcn = pcfilter (pc, "N");
/* dot()을 활용하여 실제 노멀과 주변에 있는 평균 노멀에 의한 dot product를 지정하여 실제 normal과
평균 normal의 각도 차이가 적게 나면 밝게, 각도차이가 많이 나면 어둡게 표현되게끔 설정하였다*/
dot = dot (@N, pcn);
/* 이에 distance()로 geometry를 이루는 모든 포인트들로부터 위에서 선언한 vector variable pcp까지의
거리를 구해 float variable dist값에 저장*/
dist = distance (@P, pcp);
// 이때 구해진 float variable dot값과 dist값을 더해 @Cd 컬러값으로 표현해주어 ambient occlusion을 표현하였다
@Cd = dot + dist*10;
이번에도 아니나 다를까 두번째 효과와 같이 rgb값이 전부 0인 검정으로 표현되어 도저히 어떤것이 문제인지 알 수 없었다. 코드는 동일하게 작성되었지만 결과가 달라서 아무리 찾아봐도 알 수 없어서 속상하였다.
아래와 같은 코드로 chramp()를 사용하여 자유롭게 ambient occlusion이 어느정도로 나타나는지 조절 할 수 있다고 cgwiki님께서 또한 소개시켜주셨다.
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 0번인풋으로 들어온 geometry를 이루는 점들
중 (즉 자기 자신을 레퍼런스로 보내버림)
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer variable pc에 File로 저장*/
int pc = pcopen (0, "P", @P, chf ("D"), chi ("AMOUNT"));
/* 위에서 선언한 pc값들 즉 여러 가까운 포인트들의 @N 포인트 노멀값의 평균을 구한값을 normalize하여 vector variable
pcn에 저장*/
vector pcn = normalize (pcfilter (pc, "N"));
// @N값도 normalize()를 적용하여 크기를 1로 만든뒤 vector variable norm에 저장
vector norm = normalize (@N);
/* dot()을 활용하여 실제 노멀과 주변에 있는 평균 노멀에 의한 dot product를 지정하여 실제 normal과
평균 normal의 각도 차이가 적게 나면 밝게, 각도차이가 많이 나면 어둡게 표현되게끔 설정하였다*/
float dot = dot (norm, pcn);
// float variabl dot은 -1부터 1까지의 range이기 때문에 0에서 1까지의 Range로 조절해줌
@Cd = fit (dot, -1, 1, 0, 1);
// 우리가 구해준 @Cd값에 chf()으로 만들어진 GAMMA파라미터를 제곱하여 늘릴 수록 더욱 어두워지게끔 세팅해줌.
// 이는 1이하 소수점 수는 제곱되면 더욱 수가 줄어듬으로
@Cd = pow (@Cd, chf ("GAMMA"));
/* nearpoints()를 사용하여 0번인풋으로 들어온 포인트로부터 0번인풋으로 들어온 geometry를 이루는 점들
중 (즉 자기 자신을 레퍼런스로 보내버림)
특정 반경안에서 포지션적으로 가장 가까운 포인트들의 포인트 넘버들를 찾아 integer variable pc에 File로 저장*/
int pc = pcopen (0, "P", @P, chf ("D"), chi ("AMOUNT"));
/* 위에서 선언한 pc값들 즉 여러 가까운 포인트들의 @N 포인트 노멀값의 평균을 구한값을 normalize하여 vector variable
pcn에 저장*/
vector pcn = normalize (pcfilter (pc, "N"));
// @N값도 normalize()를 적용하여 크기를 1로 만든뒤 vector variable norm에 저장
vector norm = normalize (@N);
/* dot()을 활용하여 실제 노멀과 주변에 있는 평균 노멀에 의한 dot product를 지정하여 실제 normal과
평균 normal의 각도 차이가 적게 나면 밝게, 각도차이가 많이 나면 어둡게 표현되게끔 설정하였다*/
float dot = dot (norm, pcn);
// float variabl dot은 -1부터 1까지의 range이기 때문에 0에서 1까지의 Range로 조절해줌
@Cd = fit (dot, -1, 1, 0, 1);
// 또는 chramp()을 사용하여 @Cd값의 ramp를 유저가 인터페이스 내에서 조절할 수 있게끔 설정해줌
@Cd = chramp ("TWA", @Cd);
그렇지만 dot()이 적용된 @N 노멀값으로 표현된 ambient occlusion이 구현이 되지않아서 그런지 파라미터를 어떤값으로 조절하느냐를 떠나서도 scene view에서 제대로 crag의 질감이 표현되지 않았다. 이는 도저히 이유를 알 수 없었으며 해결하는데 시간을 많이 소요하게 만들었다..
Exercises:
As I said earlier, I don't use pointclouds much, so struggling to think of exercises... if you can suggest some, get in touch!
이해가 안되었던 부분:
- 마지막 crag를 활용한 부분에서 @N과 pcfilter()을 활용하여 얻은 포인트 위치값들의 평균값을 이용하여 dot()을 적용하여 ambient occlusion을 표현하고자 하였는데 색깔값으로 적용시켰을때 rgb값이 모두 0으로 표현되어 검정색으로 보여진 것을 알 수 있었다. 이는 파라미터의 수치 관계없이 계속 수치가 0으로 표시되었는데 도저히 이유를 알 수 없었다. 코드상에 오타도 없었던 것 같고 twa님의 코드와 동일하게 작성하였는데 twa님이 구현하신 crag와 차이가 있어서 당황하였다. 그러므로 인해 다음에 시도한 세번의 시도도 제대로 효과가 구현되지 못한채 수업을 마칠 수 밖에 없었다. 이는 나중에 twa님께 물어보기로 하고 나중 복습일기에 다시 언급하기로 하였다.
공부하면서 들었던 생각:
... 드디어 Day 20을 마쳤다..... 아니 근데 Day 20 왤케 어려웠던 건지 모르겠다. 마지막 강의 부분이 제대로 구현되지 않아서 많이 찝찝한 마음이 들어서 좀 쓰이긴한다. 이제 마지막이니까 마지막 쉬운걸로 넘어가겠지 했는데 와 지금까지 배웠던 것 중에 Day 12와 더불어 제일 어려웠던 것 같다. 이제 드디어 끝마치니 그래도 너무너무 후련하다. 솔직히 내가 이것을 끝마칠까라는 의구심이 들고는 했는데 결국은 해냈다는 사실에 괜히 자랑스럽기도 하다...아직 복습일기와 실기가 남아있다. 그래서 당분간은 계속 후디니를 붙잡고 연구를 해야할 것 같다. 진도가 자그마치 마지막 쯤에 일주일이나 밀려 선생님들께 정말 죄송한 마음이 든다. 후디니 1 강의 시작전에는 무조건 실기까지 처리해야지 라고 생각했는데 생각보다 실행으로 옮기니 쉽지 않았다... 점점 더 어려워지는 강의... 늘어가는 강의 길이 그리고 무엇보다도 개강후 밀려오는 공부량과 과제가 진도를 거침없이 나아감에 있어서 어려움을 느꼈던 것 같다... 그렇지만 이 모든 것이 전부 피와 살이 될것이라는 것을 알 고 있다. Joy of Vex 솔직히 말해서 진부하고 지루해 질 수 있는 부분이 많을 거라는 것은 많은 후디니 유저들이 공감할 것 같은 사실 같다. 하지만 twa님이 말씀 드렸듯이 이를 극복하고 vex에 어느정도 자신감을 찾을 수 있을때라면 더욱 더 많은 것을 원하는 것을 그리고 새로운 것을 후디니에서 구현 할 수 있다는 사실은 분명한 것같기도 하다. 지금까지 공부하면서 느꼈던 자세한 기분들은 벌써 후디니1과정이 시작된지라 조금 늦은 감이 있을 것 같지만....ㅋㅋ 실기 관련 스터디노트에 적을 예정이기도 하다. 어쨋든 joy of vex 힘들었지만 충분이 재미있었고 도전적인 과정이었다고 생각한다! 또 지금까지 도와주셨던 선생님들과 스터디메이트들께 너무 감사드린다.
'FX > Houdini_Joy of VEX' 카테고리의 다른 글
Joy of Vex - Assignment #2 & Final Review (2) | 2022.08.12 |
---|---|
Joy of Vex - Day 19: primuv, xyzdist (0) | 2022.08.04 |
Joy of Vex - Day 18: intrinsics (0) | 2022.08.03 |
Joy of Vex - Day 17-2: copy sop, orient, quaternions (0) | 2022.07.31 |
Joy of Vex - Recap of Week 5 (0) | 2022.07.29 |