중요했던 부분:
- random(): Random Function
그야말로 값이 주어질때 새로운 random한 결과를 돌려주는 function. 만약 random()으로 생성된 파형을 완전히 쪼개 준다면 각각의 값에서 새로운 독립된 시행이 나와 어떤 분포 안에 수없이 많은 값들이 나온다.

- Noise(): Noise Function
이미 준비가 되어잇는 패턴에 대응된 값을 찾아주는 function. random()과는 다르게 인풋의 값이 변화함에 따라 흐름이 있는 random값을 반환한다. 커다란 흐름이 잇는 상태에서 random값을 제어를 해줌으로 노이즈가 가진 고유한 흐름을 유지한다.

- Frequency, Offset & Amplitude:
Frequency: 패턴의 사이즈가 비율로써 줄어드는 것을 frequency라고 한다.
eg) input *= chf ("FREQUENCY"); // 이런 식으로 noise()안에 들어갈 인풋에 특정 값을 곱해줌으로써 파장의 길이를 줄여 더욱 촘촘하게 만들 수 있다.
Offset: 특정 값을 업데이트 해줌에 따라 당겨지는 형식. 주로 노이즈가 움직이는 것처럼 보인다. 하지만 원래 주어진 값보다 일찍 어떤값에 도달했다고 생각하는 것이 옳다.
eg) input += chf ("OFFSET"); // 이런 식으로 noise()안에 들어갈 인풋에 특정 값을 더해줌으로써 offset을 조절하여 패턴의 위치값을 바꾸는 것처럼 나타낼 수 있다.
Amplitude: 패턴의 높이 값. frequency가 패턴의 길이값을 더욱 조절하게 만드는 것이라면 amplitude는 파형의 높이를 조절하여 정보를 받는 @Cd나 @P값들의 미니멈과 맥시멈 값 차이를 더욱 많게 아님 적게 조절 할 수 있다.
eg) // 강의에 amp를 조절하는 식은 나오지 않았지만 추측한 바로는
@P.y *= chf ("AMP"); or @Cd = *= chf ("AMP"); // 이렇게 제일 마지막에 노이즈 정보를 저장하는 attribute자체에 파라미터값을 곱해줌으로써 파형의 높낮이가 조절될 수 있게 하는 것같다.
- Attribute VOP을 활용한 noise() 활용


노이즈를 생성하는 vop노드에서 signature이라는 파라미터 탭에 디멘션 값을 조절할 수 있다. 1D 값을 생성해주면 float 값 하나만 생성되고 3D 값을 생성하면 float 값 새계로써 vector의 결과를 낳는다.
eg) Signature: 1D Noise or 3D Noise
Dimension은 이용할 변수의 갯수를 나타내는데 각기 다른 수를 가진 Dimension끼리의 변환을 유동적으로 이뤄낼 수있다.
예를들어 아까전 vector값을 @Time으로 계산해서 noise()의 input의 offset이 x/y/z방향으로 전부 이동했던 것 처럼 3D variable을 1D varaible으로 받을때는 3D의 정보들을 모두 취합헤서 받는다.
P에서 pos로 받은 turbulent noise노드를 vopout 노드에 @Cd 값으로 나오게 하여 색깔로써 Scene View의 noise()의 특성을 나타날 수 있게 할 수 있다.
offset을 늘리거나 줄이면 패턴 자체를 특정 방향으로 움직이는 형태의 (실제로는 각기 포인트들의 할당하는 attribute값을 바꾸는 것) 현상을 줄 수 있다.
반면 frequency를 늘리거나 패턴의 모양을 줄어들게 하거나 늘리게 만들어 버려 각기 포인트들이 할당하는 attribute값을 바꿔버린다.
- Types of Noises (강의에 소개된 종류들)
Original Perlin Noise: 기본적인 Noise 모양을 제공한다. After Effects에서 보는 Fractal Noise같은 효과를 제공한다.

Aligator Noise: 약간 소보로빵 감촉의 Noise모양을 제공하며 예쁜 모양과 색상들을 볼 수 있다.

Simplex Noise: Perlin Noise와 비슷한데 약간 패턴이 좀 더 단순하고 심심한 느낌의 Noise이다.

Curl Noise (curnoise()): 좀더 진한 색상을 가진 noise인데 더욱 다채롭게 되어있는 것을 알 수 있다.

Unified Noise (Node): 여러 noise들을 다 짬뽕해둔 하나의 noise로 모든것을 표현할 수 있게끔 제작된 node이다.
이러한 설정을 vex로 기본형식으로 작성한다면
eg) v@K = TWANOISE (@P); // TWANOISE라는 function에 @P (Point 위치값)을 넣어주고 vector Attribute K에 저장해주겠다.
- Attribute Wrangle을 활용한 noise() 활용
Attribute VOP과 마찬가지로 우리가 직접 수동으로 코드를 작성하여 파라미터를 만들어 줌으로써 vex에서도 동일하게 noise를 생성시켜줄 수 있다.
eg) vector input = @P; // 선언된 vector variable input은 @P 포인트 위치값과 같다.
input *= chv ("SCALE"); // input에 chv()으로 생성된 파라미터 SCALE을 곱하여 frequency를 업테이트 해줌. SCALE을 늘리면 노이즈의 폭이 줄어들고 반대로 줄이면 폭이 늘어나는 것을 알 수있다.
input += chv ("OFFSET"); // input에 chv()으로 만들어준 파라미터값을 더해줌으로써 포인트의 attritute값을 업데이트하여 노이즈를 당겨주어 offset과 같은 효과를 나타날 수 있게 한다.
input += @Time; // 시간이 바뀜에 따라 input의 값이 바뀌기 때문에 noise()의 어느위치를 표현해줄지가 바뀌면서 애니메이션이 발생함. 만약 grid위에 noise를 적용한다면 input의 vector값이 float의 값을 담고있는 @Time과 같이 계산되어 input의 x/y/z값이 모두 동시에 변할 것이다.
// 그러므로 특정 값에만 @Time으로 인한 변화를 주기위해...
eg) input = set (@Time, 0, 0); // 과 같이 vector값들 중 set()을 활용하여 한값에만 영향을 줄 수있다.
@Cd = noise (input)* chv ("COLOURSCALE"); // @P를 가지고 있는 input 변수에 Noise()을 적용하여 @Cd 컬러값으로 나타나게 하여라. 그리고 noise(input)에 chv()으로 곱하여 색상들의 수치를 3D값으로 조절 시킬 수 있다.
@P.y = noise (input); // @P를 가지고 있는 input 변수에 Noise()을 적용하여 @P.y 높이값으로 나타나게 하여라.
@P.y *= chf ("HEIGHT"); // noise()파형의 전체적인 높이값을 chf()으로 파라미터로써 조절할 수 있게 세팅함 (Amplitude).

*SCALE이 커짐에 따라 간격이 줄어들이는 이유:
sin()이나 noise()는 고유한 패턴을 가지고 있다. 즉 파형의 형태를 가지고 있는데 input의 증가속도가 빨라지니까 간격이 줄어들고 있고 인풋의 증가속도가 줄어드니까 간격이 넓어지고 있다. 즉 input의 값들을 곱해주는 SCALE의 값이 커지면 간격이 좁아지고 SCALE값이 작아지면 간격이 넓어지는 이유이다. input이 바뀜으로써 다른곳에서 패턴을 끌어다가 보여주는원리와 같다.
*noise()설정할때 인풋을 계산시키는 파라미터값을 chv()으로 설정해주는 이유
지오메트리가 3차원으로 이루어져있고 noise()가 거기에 적용되어있는 상태라면 노이즈상에서 offset이나 frequency값을 chv()으로 설정해주어야 원하는 방향대로 노이즈를 이동시켜주거나 스케일을 적용시켜줄수 있다.
윗 문장코드들을 한번에 쓴다면:
@Cd = noise (chv ("OFFSET" + @P* chv ("FANCYSCALE") + @Time); // 과 같은 식을 작성할 수 있다. 이 식은 위에서 선언한 input의 변화를 유도하는 식들을 더하여 Noise()에 넣은 식으로 @Cd값으로 scene view에서 나타나게 한다.
// 항상 말했듯이 noise()는 sin()과 함께 본인이 가지고 있는 패턴이 일정하다. 이는 들어가는 input이 변화하기 때문에 결과가 바뀐다고 보면된다.
// pnoise()와 같이 복잡하고 많은 인풋을 요구하는 noise()들은 attribute VOP상에서 더욱 편리하게 기존에 세팅된 파라미터들과 함께 작업 할 수 있다.
- set(): Set Function
set()은 @Attribute나 variable을 포함한 Vector값들을 vex에 계산시킬수 있게 하는 식이다.
eg) eg) vector input = set (@Time, 0, 0); // x값이 현재 타임으로 계산되고 나머지가 0인 vector값을 vector 변수 input에 저장하여라
- mountain (Node)
특정 geometry를 찌글 찌글하게 만드는 노드.
중요 포인트들:
1. noise()는 연속된 흐름을 이용해 얻는 임의의 값이다.
2. 차원에 대한 내용은 결코 위치값에 대한 뜻만은 아니다. 차원은 변수에 대한 그 자체이다.
3. noise()는 변수의 갯수만큼 각각의 값에 적용이 된다. 그리고 output차원 (dimension을 변환 시킬때 받아주는 variable의 차원)이 input과 같거나 input보다 낮은건 문제가 되지 않는다.
4. @Cd = noise (input)*chv ("GRAYSCALE"); // 과 같이 noise(input)에 chv()으로 곱하여 색상들의 수치를 3D값으로 조절 시킬 수 있다.
방금전 만들었던 vex와 지난 시간 exercise때 활용하였던 vex끼리의 wrangle들을 연결하여 이런 모양의 쉐입을 완성하였다. (지난 시간에 활용하였던 vex는 Day 7 exercise 1번문제 참조).
Exercises:
1. How does this look when setting @P rather than @Cd?
이번 시간에 계속 @Cd로 noise()의 특성을 선보였던것과 달리 이번에는 @P에 값들을 저장하여 보니 grid가 noise의 방식대로 grid를 구성하는 모든 포인트들이 랜덤하게 3D상에서 값들을 설정하여 구겨진 쉐입을 형성하였다.
eg) @P = noise (input); // 앞서 선언한 변수 @P의 정보를 담고있는 변수 input에 noise() 파형을 적용시켜 @P 포인트의 위치값으로 나타내어라

2. Can you make a plane look like water? Like curtains? Like lumpy ground?
최대한 frequency와 offset그리고 색상 파라미터들을 조절하여 위의 문제가 제시하는 것들과 비슷하게 만들기로 하였다.
Water:
Curtains:
커튼은 float input = @P.x; // 처럼 @P.x 즉 오직 x방향으로 결정된 Point의 위치 attribute를 float variable input에 저장해줌으로써 한 방향으로 Noise()가 흘러가게끔 생성하였다.
Lumpy Ground:

3. What happens when you fit the values? Clamp? Run through a ramp?
@P.y = fit (noise (input), inputmin, inputmax, outputmin, outputmax); // 이런식으로 fit function을 활용해 clamp()와 fit()의 성능을 둘다 확인하고자했다. 예상했던데로 noise()가 적용된 grid상에서도 2,3번째 인풋에 따라 아랫 윗면이 압축되는 것을 확인 할수 있었고, 4,5번째 인풋에따라 확대와 축소가 되는 것을 알 수 있었다.

ramp를 chramp()을 사용하여 grid의 형태에 변화를 주는 것으로 해석하여 chramp()에 noise()가 적용된 input값을 넣어보고 ramp 파라미터를 조절하여 이와같은 모션을 만들었다.
4. Can you make stepped noise? Blocky noise? Hint: When we did quantising in an earlier lesson we took our distance 'd' and trunc'd it to reduce its precision. Here, you'd want to copy @P to a temp vector pos, quantise it, and feed that result to noise (see gif below)
5. What happens if you drive noise from a length function? From distance to a pig as the second input?
length()을 이용하여 sin()으로 만들었던 그리드의 파형처럼 noise로도 구성해봤는데 sin()과의 가장 큰 차이점은 저장한 @P.y과 @Cd값이 랜덤하게 설정되어 고르지 못하고 색깔도 다채로운 파형을 구성하였다.
또한 minpos()를 사용하여 지난번 rubbertoy와 grid를 활용해 만들었던 rubbertoy형상의 웨이브를 이번에는 pighead를 noise()파형을 주어 만들기로 해보았다. 역시나 이번에도 다채로운색과 랜덤한 높이값을 가진 파형을 만들어내었다.
6. stepped distance to the pig, driving noise, moving along @N?
이해가 안되었던 부분:
- Attribute VOP이 아닌 VEX만을 사용하여 어떻게 noise()로형성된 노이즈 쉐입을 흑백으로 바꿔주는 것이 궁금하였다. 분명 vex에서의 noise()의 기본적인 파형은 3D vector값으로 지장되있는것으로 추론할 수있었다. 그렇다면 이 3D vector값을 1D float값으로 바꾸어 vex상에서 모든 노이즈를 어떻게 @Cd에 저장하였을때 흑백으로 나타날 수 있는지 궁금하였다.
P.s) 스팅고님께서 노이즈값에 스케일 값을 곱해주면 흑백으로 볼수 있다고 하여
@Cd = chf("GRAYSCALE")*noise (input); // 처럼 chf()으로써 그레이스케일 값을 조절 가능케 하였다.
하지만 Dliss님께서는 만약 아래의 식과 같이 써주었을때
@Cd = noise (input);
@Cd *= chf("GRAYSCALE"); // 이렇게 하여 따로따로 계산하면 흑백으로 변환이 되지 않는 다는 것이었다. 노이즈 자체에 차원 개념으로 곱해주는 건지 컬러값을 3D로 곱해주는 건지 즉 noise function을 사용하고 세미클론 전까지 1d float 값을 곱해주었냐 3d vector값을 곱해주었냐가 wrangle에서 구분하는 척도인지.
확실한것은
vector input = @P;
@Cd = chf("GRAYSCALE")*noise (input);
같이 chf()을 3D vector값 noise(input)에 곱하면 3D로써 각기 달랐던 @Cd vector Attribute의 수치가 rgb 모두 동일하게되어 1D로 변하는 것이다.
나는 개인적으로 이 상태를 float*int = float 이듯이 float*vector = float 이라고 추론하였다. 앞에 있는 수치의 type이 우선시되어 결과 로 나타난다. 근데 이상한건 chf()을 noise(input) 뒤에 넣어도 float으로 결과가 나타났다.... 하 이게 아닌건가... 이쯤에서 뇌가 터지기 시작했다.
스팅고님의 추측은 noise(n)*ch("SCALE"); 스케일 디멘션에 따라서 노이즈의 디멘션이 결정되는 것같다고 하였다. 그래서 나중에 @Cd값에 적용하는것은 소용이 없는것 같다고 하셨다.
참고하면 좋은 사이트:
https://www.keatonwilliamson.com/houdini/noise/vex_noise_generator
- 내가 시도한 curlnoise()는 앞에 (float)을 선언 하여 3D vector값을 1D float값으로 바꾸어 색상을 흑백으로 바꾸는 것이 가능하였는데 noise()상에서 똑같이 하면 vex상에서 에러가 났다. curlnoise()와 일반 noise()가 다른걸까라는 의문점을 낳게 하였다.

- Exercise 4번과 6번이 조금은 햇갈리고 너무 힘들어서 내일 다시 시도해보기로 하였다
공부하면서 들었던 생각:
이번주에 오늘 중간고사를 마치고 noise()에 대해 공부하고 복습일기와 숙제가 남은것같다. 사실 중반까지 오니 내가 잘 공부하고 있는 건지 아닌건지 나는 아직 완전히 모르겠다. 솔직히 내가 공부하는 방식이 너무 기초만 다지는 것같아 조금 걱정이 된다. 나같은 경우는 바로 색다른 응용을 할 때 약간 해매는것 같아 기초를 탄탄히해야 그담에 내가 만들고 싶은걸 만들겠지라는 생각이 들곤하고 한편 나만 너무 초급단계에서 머무는게 아닌가라는 생각이 들때도 있다. 꾸준히 달려나가다보면 언젠간 그럴때가 오길 바라겠지라는 생각을 한다. 이번 숙제라도 최대한 솔루션 강의나 다른 도움없이 내가 직접 vex를 작성해서 최대한 예제와 비슷하게 그리고 조금 내가 원하는 방식으로도 응용하게라도 시도해봐야 할것같다. 그래도 지난번 배운 nearpoint()라든지 해서 전에 궁금했던 동일 grid에 두개의 동일한 방식의 파형을 어떻게 나타내지 라는 궁금증도 해소됬고 noise()로 인해 후디니로 더욱 다채로운것을 만들수 있구나라는 생각이 들게 끔 했던것 같다. cgwiki님의 커리큘럼이 이제 점차적으로 뭘 원하는지 살짝 알것 같은것같다. 어쨌거나 항상 뭐든지 꾸준히 해야 되는것같다.