마우스로 고개 돌리듯 시점이 전환되는 감시 화면 UI
모니터 3개(L/C/R)를 2D perspective 셰이더로 기울이고, 주시하는 모니터가 정면으로 오게 하는 구조
3d로 구현하려다가 사지방에선 무리라고 판단, 2d에다가 perspective shader 적용하는 방향으로 틈
목표
- 배경은 그대로 두고, 모니터에만 perspective 셰이더 적용
- 마우스를 화면 끝으로 보내면 그쪽 모니터로 시점이 휙 돌아감
- 주시 중인 모니터는 항상 정면, 나머지는 곁눈질로 틀어져 보임
핵심 결정: 셰이더는 모니터에만
처음엔 배경 전체에 perspective를 걸 생각이었는데, 이 셰이더(Hei의 2D perspective)는 평면 한 장을 통째로 기울이는 방식이라 넓은 배경에 걸면 전체가 휘어버린다. 카메라 패닝이랑도 충돌하고.
그래서 회전이 필요한 대상(모니터)에만 걸기로 했다. 배경은 셰이더 없이 카메라만, 모니터는 제자리에서 기울기만. 둘이 안 싸운다.
시점 전환 원리
모니터를 각각 따로 돌리는 게 아니라, 하나의 시점각(view_yaw)에서 세 모니터 각도를 파생시킨다.
각 모니터의 y_rot = 그 모니터의 기준각 - 현재 시점각
시점각을 어떤 모니터의 기준각에 맞추면 그 모니터 y_rot이 0(정면)이 된다. "주시 모니터는 항상 정면"이 이 한 줄로 나온다.
회전만으론 "고개 돌림" 느낌이 안 난다. 회전 + 좌우 이동(패닝)을 같이 줘야 주시 대상이 화면 중앙으로 와서 입체적으로 보인다. 그래서 모니터 3개를 MonitorRig라는 부모 노드에 묶고, 그 부모를 시점각에 따라 좌우로 민다.
edge-scroll 방식 마우스 감지
처음엔 화면을 1/3씩 나눠서 마우스 위치로 판단했는데 너무 예민했다. 살짝만 움직여도 전환됨.
RTS/MOBA처럼 화면 양 끝 얇은 띠(80px)에 닿아야만 전환되게 바꿨다. 가운데 넓은 영역에선 아무 일도 안 일어난다.
계단식 전환 (잠금 로직)
R을 보다가 살짝 반대로 움직여도 안 튀고, 중앙을 거쳐야 다음으로 넘어가게 하고 싶었다. can_turn 잠금으로 해결.
- 끝 띠에 닿으면 한 칸 전환하고 즉시 잠김
- 마우스가 가운데로 돌아와야 잠금 해제
- "끝 → 중앙 → 끝" 왕복을 해야 한 칸씩 이동
R에서 바로 L로 두 칸 점프는 막혀 있다. 의도한 동작.
막힌 부분: 경첩 정렬
곁눈질 모니터의 안쪽 변이 가운데 모니터 변과 각이 딱 맞는 "부채꼴" 형태를 원했는데, 이 셰이더로는 깔끔하게 안 됐다.
- 셰이더에 pivot_x 넣어서 회전축 옮겨봄 → 모니터들이 중앙으로 끌려와 겹침. 회전축이랑 화면 확장 로직이 따로 놀아서 어긋남
- x_rot 살짝 섞어봄 → 위아래로 찌그러져서 더 어수선
이 셰이더는 평면을 공중에서 비스듬히 보는 방식이라 "한 변을 박고 세우는" 경첩은 구조적으로 안 맞는다. 제대로 하려면 노드 자체 회전 + pivot_offset을 쓰거나 진짜 3D로 가야 한다.
지금은 색깔 사각형으로 검증하는 단계라 픽셀 정렬을 맞춰봤자 실제 에셋 들어오면 다 바뀐다. 경첩은 에셋 단계에서 다시 보기로 하고 보류.
배운 것
- 리소스 공유 함정: 노드를 Ctrl+D로 복제하면 머티리얼 같은 리소스는 포인터만 복사돼서 공유된다. 하나 바꾸면 전부 바뀜. Make Unique로 끊어야 따로 논다. 셰이더, 애니메이션, 타일셋 등 모든 리소스에 해당.
- SubViewport 구조: 화면 속 화면. 혼자선 안 보이고 SubViewportContainer가 그려줘야 한다. 크기도 직접 지정해야 함. 나중에 UI를 여기 끼우면 기울어진 모니터 위에서 실제 화면이 돌아간다.
- 지금 값들(YAW 40, FOV 90, GAP 560, PAN 560)은 임시 검증용. 에셋 들어오면 다시 튜닝. 하지만 구조(셰이더 거는 법, rig 패닝, 잠금 로직)는 그대로 재사용된다.



다음
에셋 제작 → 씬 분리(Monitor.tscn) → 값 재튜닝 → 경첩 정렬 재시도 → 화면 콘텐츠 → 후처리 필터 순으로.
