티스토리 뷰

Processing

[Processing] Processing in 3D

생각많은 소심남 2012. 7. 21. 15:07

키넥트는 Depth 카메라입니다. 일반적인 RGB 카메라와 다른 점이라면 RGB는 그 보는 그대로가 정보인 것이고 Depth라고 하는 것은 보는 그대로가 아닌 하나하나의 픽셀속에 깊이에 대한 정보가 들어있는 것이지요. 그래서 보통 이미지 프로세싱을 하는데 있어서 RGB는 단순히 보는 것에 대한 정보만 뽑을 수 있기 때문에 삼차원적으로 모델링하는 방법이 매우 복잡합니다. 굉장히 어려운 수식도 들어가야 되고 상대적인 비율을 통해 모델링을 추구하기 때문에 정확하지도 않습니다. 이런 문제를 해결해준 것이 바로 ToF 카메라 방식인데 키넥트도 어떻게 보면 이런 종류안에 들어가겠지요.

 이번 포스팅에서는 그런 키넥트를 프로세싱에서 다루는데 앞서서 3D라는 정보를 뽑아내고자 합니다. 

 실질상으로 우리가 스크린을 통해서 보는 이미지들은 엄밀하게 말해서는 2D입니다. 우리는 깊이를 인지할 수가 없는거죠. 스크린 상에서 느껴지는 입체감이라고 하는 것은 보통은 우리의 눈에 의존한 원근감으로 인해서 발생하는 거라고 할 수 있습니다. 실제로 3D를 접하기 위해서는 3D비전이나 홀로그램이란 기법이 들어가야 하겠지요.


프로세싱에서도 3D를 표현하는 방법도 똑같습니다. 우리가 3D를 직접적으로 느끼지는 못하지만 원근감을 통해서 입체적인 성향을 볼 수 있다고 가정한 겁니다. 그래서 프로세싱 네부적으로 그걸 구현하는 라이브러리를 2개 제공합니다. 보통 많이 쓰는 것이 opengl 이지요. 한번 예제를 통해서 접근해보겠습니다.



위의 예제는 기본적으로 프로세싱에서 정육면체를 생성하는 겁니다. box라는 함수 자체가 저렇게 인자를 하나 받으면 width height depth 값을 모두 같은 값으로 취하겠다는 의미입니다. 만약 각각 다른 값을 주고 싶다면 인자를 3개 주면 되는 것이지요. 

실행시키면 다음과 같습니다.



어? 이게 상자야? 하고 의문을 가지실 분이 생기실 겁니다. 지금 위와 같은 경우는 translate라는 함수를 통해서 시점이 고정되어 있기 때문에 이렇게 묘사된 겁니다. 이제로 3차원적인 느낌을 구현하려면 다른 시점에도 볼 수 있게끔 해주는게 좋겠지요? 그래서 translate의 시점을 마우스로 잡아보겠습니다. draw의 translate를 다음과 같이 바꿔줍니다.



그러면 결과는 다음과 같이 얻을 수 있습니다.


다음으로 해볼 것은 이제 여러개의 박스를 생성했을 때 변화를 준 것을 기억하는 방법을 소개하겠습니다. 사실 뭔가를 기억한다를 프로그래밍적으로 구현하려면 메모리를 사용해야 되고, 가장 간편한 방법은 바로 Matrix Stack을 형성하는 겁니다. 사실 프로세싱 자체에서 그런 기능을 구현해줍니다. 만약 지금의 변화를 저장하고 싶으면 pushMatrix를 사용하면 되고, 다시 이전 상태로 돌아가고 싶으면 popMatrix를 이용하면 됩니다. 다음 예제를 한번 보겠습니다.



지금 새롭게 들어간 것이 바로 Push와 Pop인데 이를 통해서 영향을 줄 수 있는 것에 대한 범위를 한정지을 수 있습니다. 한번 주석처리를 한것과 비교해보세요. 아래의 결과는 위 코드를 실행시킨 결과입니다. 



지금 고정되어 있는 박스가 바로 100 크기의 박스이고 Push와 Pop으로 감싸고 있는 box들은 translate(mouseX,mouseY)의 영향을 받아서 자유롭게 움직이고 있습니다. 이전부터 나오고 있는 프로세싱의 특징이지만 한번 기능을 열어놓으면 하위 개념에도 그 기능에 대해서 영향을 받습니다. 그래서 translate이 효과를 미치고 있는 것이기도 하고요. 


어떤가요? 간단하게 3D 개체를 만들고 돌려보면서 입체감을 느끼는 테스트를 해보았습니다. 이를 잘 활용한다면 예제속에 있는 Point Cloud를 구현하고 이런 박스를 만들어서 재미있는 게임을 만들 수 있습니다. 이 역시 나중에 다룰수 있다면 좋겠고요. 



댓글