5. 차원 압축 솔루션: 정사영 (Orthogonal Projection)

[도입부] 학습 목표 (Learning Objectives)

  • 태양 직사광선이 내리쬘 때 바닥에 생기는 2D 그림자, 3차원 입체 도형을 2차원 평면으로 고스란히 짜부시킬 수 있는 마법의 렌더링 스킬 ‘정사영(Orthogonal Projection)’의 원리를 해킹합니다.
  • 공중에 비스듬히 떠 있는 거대한 우주선 단면(넓이 $S$)이 바닥 평면에 빛으로 투사될 때 나타나는 그림자 넓이($S’$)가 각도 $\theta$ 에 의해 마법처럼 축소되는 공식 원리(코사인 $S’ = S \cos\theta$)를 흡수합니다.
  • 파이썬(Python)의 3D 모듈을 이용해, 공명도형을 위에서 수직으로 눌러 Z축 스탯을 0으로 뭉개버리는 납작 렌더링(Projection Force) 과정을 시뮬레이션으로 목격합니다.

1. 차원을 깎아내는 빛의 폭격: Projection

“정사영” 이란 한자어를 풀어 쓰면 ‘정면(직각)으로 쏘아 만든 그림자(영)’ 라는 뜻입니다. 영어로는 Orthogonal Projection, 컴퓨터 그래픽스와 3D 설계 프로그램에서 가장 많이 보게 될 단어입니다. 카메라 원근법 뷰를 치워버리고 물체를 위에서, 옆에서 정면으로 팍하고 뭉개버린 평면도(Top View)를 뽑아내는 그래픽 엔진 기술의 근간입니다.

허공에 떠 있는 막대기를 가위를 집어 들고 손전등 불빛에 맞춰 싹둑 썰어내 바닥에 딱딱한 선으로 붙여버리는 작업. 즉, 제트팩(Z축 깊이)에 할당된 메모리를 ‘0’ 으로 밀어버리고 3D의 입체감을 2D 종이의 납작함으로 다운그레이드 압축시키는 해킹 행위입니다.

경사진 널빤지가 위에서 내려리 쬐는 빛을 받아, 바닥에 짧아진 그림자로 수직 투하되는 모습을 다이내믹한 각도 표시와 함께 렌더링한 SVG



2. 각도와 길이의 함수: 기울어진 투영의 손상률 $\cos \theta$

햇빛이 머리 위에서 정확히 내리쬘 때, 연필을 비스듬히 들고 있으면 그림자의 길이가 원래 연필 길이보다 짜리 몽땅하게 압축되어 짧아집니다. 만약 연필을 바닥과 완전히 눕혀 0도(나란함)로 들고 지지고 그리면 길이가 그대로 $100\%$ 보존되고, 연필을 완전히 바닥과 수직인 90도로 세워 세로로 빛을 때려버리면 그림자는 그저 연필심 두께만 한 ‘점 하나’ (0) 로 소멸합니다. 이 마법 같은 빛의 손실률 압축 식은 다음과 같습니다.

💡 [정사영의 데이터 압축률 공식]
$\Rightarrow \text{[완전 짜부된 그림자의 크기]} = \text{[원래 물체의 크기]} \times \cos \theta$

  1. 선분의 축소 길이: $l’ = l \cos \theta$ (길이가 빗변 각도에 의해 잘려 나감)
  2. 도형의 축소 넓이: $S’ = S \cos \theta$ (거대한 기울어진 원반의 넓이도 납작한 타원 그림자로 손실됨)

오직 삼각함수, 그중에서도 높이 차이 갭을 죽여버리는 코사인($\cos\theta$) 수치만이 빛이 차원을 무너뜨리는 비율(0%~100%)을 컨트롤합니다.


3. 💻 파이썬(Python) 렌더링 엔진: 3D 평면 텍스처 정사영 스매시

과연 3차원 막대 선분이 빛 구역으로 내꽂힐 때 파이썬 코드가 어떤 방식으로 코사인 삼각 함수를 연산해 축소된 그림자 픽셀 배열을 만들어 내는지 자동화 스캐너로 관찰합니다.

🐍 파이썬 예제: Z축 박살(코사인 프로젝션) 2D 텍스처 추출기

import numpy as np

print("--- ☀️ 천장 투광등 포격! 3D ➔ 2D 정사영(Projection) 광학 스캐너 ---")

# 오리지널 3D 물체 데이터 세팅
# 공간상에 길이가 10 인 막대기(Lightsaber)가 바닥(XY평면)과 60도(θ) 각도로 기울어져 떠 있음
original_length = 10.0
# 각도를 라디안 단위 기계어로 변환 (60도)
angle_theta_deg = 60
angle_theta_rad = np.radians(angle_theta_deg)

print(f"[SYSTEM] 원본 오브젝트 픽셀 길이: {original_length} 단위")
print(f"[SYSTEM] 바닥면과의 기울기 스탯: {angle_theta_deg} 도 (라디안 {angle_theta_rad:.2f})")

# [핵심 로직] 빛을 위에서 수직으로 때려 X-Y 평면 도화지 바닥에 그림자를 덤프!
# 정사영 공식 ( l' = l * cos θ ) 가동
shadow_length = original_length * np.cos(angle_theta_rad)

print("-" * 50)
print("📡 [그림자 길이 렌더링 도출 완료!]")
print(f" 👉 도출된 압축 스탯 $\cos(60^\circ)$ 손실률 = 0.5 (즉, 사이즈 절반 타작)")
print(f" 👉 팍 짜부된 바닥 그림자의 최종 길이 = {shadow_length:.1f} 픽셀 단위")

# 결과창:
# --- ☀️ 천장 투광등 포격! 3D ➔ 2D 정사영(Projection) 광학 스캐너 ---
# [SYSTEM] 원본 오브젝트 픽셀 길이: 10.0 단위
# [SYSTEM] 바닥면과의 기울기 스탯: 60 도 (라디안 1.05)
# --------------------------------------------------
# 📡 [그림자 길이 렌더링 도출 완료!]
#  👉 도출된 압축 스탯 $\cos(60^\circ)$ 손실률 = 0.5 (즉, 사이즈 절반 타작)
#  👉 팍 짜부된 바닥 그림자의 최종 길이 = 5.0 픽셀 단위

결과에서 보듯, 60도로 고개를 빳빳이 든 길이 10짜리 괴물 막대도 위에서 쏘아대는 수직 광선(정사영 타격)을 맞으면, 바닥에는 코사인 60도의 디버프로 인해 길이가 정확히 타작(반토막) 나 5픽셀 짜리 초라한 선분($l’$)으로 강제 전락해 버립니다.


[결론] 학습 정리 (Summary)

  1. Top View 렌더러: 3D 애니메이터가 캐릭터 머리 위에서 빛을 쏴 바닥 평면에 달라붙는 납작한 그림자 레이어를 만드는 원리가 바로 이 공간도형의 직각 빔 분쇄술인 ‘정사영’ 시스템입니다. Z 데이터 스펙(높이)이 전부 0으로 파쇄됩니다.
  2. 이면각 도출 치트키: 수능 시험지처럼 3차원이 징그럽게 그려진 곳에서, 공중에 뜬 평면 조각(S)과 바닥 그림자 조각(S’)의 넓이 두 개만 어찌저찌 알아내면 코사인 역추적 기능( $S’ \div S = \cos \theta$ )을 통해 우주 공간 속 두 판이 이루는 경사각을 칼같이 해킹해 낼 수 있습니다.
  3. 수직으로 때려라: 그냥 빛을 비스듬히 쏘는 건 그냥 그림자 놀이일 뿐 정사영이 아닙니다. 반드시 목표 투영 평면 바닥에 90도 직각(수선)으로 레이저가 꽂히면서 맺힌 교점의 점, 선, 면 데이터들을 모은 집합만을 순도 100% 진짜 정사영이라고 부릅니다.
서브목차