3D Gaussian Splatting

상솜공방·2026년 8월 19일

논문 리뷰

목록 보기
58/58

3DGS 계열 용어

  • 3D Gaussian Splatting:
    장면을 삼각형 메시나 신경망 함수가 아니라 수백만 개의 반투명한 3차원 얼룩으로 표현하고, 그 얼룩들을 카메라 화면에 투영해 앞에서부터 겹쳐 칠하는 방식으로 그림을 만드는 3차원 재구성 방법이다. 이름의 splatting은 물감을 튀겨 찍는다는 뜻으로, 3차원 얼룩 하나를 화면에 눌러 찍는 동작을 가리킨다. 이 문서는 이 방법을 3DGS로 줄여 쓴다. 학습이란 사진 여러 장을 정답으로 두고 얼룩들의 위치, 크기, 색, 투명도를 조금씩 고쳐 사진과 최대한 같아지게 만드는 과정이다.

  • 가우시안 원시체:
    3DGS가 장면을 이루는 최소 단위다. 원시체(primitive)는 더 쪼갤 수 없는 구성 요소라는 뜻이다. 하나의 가우시안 원시체는 중심 위치, 퍼짐 모양, 불투명도, 색으로 이루어지며 아래 표가 그 전부다. 이 문서에서 "가우시안 수"라고 하면 장면 하나를 이루는 이 원시체의 개수를 말한다.

    성분기호숫자 개수
    중심 위치μ\mu33차원 공간에서 얼룩의 한가운데
    스케일ss3세 축 방향의 퍼진 정도. 축마다 다르면 타원체가 된다
    회전qq4타원체가 어느 방향으로 누워 있는지. 단위 사원수로 표현한다
    불투명도oo10이면 완전 투명, 1이면 완전 불투명
    구면조화 계수cc48보는 방향에 따라 달라지는 색. 차수 =3\ell = 3이라 색 채널 하나당 (+1)2=16(\ell+1)^2 = 16개이고 색이 세 채널이므로 16×3=4816 \times 3 = 48개다

    표 2-2 가우시안 원시체 한 개가 들고 있는 값의 목록이다.
    스케일과 회전이 합쳐져 얼룩의 퍼짐을 나타내는 공분산 행렬 Σ=RSSR\Sigma = R S S^\top R^\top를 만들며, 그 행렬의 정의는 바로 아래 항목에 있다. 구면조화 차수 =3\ell = 3은 E10 런의 cfg_argssh_degree=3으로 기록된 실측이며 이 문서의 모든 런이 같다. 따라서 원시체 하나가 들고 있는 숫자의 총합은 3+3+4+1+48=593 + 3 + 4 + 1 + 48 = 59개다. 이 문서에서 자주 조정되는 값은 스케일(2.1절의 평면화)과 불투명도(opacity reset)다.

  • 공분산 행렬:
    가우시안 얼룩이 3차원 공간에서 어느 방향으로 얼마나 퍼져 있는지를 하나의 3 곱하기 3 행렬로 적은 것이다. 스케일 세 개와 회전 네 개는 사람이 읽기 좋은 표현이고, 실제 계산은 이 행렬로 한다. 정의는 다음과 같다.

    Σ=RSSR,S=diag(s1,s2,s3)\Sigma = R S S^\top R^\top, \qquad S = \mathrm{diag}(s_1, s_2, s_3)
  • 공분산 정의의 기호:

    • Σ\Sigma: 3 곱하기 3 공분산 행렬. 대칭이고 양의 준정부호다. 이 행렬 하나가 얼룩의 모양과 방향을 모두 담는다.
    • SS: 스케일을 대각선에 놓은 3 곱하기 3 대각 행렬. s1,s2,s3s_1, s_2, s_3는 표 2-2의 스케일 세 값이다.
    • SS=diag(s12,s22,s32)S S^\top = \mathrm{diag}(s_1^2, s_2^2, s_3^2): 대각 행렬이므로 각 원소를 제곱한 것과 같다. 즉 축마다의 분산이다.
    • RR: 단위 사원수 q=(w,x,y,z)q = (w, x, y, z)에서 만들어지는 3 곱하기 3 회전 행렬. 얼룩을 어느 방향으로 눕힐지 정한다.
    • RR^\top: RR의 전치. 회전 행렬이므로 R=R1R^\top = R^{-1}이다.
  • 공분산 정의의 유도:

    1. 축에 정렬된 표준 정규 분포를 생각한다. 이때 공분산은 단위 행렬 II다.
    2. 각 축을 s1,s2,s3s_1, s_2, s_3배로 늘리면 좌표가 SS를 곱한 것으로 바뀐다. 확률변수 zz에 행렬 AA를 곱하면 공분산은 AIAA I A^\top로 바뀌므로, 이 단계의 공분산은 SSS S^\top다.
    3. 그 다음 얼룩을 RR로 회전시키면 좌표가 다시 RR을 곱한 것으로 바뀌므로 공분산은 R(SS)RR (S S^\top) R^\top가 된다. 이것이 위 식이다.
    4. 이렇게 쪼개 두는 이유는 학습 안정성 때문이다. Σ\Sigma를 아홉 개 수로 직접 최적화하면 학습 도중 양의 준정부호가 깨져 뜻이 없는 행렬이 되지만, ssqq를 최적화하면 어떤 값이 나와도 RSSRR S S^\top R^\top는 항상 올바른 공분산이 된다.
  • 단위 사원수에서 회전 행렬로:
    사원수(quaternion) q=(w,x,y,z)q = (w, x, y, z)는 네 개의 수로 3차원 회전을 적는 방법이며, 길이가 1인 것만 회전을 뜻하므로 단위 사원수라 부른다. 회전 행렬로 바꾸는 식은 다음과 같다.

    R(q)=[12(y2+z2)2(xywz)2(xz+wy)2(xy+wz)12(x2+z2)2(yzwx)2(xzwy)2(yz+wx)12(x2+y2)]R(q) = \begin{bmatrix} 1-2(y^2+z^2) & 2(xy-wz) & 2(xz+wy) \\ 2(xy+wz) & 1-2(x^2+z^2) & 2(yz-wx) \\ 2(xz-wy) & 2(yz+wx) & 1-2(x^2+y^2) \end{bmatrix}
  • 계산 예시:
    이 예시는 실제 실험값이 아니라 손으로 따라가기 위해 지어낸 토이 예시다. 가우시안 한 개만 쓴다.

    1. 스케일을 s=(0.02, 0.01, 0.0005)s = (0.02,\ 0.01,\ 0.0005) m로 둔다. 세 번째 축이 나머지의 40분의 1과 20분의 1이므로 이 얼룩은 납작한 원반이다.
    2. S=diag(0.02, 0.01, 0.0005)S = \mathrm{diag}(0.02,\ 0.01,\ 0.0005)이고 SS=diag(0.0004, 0.0001, 0.00000025)S S^\top = \mathrm{diag}(0.0004,\ 0.0001,\ 0.00000025)다. 각 원소는 0.022=0.00040.02^2 = 0.0004, 0.012=0.00010.01^2 = 0.0001, 0.00052=2.5×1070.0005^2 = 2.5 \times 10^{-7}로 계산했다.
    3. 회전을 하지 않는 경우, 즉 q=(1,0,0,0)q = (1, 0, 0, 0)이면 위 식의 x=y=z=0x = y = z = 0이므로 R=diag(1,1,1)=IR = \mathrm{diag}(1, 1, 1) = I다. 따라서 Σ=ISSI=diag(0.0004, 0.0001, 2.5×107)\Sigma = I \cdot S S^\top \cdot I = \mathrm{diag}(0.0004,\ 0.0001,\ 2.5 \times 10^{-7})다.
    4. 이제 zz축을 중심으로 90도 회전시켜 본다. 이때 w=cos45=0.7071w = \cos 45^\circ = 0.7071, z=sin45=0.7071z = \sin 45^\circ = 0.7071, x=y=0x = y = 0이다.
    5. 위 식에 넣으면 첫 행은 12(0+0.5)=01-2(0 + 0.5) = 0, 2(00.7071×0.7071)=12(0 - 0.7071 \times 0.7071) = -1, 00이고, 둘째 행은 2(0+0.5)=12(0 + 0.5) = 1, 12(0+0.5)=01 - 2(0 + 0.5) = 0, 00이며, 셋째 행은 0,0,12(0+0)=10, 0, 1-2(0+0) = 1이다. 즉 R=[010100001]R = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1\end{bmatrix}다.
    6. Σ=Rdiag(0.0004, 0.0001, 2.5×107)R=diag(0.0001, 0.0004, 2.5×107)\Sigma = R\,\mathrm{diag}(0.0004,\ 0.0001,\ 2.5\times10^{-7})\,R^\top = \mathrm{diag}(0.0001,\ 0.0004,\ 2.5\times10^{-7})가 된다. 첫 축과 둘째 축의 퍼짐이 서로 자리를 바꿨다. 회전이 실제로 얼룩을 돌려 놓았다는 뜻이다.
    7. 이 얼룩의 최단축은 0.0005 m이고, 2.1절 마지막에 나오는 평면화 손실 LscaleL_{scale}은 정확히 이 값을 벌한다. 가중치가 100이므로 이 얼룩 하나의 기여는 100×0.0005=0.05100 \times 0.0005 = 0.05다.
  • 화면 공분산으로의 투영:
    래스터화는 3차원 얼룩을 화면 위의 2차원 얼룩으로 바꾼 뒤 칠한다. 3차원 공분산 Σ\Sigma를 화면 좌표의 2 곱하기 2 공분산 Σ\Sigma'로 옮기는 계산이 그 첫 단계이며, 원근 투영이 비선형이므로 가우시안 중심에서 1차 근사한 야코비 행렬을 쓴다.

    Σ=JWΣWJ,J=[fxz0fxxz20fyzfyyz2]\Sigma' = J\,W\,\Sigma\,W^\top J^\top, \qquad J = \begin{bmatrix} \dfrac{f_x}{z} & 0 & -\dfrac{f_x x}{z^2} \\[6pt] 0 & \dfrac{f_y}{z} & -\dfrac{f_y y}{z^2} \end{bmatrix}
  • 투영 식의 기호:

    • WW: 세계 좌표를 카메라 좌표로 옮기는 3 곱하기 3 회전 부분이다. 외부 파라미터에서 나온다.
    • (x,y,z)(x, y, z): 카메라 좌표계에서 본 가우시안 중심의 좌표. zz는 카메라 앞쪽 거리다.
    • fxf_x, fyf_y: 초점 거리를 화소 단위로 적은 값. 내부 파라미터의 성분이다.
    • JJ: 원근 투영 (x,y,z)(fxx/z, fyy/z)(x, y, z) \mapsto (f_x x/z,\ f_y y/z)를 가우시안 중심에서 미분한 2 곱하기 3 야코비 행렬. 원근 투영은 직선을 보존하지 않는 비선형 변환이라 정확히는 가우시안이 가우시안으로 옮겨지지 않는데, 얼룩이 작다는 가정 아래 이 1차 근사를 쓴다.
    • Σ\Sigma': 화면 좌표계의 2 곱하기 2 공분산. 단위는 화소의 제곱이다.
  • 투영 식의 단계별 유도:

    1. 원근 투영은 (x,y,z)(fxxz, fyyz)(x, y, z) \mapsto \left(f_x \dfrac{x}{z},\ f_y \dfrac{y}{z}\right)다. zz로 나누는 자리가 있으므로 이 사상은 비선형이고, 가우시안을 그대로 통과시키면 결과가 가우시안이 아니게 된다.
    2. 그래서 가우시안 중심 (x,y,z)(x, y, z) 둘레에서 1차 테일러 전개를 한다. 즉 중심에서의 값에 1차 미분항만 남기고 2차 이상을 버려 사상을 국소적으로 선형 사상으로 갈음한다.
    3. 그 1차 미분 계수를 모은 것이 야코비 JJ다. 첫 성분 fxx/zf_x x / zxx로 미분하면 fx/zf_x / z, yy로 미분하면 0, zz로 미분하면 fxx/z2-f_x x / z^2이 되어 JJ의 첫 행이 나오고, 둘째 성분에 같은 절차를 밟으면 둘째 행이 나온다.
    4. 선형 사상 AA가 공분산을 AΣAA \Sigma A^\top으로 옮긴다는 성질을 두 번 쓴다. 먼저 세계 좌표를 카메라 좌표로 돌리는 WW를 적용해 WΣWW \Sigma W^\top을 얻고, 그 위에 위에서 만든 JJ를 적용해 JWΣWJJ\,W \Sigma W^\top J^\top을 얻는다. 이것이 정의식이다.
    5. 이 근사가 성립하는 조건은 얼룩이 작다는 것이다. 화면에서 크게 번지는 얼룩일수록 1차 근사의 오차가 커지며, 이 사실이 뒤에서 평면화된 큰 얼룩이 경계에서 부정확해지는 이유의 한 갈래가 된다.
  • 계산 예시:
    이 예시도 토이 예시이며 숫자는 손계산을 위해 고른 것이다.

    1. 위 항목에서 만든 회전 없는 얼룩 Σ=diag(0.0004, 0.0001, 2.5×107)\Sigma = \mathrm{diag}(0.0004,\ 0.0001,\ 2.5 \times 10^{-7})를 그대로 쓴다.
    2. 카메라가 세계 좌표와 같은 방향을 보고 있다고 두면 W=IW = I이므로 WΣW=ΣW \Sigma W^\top = \Sigma다.
    3. 얼룩의 중심이 카메라에서 2 m 앞이면서 광축에서 옆으로 1 m 비켜난 자리, 즉 (x,y,z)=(1,0,2)(x, y, z) = (1, 0, 2)에 있다고 두고 초점 거리를 fx=fy=1000f_x = f_y = 1000화소로 둔다. 화면으로는 주점에서 fxx/z=500f_x \cdot x / z = 500화소 떨어진 자리이므로 가로 1275화소 안에 들어온다.
    4. 그러면 fx/z=1000÷2=500f_x / z = 1000 \div 2 = 500이고 셋째 열의 첫 성분은 fxx/z2=1000×1÷4=250-f_x x / z^2 = -1000 \times 1 \div 4 = -250이다. 즉 J=[500025005000]J = \begin{bmatrix} 500 & 0 & -250 \\ 0 & 500 & 0 \end{bmatrix}다. 중심이 광축을 벗어나 있으므로 이 셋째 열이 살아 있고, 이것이 원근 왜곡을 1차로 담아내는 자리다.
    5. Σ=JΣJ\Sigma' = J \Sigma J^\top의 첫 대각 원소는 첫 행과 Σ\Sigma의 대각을 곱해 더한 5002×0.0004+(250)2×2.5×107=100+0.015625=100.015625500^2 \times 0.0004 + (-250)^2 \times 2.5 \times 10^{-7} = 100 + 0.015625 = 100.015625이고, 둘째 대각 원소는 5002×0.0001=25500^2 \times 0.0001 = 25이므로 Σ=[100.0156250025]\Sigma' = \begin{bmatrix} 100.015625 & 0 \\ 0 & 25 \end{bmatrix}다.
    6. 화면에서의 표준편차로 읽으면 가로 100.015625=10.0008\sqrt{100.015625} = 10.0008화소, 세로 25=5\sqrt{25} = 5화소다. 즉 이 얼룩은 화면에서 가로로 길쭉한 타원으로 찍힌다.
    7. 셋째 열이 실제로 일한 몫은 100 중 0.015625다. 얼룩이 납작해 세 번째 축의 퍼짐 2.5×1072.5 \times 10^{-7}이 작기 때문이며, 같은 자리에 두꺼운 얼룩(Σ33=0.0004\Sigma_{33} = 0.0004)을 놓으면 그 몫이 2502×0.0004=25250^2 \times 0.0004 = 25로 커져 첫 대각 원소가 정확히 125가 된다. 곧 원근 왜곡 항의 크기는 얼룩의 깊이 방향 두께에 비례한다.
    8. 규모 감각을 위해 거리를 두 배인 (1,0,4)(1, 0, 4)로 옮기면 fx/z=250f_x/z = 250, 셋째 열은 1000×1÷16=62.5-1000 \times 1 \div 16 = -62.5가 되어 Σ\Sigma'의 대각 원소가 4분의 1인 25.001과 6.25가 되고, 화면 표준편차는 5.0001화소와 2.5화소로 절반이 된다. 멀수록 작게 찍힌다는 상식이 식에서 그대로 나온다.
  • 불투명도:
    한 가우시안이 자기 뒤를 얼마나 가리는지를 나타내는 0과 1 사이의 값이며, 코드 옵션 이름은 opacity다. 원어를 그대로 쓰는 낱말이므로 옵션 이름이 나올 때는 opacity로 적고 설명할 때는 불투명도로 적는다. 학습 중에는 주기적으로 모든 가우시안의 불투명도를 낮은 값으로 되돌리는 조작이 있으며 이를 opacity reset이라 한다. aligned-03 실험의 기본 설정은 opacity_reset_interval=3000으로 3,000회 반복마다 재설정한다(출처: 각 런의 cfg_args 실측). 이 값을 9,000으로 늘린 조건 E14의 결과는 PSNR 29.9683으로 기준 조건 E10의 29.9483과 0.0200dB 차이에 그쳤고, 이는 런간 노이즈 0.1dB보다 작으므로 효과 없음으로 판정되었다.

  • 스케일:
    가우시안이 세 축 방향으로 얼마나 퍼졌는지를 나타내는 세 개의 값이다. 세 값이 모두 같으면 공 모양이고, 하나만 아주 작으면 납작한 원반이 된다. 이 문서의 모델 계열은 스케일 중 가장 작은 축을 강하게 벌하는 손실 항을 써서 모든 가우시안을 일부러 납작하게 만든다. 그 조작을 평면화라 부른다.

  • 구면조화 계수:
    같은 표면이라도 보는 각도에 따라 색이 달라지는 현상, 예를 들어 유리면의 반사나 금속 광택을 표현하기 위한 색 표현 방식이다. 구면조화(spherical harmonics)는 방향을 입력으로 받는 함수를 몇 개의 기본 파형의 합으로 나타내는 수학 도구이고, 그 합에 붙는 가중치가 구면조화 계수다. 차수 \ell을 쓰면 색 채널 하나당 계수가 (+1)2(\ell+1)^2개 필요하다. 이 연구의 모든 런은 sh_degree=3이므로 채널당 (3+1)2=16(3+1)^2 = 16개, 색이 빨강 초록 파랑 세 채널이므로 원시체 하나가 16×3=4816 \times 3 = 48개의 색 계수를 들고 있다. 계수가 하나뿐, 즉 차수 0이면 어느 방향에서 봐도 같은 색이고, 차수를 올릴수록 방향에 따른 색 변화를 더 세밀하게 표현한다. 이 문서의 실험군은 구면조화 차수를 변인으로 두지 않았으므로 이후 장에서 이 낱말은 배경 설명에만 등장한다.

  • 래스터화:
    3차원 가우시안들을 카메라 화면의 화소 격자 위 색으로 바꾸는 계산이다. 화면을 작은 타일로 나누고, 각 타일에 걸치는 가우시안만 골라 카메라에서 가까운 순으로 정렬한 뒤, 앞에서부터 차례로 겹쳐 칠한다. 한 화소의 최종 색은 다음 식으로 정해진다.

    C=i=1Nciαij<i(1αj),αi=oiGiC = \sum_{i=1}^{N} c_i\,\alpha_i \prod_{j<i} \left(1 - \alpha_j\right), \qquad \alpha_i = o_i \cdot G_i

    여기서 GiG_i는 화면 좌표에서 가우시안 중심으로부터의 거리로 정해지는 값이며, 앞 항목에서 구한 화면 공분산 Σi\Sigma_i'를 그대로 써서 다음과 같이 정의된다.

    Gi=exp ⁣(12(xμi)Σi1(xμi))G_i = \exp\!\left(-\tfrac{1}{2}\,(x-\mu_i')^\top \Sigma_i'^{-1} (x-\mu_i')\right)
  • 래스터화 식의 기호:

    • CC: 그 화소의 최종 색.
    • NN: 그 화소를 덮는 가우시안의 개수. 카메라에서 가까운 것부터 1번으로 매긴다.
    • cic_i: ii번 가우시안의 색. 구면조화 계수 48개와 보는 방향으로부터 계산된다.
    • αi\alpha_i: ii번 가우시안이 그 화소에서 실제로 발휘하는 가림 정도.
    • oio_i: ii번 가우시안의 불투명도. 화소와 무관하게 가우시안마다 하나씩 있는 값이다.
    • xx: 지금 칠하려는 화소의 화면 좌표. 단위는 화소다.
    • μi\mu_i': ii번 가우시안 중심을 화면에 투영한 좌표.
    • Σi\Sigma_i': ii번 가우시안의 화면 2 곱하기 2 공분산. 앞 항목의 Σ=JWΣWJ\Sigma' = J W \Sigma W^\top J^\top로 구한다.
    • GiG_i: 위 식으로 정해지는 0과 1 사이의 값. 화소가 중심과 정확히 겹치면 지수의 어깨가 0이라 Gi=1G_i = 1이고, 멀어질수록 지수가 음수로 커져 빠르게 0에 가까워진다.
    • j<i(1αj)\prod_{j<i}(1-\alpha_j): 나보다 앞에 있는 가우시안들이 이미 가리고 남긴 투과율. 앞이 불투명할수록 뒤의 기여가 줄어든다.
  • 래스터화 식의 유도:

    1. 빛이 카메라로 들어오는 경로를 생각한다. 가장 앞의 1번 가우시안은 자기 색 c1c_1을 자기 가림 정도 α1\alpha_1만큼 화소에 남긴다. 기여는 c1α1c_1\alpha_1이다.
    2. 1번을 통과해 살아남는 빛의 비율은 1α11-\alpha_1이다. 이것이 뒤로 전달되는 투과율이다.
    3. 2번 가우시안은 자기 색 c2c_2α2\alpha_2만큼 남기지만 이미 1번이 가린 뒤이므로 실제 기여는 c2α2(1α1)c_2\alpha_2(1-\alpha_1)이다.
    4. 이 과정을 NN번까지 반복하면 ii번의 기여는 앞의 모든 투과율을 곱한 ciαij<i(1αj)c_i\alpha_i\prod_{j<i}(1-\alpha_j)가 된다. 이를 전부 더한 것이 위 식이다.
    5. αi=oiGi\alpha_i = o_i \cdot G_i로 쪼갠 이유는 두 요인이 성질이 다르기 때문이다. oio_i는 가우시안마다 하나뿐인 학습 파라미터이고, GiG_i는 화소마다 다시 계산되는 기하학적 감쇠다. 학습이 조정하는 것은 oio_i이고 GiG_i는 위치와 모양이 정해지면 따라 나온다.
  • 계산 예시:
    이 예시는 실제 실험값이 아니라 손으로 따라가기 위해 지어낸 토이 예시다. 가우시안 두 개와 2 곱하기 2 화소만 쓴다. 실측값과 혼동하지 않도록 여기 나오는 숫자는 모두 가상이다.

    1. 가우시안 A는 카메라에 가깝고 불투명도 oA=0.6o_A = 0.6, 색 cA=1.0c_A = 1.0이다. 가우시안 B는 뒤에 있고 oB=0.5o_B = 0.5, 색 cB=0.2c_B = 0.2이다. 색은 설명을 단순히 하려고 채널 하나만 쓴다.
    2. B는 네 화소를 고르게 덮어 GB=1.0G_B = 1.0이므로 모든 화소에서 αB=0.5×1.0=0.5\alpha_B = 0.5 \times 1.0 = 0.5다.
    3. GG를 실제로 계산해 본다. 먼저 가장 단순한 경우로, A의 화면 공분산이 ΣA=[1001]\Sigma_A' = \begin{bmatrix} 1 & 0 \\ 0 & 1\end{bmatrix}, 즉 가로세로 표준편차가 모두 1화소인 동그란 얼룩이라 하자. 중심에서 1화소 떨어진 화소는 d=(1,0)d = (1, 0)이므로 지수의 어깨가 12(12÷1+02÷1)=0.5-\tfrac12 (1^2 \div 1 + 0^2 \div 1) = -0.5가 되어 GA=exp(0.5)=0.6065G_A = \exp(-0.5) = 0.6065다. 중심 화소는 d=(0,0)d = (0,0)이라 GA=exp(0)=1.0G_A = \exp(0) = 1.0이다.
    4. 이제 아래 5번부터 쓸 네 개의 값을 만들기 위해 A를 조금 더 납작하게 둔다. 화소 중심을 왼쪽 위 (0,0)(0,0), 오른쪽 위 (1,0)(1,0), 왼쪽 아래 (0,1)(0,1), 오른쪽 아래 (1,1)(1,1)로 놓고, A의 중심을 μA=(0,0)\mu_A' = (0,0), 화면 공분산을 ΣA=diag(0.7213, 0.2791)\Sigma_A' = \mathrm{diag}(0.7213,\ 0.2791) 화소 제곱으로 둔다.
    5. 왼쪽 위: d=(0,0)d = (0,0)이므로 GA=exp(0)=1.0G_A = \exp(0) = 1.0이다.
    6. 오른쪽 위: d=(1,0)d = (1,0)이므로 어깨는 12×(1÷0.7213)=0.6931-\tfrac12 \times (1 \div 0.7213) = -0.6931이고 GA=exp(0.6931)=0.5000G_A = \exp(-0.6931) = 0.5000이다.
    7. 왼쪽 아래: d=(0,1)d = (0,1)이므로 어깨는 12×(1÷0.2791)=1.7915-\tfrac12 \times (1 \div 0.2791) = -1.7915이고 GA=exp(1.7915)=0.1667G_A = \exp(-1.7915) = 0.1667이다.
    8. 오른쪽 아래: d=(1,1)d = (1,1)이므로 어깨는 (0.6931+1.7915)=2.4846-(0.6931 + 1.7915) = -2.4846이고 GA=exp(2.4846)=0.0833G_A = \exp(-2.4846) = 0.0833이다.
    9. 따라서 화소별 GAG_A는 1.0, 0.5, 0.1667, 0.0833이고 αA=oAGA\alpha_A = o_A \cdot G_A0.6×1.0=0.60.6 \times 1.0 = 0.6, 0.6×0.5=0.30.6 \times 0.5 = 0.3, 0.6×0.1667=0.10.6 \times 0.1667 = 0.1, 0.6×0.0833=0.050.6 \times 0.0833 = 0.05다. 아래 색 계산에서는 원본 보고서가 마지막 값을 0으로 반올림해 두었으므로 두 경우를 모두 적는다.
    10. 왼쪽 위 화소: C=1.0×0.6+0.2×0.5×(10.6)=0.6+0.2×0.5×0.4=0.6+0.04=0.64C = 1.0 \times 0.6 + 0.2 \times 0.5 \times (1 - 0.6) = 0.6 + 0.2 \times 0.5 \times 0.4 = 0.6 + 0.04 = 0.64.
    11. 오른쪽 위 화소: C=1.0×0.3+0.2×0.5×(10.3)=0.3+0.2×0.5×0.7=0.3+0.07=0.37C = 1.0 \times 0.3 + 0.2 \times 0.5 \times (1 - 0.3) = 0.3 + 0.2 \times 0.5 \times 0.7 = 0.3 + 0.07 = 0.37.
    12. 왼쪽 아래 화소: C=1.0×0.1+0.2×0.5×(10.1)=0.1+0.09=0.19C = 1.0 \times 0.1 + 0.2 \times 0.5 \times (1 - 0.1) = 0.1 + 0.09 = 0.19.
    13. 오른쪽 아래 화소: αA\alpha_A를 0으로 반올림하면 C=1.0×0+0.2×0.5×1.0=0.10C = 1.0 \times 0 + 0.2 \times 0.5 \times 1.0 = 0.10이고, 반올림 없이 0.05를 쓰면 C=1.0×0.05+0.2×0.5×0.95=0.05+0.095=0.145C = 1.0 \times 0.05 + 0.2 \times 0.5 \times 0.95 = 0.05 + 0.095 = 0.145다. 두 값의 차이 0.045가 반올림이 만든 오차의 크기다.
    14. 결과를 보면 A가 강하게 덮은 화소일수록 색이 0.64에 가깝고, A가 거의 없는 화소는 B의 색만 남아 0.10 부근이 된다. 즉 한 화소의 색은 그 화소를 덮는 모든 가우시안의 협상 결과이며, 어느 하나가 단독으로 정하지 않는다.
  • densify와 prune:
    densify는 표현이 모자란 곳에서 가우시안 수를 늘리는 조작이고, prune은 쓸모없어진 가우시안을 지우는 조작이다. 둘 다 코드 옵션 이름이므로 원어를 그대로 쓴다. densify의 판정 기준은 화면 공간 위치 기울기의 누적값이다. 어떤 가우시안을 조금 움직였을 때 손실이 크게 줄어든다면 그 자리는 지금의 가우시안 하나로는 감당이 안 된다는 신호이므로 쪼갠다. prune은 불투명도가 임계 아래로 떨어졌거나 화면에서 지나치게 커진 가우시안을 지운다.

  • clone과 split:
    densify가 가우시안을 늘리는 두 가지 방법이다. clone은 작은 가우시안을 하나 더 복제해 같은 자리 근처에 놓는 조작이고, split은 큰 가우시안을 둘로 쪼갠 뒤 각각의 스케일을 줄여 원래가 덮던 영역을 나눠 맡게 하는 조작이다. 덜 자란 영역은 clone으로 채우고, 지나치게 큰 얼룩 하나가 세부를 뭉개고 있는 영역은 split으로 나눈다는 것이 원래 3DGS의 설계 의도다.

  • relocation:
    죽은 가우시안, 즉 불투명도가 거의 0으로 떨어져 화면에 아무 기여도 하지 않게 된 가우시안을 지우는 대신 아직 표현이 모자란 다른 위치로 통째로 옮기는 조작이다. 총 개수를 고정한 채로 배치만 바꾸므로 메모리 상한을 지키면서 용량을 재배분할 수 있다.

profile
상어 인형을 좋아하는 사람

0개의 댓글