FX/Houdini_Joy of VEX

Joy of Vex - Recap of Week 4

Gamestonk118 2022. 7. 18. 16:35

복습한 내용과 다시봤더니 이해되는 부분:

Day 12-1: ripple effect

Day 12의 첫 강의 본 강의에 들어가기 전에에 관에서는 Day 7에 배웠었던 nearpoint()에 대한 복습을 조금 더 심화적으로 할 수 있었다. nearpoint()에서 배웠던 주된 내용들은 효과들을 geometry에 적용하였을때 nearpoint()로 생성된 포인트를 중심으로 효과를 나타나게 세팅을 해주었을때 어느 특정된 점들을 중심으로 파형같은 효과들이 생기는 것을 알 수 있었다. 또한 본격적으로 빗물이 물같은 강가에 떨어질때 생기는 파형을 chramp()와 같은 효과들을 사용해서 어떻게 만드는지에 대해서 배워보았다. 하지만 nearpoint()의 주된 단점은 한 grid상에서 효과들을 중첩시키려 했을때 효과들 사이 서로 침범하지 못하게끔 바운더리를 생성하여 중첩이 제대로 작동되지 않는 것을 확인 할 수 있었다.

- 이번 강의는 솔직히 말해서 어려웠다. 말로 풀어 쓰기 가장 어려웠던 강의였던 것 같다. 마지막에 cutoff와 keep 그리고 end variable을 이용하여 파형의 거리값이 얼마나 진행될지의 관한 조건문들을 해석하는 것이 난관이었던 것 같다. 아마 계속 연구하여 어떻게 작동되는지 알아봐야 할 것 같다.

/* * 변수 생성 & 효과 생성 * */

/* 0번 인풋으로 들어운 geometry의 모든 포인트들로부터 1번 인풋으로 들어온 geometry의 
가장 가까운 포인트들의 포인트 넘버를 int variable pt에 저장하여라*/
// 점이 여러개 있을시 pt는 모든 포인트들의 위치에 따라 각기 달라진다

// 가져온 결과 point number 즉 @ptnum임
int pt = nearpoint (1, @P);
// 방금 만들어낸 integer variable pt를 attribute로써 나타내어라
i@pt = pt;

// 여기 float variable fx는 전체적인 effect를 추가한 값임. 모든 효과에 대해 정의를 내려준다.
float fx = 0;
// 여기 float variables은 fx에 추가될 수치들로써 각기 어떠한 효과를 나타낼지 정의를 내려준다.
float fxA = 0;
// 방금 전 1번 인풋으로 연결된 pt에 포인트 넘버가 할당된 포인트들의 위치값을 vector variable hitPos에 저장
vector hitPos = point (1, "P", pt);
/* 0번 인풋으로 들어온 Geometry를 구성하는 모든 포인트들과 방금 전 저장한 1번 geometry에 Pt값에 해당하는 
포인트들의 위치값들 사이의 거리 길이를 구하여 float variable dist에 저장하여라*/
float dist = distance (@P, hitPos);

// 여기 float variables은 fx에 추가될 수치들로써 각기 어떠한 효과를 나타낼지 정의를 내려준다.
/* 거리 길이값을 effect fxA에 적용함으로써 1번 인풋 geometry를 구성하는 포인트들을 기점으로 0번
인풋 geometry를 구성하는 모든 점들의 거리길이를 fxA에 저장한다.*/
fxA = dist;
// @Time을 빼주어 움직이는 모션을 취해준다. 빼줌으로써 중심으로부터 바깥으로 빠져나가는 형태의 모션 구축
fxA -= @Time;
/* effect값에 floor()을 적용하여 내림을 취함으로써 높이값으로 나타내었을때 계단같은 형상이 나타나도록 유도
하지만 그 값을 전체 fxA에서 다시 빼서 반복되는 ramp가 나타나는 것처럼 쉐입을 생성하였다*/
fxA = fxA - floor (fxA);
/* 이때 fit()을 활용하여 쉐입을 뒤집어 버렸다. 이는 나중에 chramp()를 적용하였을때 모션이 진행될때
ramp가 x값으로 봤을때 0에서부터 1까지 나타나게 하기 위함이다.*/
fxA = fit (fxA, 0, 1, 1, 0);
fxA = chramp ("FXA", fxA); // chramp()을 통해 파형의 모양을 형성하였다
// fxA에 dist + 1한 값을 나눠주어 마치 원점으로부터 거리 길이 값이 커질 수록 effect가 약해지는 것처럼 표현
// dist에 1을 더하여 1보다 큰 양수값이 되어 나눗셈이 올바르게 작동될수 있게하여라
// pow()을 이용하여 나누는 값에 제곱을 해주어 더욱 빠르게 줄어들 수 있게하여라
// pow()안에 chf()을 집어넣어 제곱의 지수의 값을 파라미터로 조절할 수 있게함.
fxA /= pow ((dist + 1), chf ("DIM"));

/* 0번 인풋으로 들어온 Geometry를 구성하는 모든 포인트들과 방금 전 저장한 1번 geometry에 Pt값에 해당하는 
포인트들의 위치값들 사이의 거리 길이를 구하여 float variable dist에 저장하여라*/
// 이 값을 Float variable cutoff에 또 저장하여라
// effect (물결 모양)가 허용되는 범위를 지정해준다.
float cutoff = dist;
// keep은 effect (물결 모양)을 유지해주는 거리 길이
float keep = chf ("KEEP");
// keep은 effect (물결 모양)을 끝내주는 거리 길이
float end = chf ("END");

// if statement
// 만약 물결 모양의 범위가 유지해 주는 거리길이보다 크고 끝내주는 거리 길이보다 적으면
if (cutoff > keep && cutoff < end) {
	// keep과 end수치 사이에 있는 물결 모양의 거리를 1에서 0으로 내려가게끔 하여라
    cutoff = fit (cutoff, keep, end, 1, 0);
    // 만약 물결 모양의 범위가 유지해주는 거리길이보다 적으면
} else if (cutoff <= keep) {
    cutoff = 1; // 물결 모양의 거리를 1로 바꿈
} else { // 물결모양의 범위가 유지해 주는 거리길이와 끝내주는 거리길이보다 모두 크면
    cutoff = 0; // 물결 모양의 범위는 0이된다.
}

// 위에 만든 조건문들의 식들을 직관적으로 알아보기 위해 @Cd 컬러값으로 나타내어라
@Cd = set (cutoff, 0, (1-cutoff));

/* * 효과를 택 * */
/* 맨 위에 선언한 float variable fx에 모든 effect 변수와 ramp변수들을 차례대로 추가하여 fx를 순차적으로
업데이트 해주었다. 이때 더하기를 라인마다 쓰는것이 직관적이고 좋다*/
fx += fxA*cutoff;

/* 방금 전 추가해준 모든 ramp안에 지정된 수치값에 따라 반영된 effect들을 포함하는 float variable fx를
@P.y 높이값으로 보여주어라*/
@P.y = @P.y + fx;
하나의 grid 상에서 여러개의 파형이 나타나지만 여전히 효과들 사이사이 바운더리를 생성하며 진행되어 무언가 어색한 느낌을 준다.

1. 말그대로 전체 물결 모양의 거리들을 생성하는 float variable cutoff를 생성하여 준다음 다음과 같은 float variables keep과 end를 만들어주어 조건문을 사용하여 어느 지점에서 물결이 유지되거나 끝날지 설정해주었다. 우선적으로 파형의 안쪽으로 갈수록 1에 가까워지고 바깥으로 갈수록 0에 가까워진다는 설정하에 우선 기본형으로 만약 유지해 주는 거리길이부다 크고 끝내는 거리길이보다 자다면 물결모양의 파형이 점차적으로 사라지게끔 설정해주었다. 그다음 만약 물결모양의 유지해주는 거리보다 작다면 물결 모양의 거리는 1로써 유지되고 끝내주는 길이보다 길다면 물결이 사라지게끔 0으로 설정되게 하였다. 어려웠던 이 조건문을 해석하는데 아래의 다이아그램이 도움이 되었던것 같다.

물결효과가 거리에 따라 어떻게 나타날지 쉽게 알려주는 diagram

Day 12-2: overlapping effect

Day 12-2에서는 nearpoint()로 결정된 모든 포인트들에 대해 효과들을 따로 다 설정해주어 모두 어느 특정 attribute값으로 나타내었을때 중첩이 되는 방법에 대해서 배워보았다. 이때 효과들을 생성해주는 variable들을 모든 포인트들에 대해 다 따로 만들어주면 너무 코드가 복잡해지는 단점이 있었는데 이를 해결해 주기 위해 효과들을 생성해주는 variable들은 한 포인트에 대해 효과를 지정해주고 또 다른 포인트에서 효과를 지정해줄때 또 새로운 값으로 작동되게끔 설정을 해두었다. 반면 모든 효과들을 attribute로 나타날 수 있게 해주는 fx같은 variable은 += 같이 기존 포인트의 효과들을 버리지 않고 누적 시키게끔 식을 구성하여 나중에 모든 포인트들에게서 효과가 나타났을때 효과들이 효과적으로 중첩이 될 수 있게끔 만들어 주었다.

/* * 변수 생성 & 효과 생성 * */

// 여기 float variable FX는 전체적인 effect를 추가한 값임. 모든 효과에 대해 정의를 내려준다.
float FX = 0;
// 여기 float variable fx는 FX에 추가될 수치들로써 각기 어떠한 효과를 나타낼지 정의를 내려준다.
float fx = 0;

// 나중에 값을 지정해줄 변수들을 미리 설정함
vector pos = 0;
float d = 0;
// 유저가 float variable rad를 chf()을 사용하여 파라미터로 지정하여 유동적으로 조절할 수 있게 함
float rad = chf ("RADIUS");

// 이 부분에서는 윗 코드에서 작성한 동일한 효과들의 식들을 작성하였다
// 그대신 point()의 세번째 인풋값을 각기 다르게하여 각기 다른 포인트의 위치에 대해 효과를 생성하게끔 설정하였다
// 이는 계속 변수에 값을 새롭게 정의해주면서 위에서 선언된 값들을 무시하고 새로운 값들을 변수에 저장시켜 바뀌게 했다

/* point()을 이용하여 1번 인풋에 연결된 geometry의 파라미터로 설정된 0번 포인트 넘버를 가진 
포인트의 위치값을 불러와 vector variable pos에 저장하여라*/
pos = point (1, "P", 0);
d = distance (@P, pos);
fx = d;
fx *= chf ("FREQ");
// Arithmetic Operation
fx -= @Time*chf ("SPEED");
fx = sin (fx);
fx *= chf ("AMP");
fx *= fit (d, 0, rad, 1, 0);

// 기존에 잇던 값들을 유지한채 새로운 값들을 추가하여 효과들이 누적될 수 있게끔 세팅하였다
FX += fx;

/* point()을 이용하여 1번 인풋에 연결된 geometry의 파라미터로 설정된 1번 포인트 넘버를 가진 
포인트의 위치값을 불러와 vector variable pos에 저장하여라*/
pos = point (1, "P", 1);
d = distance (@P, pos);
fx = d;
fx *= chf ("FREQ");
// Arithmetic Operation
fx -= @Time*chf ("SPEED");
fx = sin (fx);
fx *= chf ("AMP");
fx *= fit (d, 0, rad, 1, 0);

// 기존에 잇던 값들을 유지한채 새로운 값들을 추가하여 효과들이 누적될 수 있게끔 세팅하였다
FX += fx;

/* point()을 이용하여 1번 인풋에 연결된 geometry의 파라미터로 설정된 2번 포인트 넘버를 가진 
포인트의 위치값을 불러와 vector variable pos에 저장하여라*/
pos = point (1, "P", 2);
d = distance (@P, pos);
fx = d;
fx *= chf ("FREQ");
// Arithmetic Operation
fx -= @Time*chf ("SPEED");
fx = sin (fx);
fx *= chf ("AMP");
fx *= fit (d, 0, rad, 1, 0);

// 기존에 잇던 값들을 유지한채 새로운 값들을 추가하여 효과들이 누적될 수 있게끔 세팅하였다
FX += fx;

/* * 원본에 저장 * */

/* 방금 전 추가해준 모든 ramp안에 지정된 수치값에 따라 반영된 effect들을 포함하는 float variable fx를
@P.y 높이값으로 보여주어라*/
@P.y += FX;

 

효과들이 효과적으로 중첩되어 파형이 grid상에서 퍼져나갈때 다른 파형 상관없이 지정된 rad범위안에서 계속 퍼져나가는 것을 볼 수 있다.

- 이상하다. 내용은 점점 더 어려워지고 복잡해가는데 생각보다 마지막에 돌아봤을 때 딱히 이해가 안되는 부분은 없는것 같다. 그치만 코드가 여전히 더욱 복잡해짐에 따라 이해하는데 시간에 꽤 소요가 되고 더욱 갈 수록 직관적으로 쉽게 이해하기 어려워지는 형태가 되는것 같다. 또한 grid와 point들로 wrangle을 연결할 때뿐만이 아닌 조금더 입체적인 geometry들을 wrangle로 연결하였을때 어떠한 쉐입과 모션이 나타날지 예상하는 것에 난관을 느낄것 같다. 이번주 강의에서는 공통적으로 반복적으로 강의없이 작업들을 진행해서 온전히 나만에 것으로 만드는 것이 더욱 중요하게 여겨지는 것같다. 아마 복습일기를 할때 집중적으로 파고들어야 할 것 같다.

1. 이때만 해도 코드가 너무 복잡해져서 정리하기가 힘들었는데 나중에 배울 array와 반복문 등으로 더욱 코드를 깔끔하게 쓸 수 있었다. 그리고 입체적인 geometry에 특정 포인트들에 대하여 효과를 지정해줄때도 별 다른 특별한 특징 없이 grid때 처럼 파형이 여러개 중첩되면서 구축되는 사실을 알 수 있었다. 아래 시도해본 sphere 파형들을 더욱 많이 설정해주고 싶었지만 nearpoints()와 반복문 없이는 너무 코드의 길이가 길어질 것 같아 이정도로 만족해 보기로 하였다.

/* 이 부분은 위에 작성된 코드와 동일함*/
float FX = 0;
float fx = 0;
vector pos = 0;
float d = 0;
float rad = chf ("RADIUS");

pos = point (1, "P", 0);
d = distance (@P, pos);
fx = d;
fx *= chf ("FREQ");
// Arithmetic Operation
fx -= @Time*chf ("SPEED");
fx = sin (fx);
fx *= chf ("AMP");
fx *= fit (d, 0, rad, 1, 0);

FX += fx;

pos = point (1, "P", 1);
d = distance (@P, pos);
fx = d;
fx *= chf ("FREQ");
// Arithmetic Operation
fx -= @Time*chf ("SPEED");
fx = sin (fx);
fx *= chf ("AMP");
fx *= fit (d, 0, rad, 1, 0);

FX += fx;

pos = point (1, "P", 2);
d = distance (@P, pos);
fx = d;
fx *= chf ("FREQ");
// Arithmetic Operation
fx -= @Time*chf ("SPEED");
fx = sin (fx);
fx *= chf ("AMP");
fx *= fit (d, 0, rad, 1, 0);

FX += fx;

// 바뀐 부분
@Cd = 0; // @Cd값을 0 검정색으로 초기화
@Cd.b = FX; // 효과가 나타나는 부분들은 파란색으로 나타나게끔함
@P = @P + @N*FX; // 효과가 geometry의 normal값을 중심으로 물리적으로 생성되게끔 함

// 코드의 양이 너무 김

 

하나의 sphere상에서 파형을 여러개 구축하여 파형들이 효과적으로 중첩되게끔 퍼져나가게 세팅하였다

Day 12-3: nearpoints, arrays

드디어 모든 포인트들에 효과들을 전부 하나하나씩 지정해주지 않고 기존에 배웠던 nearpoint()를 사용하여 효과를 여러번 나타나게끔해주긴 하는데 nearpoint()가 아닌 nearpoints()를 사용하여 array로써 효과적으로 중첩을 시키는 방법에 대해 알아보았다. nearpoints()는 0번 인풋으로 들어온 geometry로부터 1번 인풋으로 들어온 geometry를 구성하는 점들중 가장 가까운 점들의 포인트 넘버를 찾아내겠다는 원리는 비슷한데 nearpoint()와는 다르게 그 점들의 포인트 넘버들을 여러개 찾아내는 것이다. 즉 제일 가까운 점의 정보가 아닌 첫번째로 가까운점, 두번째로 가까운점, 세번째로 가까운점 등 이렇게 여러개의 정보들을 하나의 variable로서 저장 가능케 한다. 이는 array로써 이해가 되는데 array는 하나의 Variable에 여러개의 정보를 저장할 수 있게끔 만드는 것으로써 []라는 대괄호로 작동된다. 나중에 array값 안에 하나의 정보만을 불러오고 싶다면 []안에 그 정보의 순서값을 써넣어 불러올 수 있다. 이때 이것을 중첩의 목적으로 이용하려면 그 순서값을 여러번 써넣어 중첩이 몇번 작동될지 유저가 직접 선택할 수 있다. 

/* * 변수 설정 * */
int pt;
vector pos = 0;
float d = 0;
float w = 0;
float radius = chf ("RADIUS");
float r = chf ("R");
int num = chi ("NUM");

/* 0번 geometry로부터 1번 geometry를 구성하는 점들중 유저가 선택한 반경안에서 가장 가까운 것들의 포인트 넘버들을 찾아
int array variable pts에 저장하여라*/
pts = nearpoints (1, @P, radius, num);

pt = pts[0];  // pts array에 있는 값들중 첫번째 값만 pt에 저장
// 1번 인풋 geometry에서 pt에 해당하는 포인트 넘버를 가진 포인트 위치값을 가져와 pos에 저장
pos = point (1, "P", pt);
// 방금 선언한 각각의 pos값과 grid상의 모든 포인트 위치사이의 거리길이값을 d에 저장
d = distance (@P, pos);
w = d*ch("FREQ"); // 효과에 freqency를 조절하여 파형의 촘촘함을 설정
w -= @Time*ch ("SPEED"); // 효과의 스피드를 설정
w = sin (w); // 파형이 sin()으로 sine wave로써 나타나게끔 설정
w *= chf ("AMP"); // 파형의 높이값을 설정
w *= fit (d, 0, r, 1, 0); // 포인트로부터 파형이 멀어질수록 효과가 덜나도록 설정
@P.y += w; // 이 모든 효과들을 높이값으로 설정

/* 이 다른 포인트들을 중심으로 계속 반복하여 @P.y값에 누적시켜 중첩되는 효과를 만든다*/

pt = pts[1];
pos = point (1, "P", pt);
d = distance (@P, pos);
w = d*ch("FREQ");
w -= @Time*ch ("SPEED");
w = sin (w);
w *= chf ("AMP");
w *= fit (d, 0, r, 1, 0);
@P.y += w;

pt = pts[2];
pos = point (1, "P", pt);
d = distance (@P, pos);
w = d*ch("FREQ");
w -= @Time*ch ("SPEED");
w = sin (w);
w *= chf ("AMP");
w *= fit (d, 0, r, 1, 0);
@P.y += w;

 

nearpoints()를 사용하여 기존에 nearpoint()로 생성되었을때 바운더리가 생겨 어색한느낌을 중첩을 총 두번정도 시켜 파형이 자연스럽게 서로서로 섞이게끔 세팅해주었다.

- 1번 exercise에서 scatter 노드로 만들어진 포인트의 갯수를 넘어서 중첩되는 횟수를 계속 늘렸을때 하나의 포인트에서 생성된 높이값이 다른 포인트들에 비해 혼자만 커지는 것을 알 수 있었다. 도대체 왜 그런 효과가 나타나는지 알 수 가 없었다. 왜 하나의 포인트에서 값이 값자기 커지고 나머지들은 그대로이고 모두 동등한지 머릿속이 햇갈려지기 시작하였다. 아마 복습일기때 다시 한번 재 검토해보아야할 내용인 것같아 여기에다 써본다.

1. 이제 알았다. nearpoints()로 만들어진 array안 포인트들 갯수를 넘어서 중첩되는 횟수가 더 많아지면 즉 만약 nearpoints()로 만들어진 정보의의 갯수가 7개인데 array로 불러온 값을 7번 넘게 복사 붙여넣기 한다면 이는 1번 인풋으로 들어오는 geometry의 0번 포인트에 대해서 효과가 계속 적용되기 시작한다. 그러므로 0번 포인트를 중심으로 된 효과의 스케일은 더욱 커지기 마련이고 나머지의 포인트의 위치에서 생성된 효과들은 제자리가 되기 시작한다. 그러므로 아래와 같은 형상을 얻게 된것이며 이는 nearpoints()로 만들어진 정보들의 갯수에 맞추어서 중첩의 횟수를 설정시켜야 겠다는 생각이 들었다.

nearpoints() 으로 생성된 정보들의 갯수보다 중첩이 더 많이 생성되면 0번 포인트의 대한 효과들이 계속 생성되어 그 부분만 더욱 효과가 두드러지는 것을 확인 할 수 있다.

Day 13: for loops (ties nicely into arrays)

Day 13에서는 반복문 즉 각각 foreach와 for을 사용하여 만드는 반복문들에 대해 알아 보았다. 지난번 강의와 비교하였을때 여전히 array안에 해당되는 포인트들의 순서값들에 대해 효과들을 각각 따로 복사 붙여넣기해서 생성하다보니 아무래도 코드가 여전히 긴것 같은 느낌을 줄 수 있었다. 이러한 array안의 정보들의 순서값을 자동으로 늘리면서 효과를 반복시켜주기 위해 반복문 foreach와 for을 사용하여 활용할 수 있었다. foreach는 말그대로 array안에 들어있는 정보들을 대변해주는 variable과 해당되는 array값을 넣어 식들이 반복적으로 진행되게 해주는 반복문이고 for은 직접적으로 foreach와 유사한데 더욱 세부적으로 안에 있는 정보들이 얼마나 반복될지 그리고 어느 어쩔때 진행될지 세팅해 줄수 있는 반복문이다.

 

- foreach로 진행해주었을때:

int pts[]; // integer array variable pts선언
int pt; // array안에 들어있는 각각의 정보를 대변해 주기 위한 integer variable pt선언
vector pos = 0;
float d = 0;
float w = 0;
float radius = chf ("RADIUS");
float r = chf ("R");
int num = chi ("NUM");

pts = nearpoints (1, @P, radius, num);


/* integer variable i의 값이 0에서 부터 array pts안에 들어있는 정보의 수까지 도달하기 전까지 1씩 늘어날때*/
foreach (pt; pts) {
    // 효과 생성
    pos = point (1, "P", pt);
    d = distance (@P, pos);
    w = d*ch("FREQ");
    w -= @Time*ch ("SPEED");
    w = sin (w);
    w *= chf ("AMP");
    w *= fit (d, 0, r, 1, 0);
    @P.y += w; // 그리고 이 값들은 모두 @P.y값에 누적시켜주어 서로 높이값들이 중첩이 되게끔 만든다.
}

- for로 진행해주었을때

int pts[]; // integer array variable pts선언
int pt; // array안에 들어있는 각각의 정보를 대변해 주기 위한 integer variable pt선언
vector pos = 0;
float d = 0;
float w = 0;
float radius = chf ("RADIUS");
float r = chf ("R");
int num = chi ("NUM");

pts = nearpoints (1, @P, radius, num);


/* integer variable i의 값이 0에서 부터 array pts안에 들어있는 정보의 수까지 도달하기 전까지 1씩 늘어날때*/
for (int i = 0; i < len (pts); i++) {
	/* array pts안에 있는 정보의 순서는 integer variable i로 결정되고 순서에 해당하는 수치는 integer 
    variable pt에 저장된다*/
    pt = pts[i];
    // 효과 생성
    pos = point (1, "P", pt);
    d = distance (@P, pos);
    w = d*ch("FREQ");
    w -= @Time*ch ("SPEED");
    w = sin (w);
    w *= chf ("AMP");
    w *= fit (d, 0, r, 1, 0);
    @P.y += w; // 그리고 이 값들은 모두 @P.y값에 누적시켜주어 서로 높이값들이 중첩이 되게끔 만든다.
}

둘 다 모두 지금까지 진행되었던 중첩의 효과에 대한 코드의 양을 현저하게 줄어들게 만든것을 확인 할 수 있다.

- 1번 exercise에서 어떻게 가장 파형에서 가장 높은 포인트들과 가장 낮은 포인트들의 색상을 따로 딱 지정해주었을지 이해가 되지 않았다. 그리고 이번 시간에 배운 부분들이 loop 반복문인데 이를 사용하여 식을 써어야 할지 아니면 조건문인지 아니면 아예 다른 방식인지 어떠한 방식으로 풀어야 할지에 대해 감을 잡기가 쉽지 않았다.

- 3번 exercise에서 CGWiki님이 작성한 코드를 대충 해석하는데는 성공하였지만 CGWiki님이 문제에서 언급했던 것처럼 컬러의 중첩이 이루어질때 더하기가 아닌 곱셈으로 적용시키기 위해 새롭게 만든 코드에 대해 덧셈과 비교했을때 어떠한 차이를 가지는지 이해가 쉽지 않았다. 왜 덧셈으로 계산되면 @Cd의 값이 커지는지 그리고 제대로 radius에 따라 컬러의 반경 값이 조절되지 않는지 이해가 되지 않았다.

1. 최대한 조건문을 활용하여 @Cd의 값을 조절 하였다. 최대한 어떻게 하면 좀 더 깔끔한 색깔을 구역별로 지정해 줄 수 있을지 그리고 좀 더 확실하게 만들 수 있는지는 나중에 곰곰히 생각하며 식을 다시 한번 써봐야 하겠다는 생각이 든다.

int pts[]; // integer array variable pts선언
int pt; // array안에 들어있는 각각의 정보를 대변해 주기 위한 integer variable pt선언
vector pos = 0;
float d = 0;
float w = 0;
float radius = chf ("RADIUS");
float r = chf ("R");
int num = chi ("NUM");

pts = nearpoints (1, @P, radius, num);


/* integer variable i의 값이 0에서 부터 array pts안에 들어있는 정보의 수까지 도달하기 전까지 1씩 늘어날때*/
for (int i = 0; i < len (pts); i++) {
	/* array pts안에 있는 정보의 순서는 integer variable i로 결정되고 순서에 해당하는 수치는 integer 
    variable pt에 저장된다*/
    pt = pts[i];
    // 효과 생성
    pos = point (1, "P", pt);
    d = distance (@P, pos);
    w = d*ch("FREQ");
    w -= @Time*ch ("SPEED");
    w = sin (w);
    w *= chf ("AMP");
    w *= fit (d, 0, r, 1, 0);
    @P.y += w; // 그리고 이 값들은 모두 @P.y값에 누적시켜주어 서로 높이값들이 중첩이 되게끔 만든다.
}

if (@P.y > d) { // 만약 @P.y 높이값이 모든 포인트로부터 1번 인풋 Geometry의 점들까지의 길이값보다 크다면
    @Cd.r = 1; // 빨간색으로 표현
} else if (@P.y < 1 - d) { // 만약 반대로 1에서 길이값을 뺀 값보다 작다면
    @Cd.g = 1; // 초록색으로 표현
} else {
    @Cd = 1; // 해당되지 않는 나머지들은 죄다 흰색

 

위와 같은 식을 사용하여 최대한 포인트의 위치가 가장 높을때 빨간색 낮을때 초록색 이렇게 색깔을 지정해 주긴 하였는데 끄트머리에는 가장 낮은 포인트들이 아닌데도 초록색으로 지정되는게 신경쓰인다. 그래도 어느정도 모양을 잡은 것 같다.

2.

int pts[];
int pt;
vector col,pos;
float d;

pts = nearpoints(1,@P,20);

// treat this as ink on paper, so start with white paper
@Cd = 1;

foreach(pt; pts) {
    pos = point(1,'P',pt);
    col = point(1,'Cd',pt);
    d = distance(@P,pos);
    d = fit(d,0,ch('radius'),0,1);
    
    // adjust the ramp so its mostly 0, 
    // then suddenly 1 at the end
    d = chramp('fade',d);

    // lerp is interpolate. we use d to make the colour
    // mostly the point colour, the quickly fade to white
    // at the radius border
    col = lerp(col,1,d);

    // multiply the colour 
    @Cd *= col; 
}

CGWiki님이 남겨주신 코드의 방식은 대충 해석하는데 성공은 하였지만 여전히 왜 덧셈에서와 다른지 이해가 되지 않는다. 아마 좀더 강의를 진행해나가보아 나중에 다시한번 이 exercise를 읽어보아 해결해야겠다는 생각이 든다.

CGWiki님이 남겨주신 코드를 통해 만들어본 효과들. 이를 마지막에 @Cd 컬러값에 덧셈으로 바꾸면 제대로 작동이 되지 않는다

다시봐도 모르겠는부분:

- 우선 Day 13강의에서 마지막 exercise부근에 내가 정확하게 해석한 것이 맞는지 그리고 덧셈과 곱셈의 차이에서 도대체 어떤 차이때문에 색깔 결과값이 다르게 나타나는지 궁금하다. 나중 강의와 설명을 더 공부해본 후에 다시 한번 exercise를 풀어봐야 겠다는 생각이 든다.

- Day 13강의에서의 첫번째 exercise부분에서도 어떻게 하여 조금 더 확실한 높이 값을 구별하여 특정 포인트들에만 지정된 색깔값을 부여할 지 더욱이 연구해봐야겠다는 생각이 든다. 반복문과 조건문을 둘다 활용하여 식을 써봐야 하는지 궁금증도 들고 아니면 둘 중 하나를 써야 할지에 대해 딱 보고 아는 능력이 나중에 fx로 작업물을 만들어 보는데 있어 중요하다고 생각이 든다.