시각화/프로세싱

▶프로세싱활용노트② ambientLight(), directionalLight()

비주얼라이즈 2015. 1. 13. 14:49



▶프로세싱활용노트② ambientLight(), directionalLight()


이번 글에서 살펴볼것은 프로세싱의 함수중에서 조명(light)관련 내용입니다. 이번 글은 레퍼런스와 샘플코드, 그리고 결과이미지를 정리하는 단순히 정리하는 정도에 그치기보다, 실제 프로세싱에서 조명기능을 활용하는데 필요한 가~~장기초적인 개념부분도 포함하고자 했습니다.




ambientLight() - 주변광


ambientLight()함수를 이야기하기전, 이 용어의 사전적 의미를 먼저 살펴보려고합니다. 'ambient'라는 단어는 '주위의, 잔잔한'이라는 뜻을 가지고 있으며, 이 ambient와 Light의 합성어인 ambientLight는 국어사전에는 나와있지않지만 '주변광'으로 용어를 이해할 수 있을 것 같습니다.




주변광이란?


1. 피사체에 비추는 직접적인 광선이 아닌 좌우후면에서 비추는 일반 조명.

2. 물체에 투사되는 빛 중에서 광원에서 직접 오지 않고, 다른 물체에 반사되어 비치는 간접광.

3. 컴퓨터 그래픽(스)에서, 모든 방향에서, 일정하게 분산하는 방향성 없는 광원, 모든 물체는 그들 방향성에 관계없이 일정하게 빛난다.


[ 자료 : 네이버 지식백과] 주변광 [ambient light] (만화애니메이션사전, 2008.12.30, 한국만화영상진흥원) ]


이렇게 사전에는 '주변광(ambient light)'에 대해 나와있지 않지만, 지식백과에서는 이에대한 내용이 잘 정리되어있습니다. 그리고 한가지 덧붙이자면, 컴퓨터그래픽스(CG)에서는 이 주변광에 대해 정확하게 계산하여 표현하는 것이 힘들기 때문에 '모든 방향에서 같은양의 빛이 입사된다'라는 가정을 한다고 합니다.







자 그러면, 본격적으로 프로세싱에서 이 주변광(ambient light)을 어떻게 다루고 있는지 살펴보도록 하겠습니다.











프로세싱에서의 ambientLight()


앞서 주변광(ambient light)에 대해 사전적 개념을 찾아본 것에도 다 이유가 있습니다. 바로 이 주변광의 성질이 프로세싱에서도 적용되기 때문입니다. 



프로세싱에서의 ambientLight()의 특징


① 특정 방향의 광원에서 직접 오는 빛이 아니다.

② 대부분의 경우 ambientLight()는 홀로쓰이지 않고 다른 Light()관련 함수와 같이 쓰인다.

③ 만약 ambientLight()기능을 사용하고자 할경우, draw()내에 남겨두자. (setup()안에서 설정했을 경우, draw()로 인해 실행되는 루프중 최초 1회만 실행되고 그 뒤로는 ambientLight()가 적용되지 않는다.)


프로세싱내의 ambient()기능적 특성에서 앞서 살펴봤던 사전과 지식백과의 개념들을 찾아볼 수 있습니다. 3가지로 정리해보긴 했는데, 3번은 다른 light()관련 기능에도 적용되는 부분이기때문에, 1번과 2번을 기억해두시면 되겠습니다. 






ambientLight()는 대개 홀로쓰이지않고, 다른 light()함수와 같이 쓰인다.


앞서 정리한 세 가지 내용중 두 번째에 해당되는 항목입니다. 이해를 돕기위하여 직접 프로세싱에서 여러가지 조건을 설정해놓고 결과물을 이미지파일로 저장해보았습니다.




프로세싱에서 ambientLight()의 적용예시



[ 예시의 기본적인 세팅 ]


이 사진은 ambientLight()기능도 사용하지않은 최초 이미지입니다. 사진속에는 3D속성의 shape 두 개가 있습니다.





[ 좌 : ambientLight()만 적용한 결과, 우 : ambientLight()와 directionalLight()를 함께적용한 결과 ]




좌측 사진에 대한 설명


위 사진에서 좌측의 결과물은 초기이미지에서 ambientLight()함수만 적용시켜본 것입니다. 색상값을 어두운 회색으로 지정해주었고, Light값도 z축을 기준으로 부여했지만 결과물을 보면 light()기능이 적용되었다고 느끼기 힘듭니다. 


우측 사진에 대한 설명


여기에 ambientLight()외에 다른 light()함수인 directionalLight()를 함께 적용해준 결과, 우측에 보이는 것처럼 원하는 바와같이 light()효과가적용된 모습을 확인할 수 있습니다. 이러한 이유로 ambientLight()는 혼자쓰기보다 다른 light()기능과 함께 쓰이는 경우가 많습니다.






 Syntax - ambientLight()


ambientLight(v1, v2, v3, x, y, z);

ambientLight(v1, v2, v3);


v1 : 현재 적용중인 색상모드(RGB 또는 HSB)에 따라 Red 또는 Hue를 의미한다.

v2 : 현재 적용중인 색상모드(RGB 또는 HSB)에 따라 Green 또는 Saturation을 의미한다.

v3 : 현재 적용중인 색상모드(RGB 또는 HSB)에 따라 Blue 또는 Brightness를 의미한다.










프로세싱에서의 directionalLight()


앞서 ambientLight()를 설명할 때 등장했던 directionalLight()입니다. 사전에서는 이를 "한 방향으로 같은양을 무한대로 투사하는 광선"이라고 정의하고 있습니다.



프로세싱에서 directionalLight()역시 사전적 정의에서 소개하는 특성과 동일하게 기능합니다.



프로세싱에서 directionalLight()의 특징


① 하나의 방향에서 빛이 온다.

② 빛은 물체표면의 정면을 비출때 가장 강하고, 물체의 정면에서멀어지는, 혹은  완만한 부분으로 갈 수록 약해진다.

③ 빛이 시작되어 물체의 표면에 도달한 뒤, 빛은 모든방향으로 산란한다.

④ directionalLight()설정은 draw()내에 남아있어야한다. (ambientLight()의 경우와 동일)







Syntax - directionalLight()


directionalLight(v1, v2, v3, nx, ny, nz);

directionalLight(v1, v2, v3);


v1 : 현재 적용중인 색상모드(RGB 또는 HSB)에 따라 Red 또는 Hue를 의미한다.

v2 : 현재 적용중인 색상모드(RGB 또는 HSB)에 따라 Green 또는 Saturation을 의미한다.

v3 : 현재 적용중인 색상모드(RGB 또는 HSB)에 따라 Blue 또는 Brightness를 의미한다.


nx, ny, nz : 조명이 향하는 방향을 지정하는 파라미터이다. 예를들어 y축에대해 -1로 설정하게 되면 물체의 아래부분에서 빛이 점등된다.








프로세싱에서 directionalLight()의 적용예시


[ 좌 : directionalLight()미적용, 우 : directionalLight()를 x축기준으로 -1 설정했을때의 결과 이미지]


앞선 ambientLight()의 경우와 마찬가지로 직접 프로세싱에서 각 축마다 '-1'값을 설정한 후 그 결과로 나타나는 이미지들을 함께 놓고 비교해보면 이해가 쉬우실 것입니다.






[ 좌 : directionalLight()를 y축기준으로 -1 설정했을때의 결과 이미지, 우 : directionalLight()를 z축기준으로 -1 설정했을 때 결과이미지]


directionalLight()을 사용할때 어느축을 기준으로 적용하느냐에 따라서 결과물에 큰 영향을 미친다는 것을 사진을 통해서 이해할 수 있습니다.