에셔의 작품에서 AI 협업까지, QuadDroste 플러그인 개발기
1. 20년 전의 화두: 에셔(Escher)와 무한 루프
네덜란드의 판화가 에셔(M.C. Escher)를 처음 알게 된 건 더글라스 호프스태터의 책 《괴델, 에셔, 바흐》였었다.
그 책에서 다룬 생각의 유사성을 사색하는 방식도 재미있었도, 에셔의 작품을 보는 것도 재미있었다.
그의 1956년 작 ‘Print Gallery’은 기묘한 구조를 지니고 있다.
갤러리에서 남자가 항구 풍경 판화를 감상하고 있는데, 그 판화 속에는 갤러리 자체가 그려져 있다
Print Gallery (M.C. Escher, 1956)
에셔는 이 그림 정가운데의 중심부를 채우지 않았다.
대신 그는 이 부분을 하얗게 비워둔 채 자신의 서명을 남겼다.
더 이상 계산하여 표현할 수 없는 시각적 특이점이었기 때문인 것 같다.
2. AI에게 던진 질문과 드로스테(Droste) 효과
시간이 흐르면서 다양한 자료들을 찾아보게 되었고, 누군가가 이미 계산을 통해 구현했다는 점도 알게 됐다.
해설도 적혀있었지만, 그 내용을 이해하긴 내 역량이 부족했다.
당시 제대로 이해를 하지는 못했지만, 최대한 비슷하게 그리는 프로그램을 만들어봤다.
그야말로 만들어만 보았고, 그냥 의미 없는 코드조각이었다.
최근에 기억의 조각을 모아 AI에게 질문을 던졌다.
그림 속에 자신이 무한히 반복되는 왜곡 필터의 정체를 물었다.
AI는 이것이 코코아 상자 그림에서 유래한 드로스테(Droste) 효과라고 답했다.
에셔의 작품 역시 이 알고리즘의 연장선에 있다는 결정적인 단서도 함께 얻었다.
3. 에셔의 아날로그 워크플로우: 격자와 작품의 탄생
에셔는 정식 고등 수학 교육을 받은 적이 없었다.
대신 천재적인 공간 직관력으로 정밀한 기하학적 그리드 시스템을 직접 고안했다.
에셔가 《화랑》을 그릴 때 사용한 실제 제작 프로세스는 다음과 같다.
우선 에셔는 왜곡이 없는 일반적인 평면 상태로 건물과 화랑의 밑그림을 먼저 그렸다.
그리고 자와 컴퍼스로 중심부로 갈수록 칸이 지수적으로 작아지며 회전하는 커스텀 왜곡 격자를 직접 그렸다.
누구나 이런 건 손으로 다 그릴 수 있잖아요
다음, 먼저 그려둔 평면 밑그림의 각 셀을 이 비틀어진 격자의 해당 칸에 맞춰 형태를 왜곡해가며 일일이 손으로 옮겨 그렸다.
대충 이렇게 했다는 뜻
현대 그래픽 소프트웨어의 텍스처 매핑 과정을 오직 인간의 눈과 손의 감각으로 수행한 것이다.
그 엄청난 집념의 결과물이 바로 우리가 아는 원작이다.
후대 수학자들은 이 아날로그 작도의 정밀함에 주목했다.
2003년 네덜란드의 헨드릭 렌스트라 교수 연구팀은 에셔의 격자 구조를 복소수 함수로 시뮬레이션하여 실제 작품 위에 비춰보는 분석을 진행했다.
분석 그리드를 작품에 비춰본 결과는 경이로웠다.
에셔가 오직 직관으로 배치한 건물의 기둥, 창문, 액자의 경계선들이 컴퓨터가 계산한 나선형 투영 격자선과 거의 오차 없이 매끄럽게 맞물려 떨어졌다.
수학 공식을 모르는 화가가 시각적 감각만으로 기하학적 최적해를 구현해 낸 순간이다.
연구팀은 이 투영 격자를 바탕으로 에셔가 비워두었던 중앙의 공백을 무한 반복되는 구조로 채워 넣으며 작품을 완전히 마무리지었다.
홈페이지에선 계속 들어가면서 더 깊은 곳을 보여줌
4. 에셔-드로스테 변환과 Quad 호모그래피의 수학적 명세 [AI로 정리]
이 시각적 마법을 프로그램으로 표현하려면 복소분석학의 ‘등각 사상’ 수식과 사영기하학의 결합이 필요하다.
이미지 평면의 각도를 보존하면서 사각형 원근 왜곡을 보정하는 알고리즘의 핵심 단계를 상세히 풀어본다.
1) 복소 평면(Complex Plane)으로의 사상
입력 이미지의 2차원 화소 좌표 \((x, y)\)를 하나의 복소수 \(z\)로 변환한다. 이를 오일러 공식을 이용한 극좌표계 형식으로 표현하면 크기 \(r\)과 각도 \(\theta\)의 관계로 나타난다.
여기서 \(r = \sqrt{x^2 + y^2}\) 이며, 동경 각도 \(\theta = \operatorname{atan2}(y, x)\) 이다.
2) 로그-폴라(Log-polar) 공간 변환
복소수 \(z\)에 자연로그를 취해 \(w\) 평면으로 매핑한다.
이 변환을 거치면 원래 평면의 동심원은 수직선이 되고, 중심에서 뻗어나가는 방사선은 수평선이 된다.
무한히 회전하며 작아지던 나선 구조가 직교하는 사각형 격자 형태로 전개되는 과정이다.
3) 복소 승수 \(\alpha\)를 통한 나선형 왜곡 (Escher’s 수식)
전개된 직선 격자를 비틀어 이음새 없는 나선 구조를 만들기 위해 복소수 계수 \(\alpha = a + ib\)를 곱한다.
이 변형된 공간을 다시 지수 함수를 통해 원래 평면으로 되돌리면 최종 사상식 \(f(z)\)가 완성된다.
\[f(z) = e^{w'} = e^{\alpha \ln(z)} = z^\alpha\]에셔의 작품처럼 한 바퀴 회전할 때마다 \(P\)배(원작은 256배) 축소되는 주기성을 매끄럽게 만족하려면, 복소수 계수 \(\alpha\)는 다음 조건을 충족해야 한다.
이 연산을 통해 이미지의 스케일 감소 비율(실수부 \(a\))과 회전각(허수부 \(b\))이 수학적으로 정밀하게 동기화된다.
4) 사각형 프레임 맞춤을 위한 호모그래피(Homography) 결합
일반적인 드로스테는 원형을 기준으로 작동한다.
하지만 액자 같은 임의의 사각형(Quad) 프레임에 맞춰 무한 루프를 형성하려면 사영 변환 행렬이 추가로 결합되어야 한다.
화면 공간의 좌표 왜곡을 보정하기 위해 \(3 \times 3\) 호모그래피 행렬 \(H\)를 적용한다.
플러그인 내부에서는 픽셀이 튀는 현상을 막기 위해 역방향 매핑(Inverse Mapping)을 수행한다.
출력할 대상 화소 좌표에서 시작하여 호모그래피 역행렬 \(H^{-1}\)을 곱하고, 다시 로그 나선 변환의 역산을 거쳐 원본 이미지의 실제 픽셀 위치를 추적해 나간다.
이 고차원 수학 수식들을 안정적인 알고리즘으로 설계하는 과정은 AI가 전담했다.
5. AI에 떠넘기기: 복잡한 공식을 코드로 구현하기
기하학 이론을 Paint.NET 플러그인에서 구동되는 C# 코드로 변환하는 작업 역시 AI가 수행했다.
Antigravity를 빡세게 돌려서야 겨우 구현할 수 있었다.
- 좌표 매핑 엔진 빌드:
로그 나선형 변환식과 화면 맞춤(Aspect Ratio Fitting) 로직을 처리하는 C# 수학 헬퍼 클래스 작성 - 디버깅과 품질 개선:
초기 렌더링 시 발생한 계단 현상과 회전 왜곡을 해결
Lanczos3, Spline36을 모두 LUT 적용하여 역시 고속화 - 구조 최적화:
실시간 연산 부하를 줄이기 위해partial클래스 도입
멀티스레딩에 최적화된 구조로 코드를 정돈하여 렌더링 속도 향상
6. 마치며
20년 전 에셔의 작품을 보며 느꼈던 지적 호기심이 오랜 시간을 지나 마침내 내 컴퓨터 안에서 플러그인 형태로 구현되었다.
에셔는 모눈종이에 자와 컴퍼스만으로 그리드를 채웠지만, 나는 AI를 동원해서야 겨우 C# 코드로 격자를 짤 수 있었다.
19년 전에 이걸 위해 찍었던 사진
오랜 호기심과 현대 AI의 기술 지원이 만나 만들어낸 의미 있는 결과물인 ‘QuadDroste’ 플러그인이다.
