---
# System prepended metadata

title: 具形視覺筆記
tags: [2025_Spring]

---

---
tags: [2025_Spring]
---

# 具形視覺筆記


## Pinhole Camera

把 3D 空間中的點，投影到某個點後面距離 $f$ 的 2D 平面上。

## Homogeneous Coordinates

用 $n+1$ 維來表示 $n$ 維座標，在最後加一個維度，成倍數的點對應到同一個 $n$ 維座標，相當於一條過原點的直線。  
用來表示針孔相機：  
$$
x=f\frac{X}{Z},\quad y=f\frac{Y}{Z}\\
\begin{bmatrix}1&0&0&0\\0&1&0&0\\0&0&1&0\end{bmatrix}\begin{bmatrix}X\\Y\\Z\\1\end{bmatrix}=\begin{bmatrix}X\\Y\\Z\end{bmatrix}\Rightarrow \begin{bmatrix}X/Z\\Y/Z\\1\end{bmatrix}
$$
也可能需要縮放和平移：
$$
\begin{bmatrix}f&0&p_x\\0&f&p_y\\0&0&1\end{bmatrix}\begin{bmatrix}X/Z\\Y/Z\\1\end{bmatrix}=\begin{bmatrix}f\ X/Z+p_x\\f\ Y/Z+p_y\\1\end{bmatrix}
$$
可以比一般二維矩陣線性變換做到更多事，除了 Euclidean(平移、旋轉)、Similarity(加上縮放)、Affine(加上推移)，還可以做Projective(**透視變換**，比如正方形變成梯形)。

會發現 2D 到 3D 是不明確的，$x=PX=PHH^{-1}X=\tilde{P}\tilde{X}$。

## Image Rectification with Projective Transformations

Task: 把一張 2D 圖片轉正到與另一張不同角度拍的 2D 圖片一樣。

作法：先找出對應點(correspondence)，用特徵提取的演算法，比如 SIFT、CNN，再用 The Direct Linear Transformation Algorithm 找出 Transformation matrix $H$。

## Simple Stereo System

像人眼一樣，知道兩個相機的位置，則只需要兩張圖就能定位一個點。  
兩個相機未必要都往正前方看，因為可以校正到正前方。

## Epipolar Geometry

知道相機位置和姿勢(角度等)，則搜尋 Pixel Correspondence 時能夠限制在一條直線上。

### 概念

* Baseline: 兩個相機的光心連線
* Epipole: Baseline 與影像平面的交點
* Epipolar Line: 對於某物體，其在影像平面的投影與 Epipole 連線的直線。
* Epipolar Plane: 對於某物體，其與兩相機光心連線的平面。

把對於某個點 p，把相機 A 的 Epipolar Line 對應到相機 B 的影像平面上，就能夠限制搜尋範圍在 Epipolar Line (一條直線)上，也就是在空間中 p 與相機 A 的連線上。

把兩個相機的圖片校正後，可以發現 Baseline 與影像平面交在無窮遠處。

### 數學表示

假設對於一個點 x，相機 A 中對應到 X(以各自相機光心作為原點，自己的座標系)，相機 B 中對應到 X'，則有：$X'=RX+T$，其中 $R$ 為兩個相機間的旋轉矩陣，$T$ 為兩個相機間的平移向量。

$T\times X'=T\times (RX+T)=T\times RX$，因此 $X'\cdot (T\times X')=X'\cdot (T\times RX)=0$。

當表示外積 $a\times b$，可以變成 skew matrix $[a]_x$ 與 $b$ 相乘，即 $[a]_xb$。

Essential Matrix: Let $E=T_xR$、與 X 平行的 $p$、與 X; 平行的 $p'$，則有 Epipolar constraint $p'^TEp=0$。其中 $Ep=T_xRp=T\times Rp$

## Reconstruct 3D Model from Random Images

可以從網路上各種角度拍羅馬競技場的圖片，重建 3D 模型。

### 初始方法

先找 correspondence、estimate 3D、再 optimize。

### SIFT 的大致方法

找出一張圖的**有趣的點**(光影變化大之類的？)，並轉換成**特徵向量**，並把有重疊的圖片兩兩配對。  

#### RANSAC Algorithm

隨機找出一些 correspondence，算出 Fundamental Matrix，如果其他 correspondence 也符合那代表是個好的 Fundamental Matrix。

### Bundle Adjustment

對於所有 3D 空間中的點，讓它投影到平面上的位置與實際結果最接近。Minimize RMS error。

## DUSt3R

[Arxiv](https://arxiv.org/abs/2312.14132)，用神經網路，原理待補。

甚至可以用影片建構一個環境及動作（4D）

## 3D Representation

### 要考慮的點

### 表示平面的方式

* Depth Map: 一個 2D 圖片，每個 pixel 代表一個深度值。
  * 是一個 2.5D 表示法，離不開 2D 的圖像。
  * Surface Normal Maps: 一個 2D 圖片，每個 pixel 的三原色代表法向量的方向。可以用 Depth Map 做微分得到。
  * 缺點：只能得到可見部分。
* Point Cloud: 一堆 3D 點的集合，沒有順序。
  * 可能在物體上並不是均勻分布、無法表示連接性，同個物體的不同 Point Cloud 之間可能有很大差異，無法簡單的以 L2 等方式來比較。
  * Metics:
    * Chamfer Distance: 兩個 Point Cloud 之間的最小距離，對於 $S_1, S_2$ 兩個 Point Cloud，$d(S_1, S_2)=\sum_{x\in S_1}\min_{y\in S_2}\|x-y\|^2+\sum_{y\in S_2}\min_{x\in S_1}\|x-y\|^2$。
  * 點可以Render，把點壓成圓盤就行，但還是會有問題。
* Mesh: 表面以一堆三角形的集合表示，相當於把 Point Cloud 連起來，用另一個列表紀錄每個三角形的面是哪三個點。
  * 點的順序不重要，但面裡面的點順序很重要，代表面的方向。
  * > 修改 Mesh 是一個大的研究問題
  * > Remeshing: 重新生成 Mesh，可能在更不細緻的地方用更少的點表示。
* Parametric Model: 用數學參數式表示。
  * 例如貝茲曲線、貝茲曲面。
  * 缺點
    * 沒有全局資訊，例如無法知道一個點是否在形狀內。
    * 無法簡單 render。

### 表達物體的材質的資訊

* Parametric Model(Implicit Surfaces)，比如 $x^2+y^2=3^2$，函數值的正負表示在表面的哪一邊。也可以用 min、max 表示集合操作
* Signed Distance Function(SDF): 一個函數，對於每個點，給出最近表面的距離。與 Parametric Model(Implicit Surfaces) 相似。但不用學具體函數，比較好一點。
* Voxel Grid: 3D 網格，每個格子有一個值。
  * 優點：很好 sample、適合 Convolution
  * 缺點：需要很多記憶體、可能需要很高解析度來表示細節。
  * 改進：octree，把需要細節的部分才細分。但不能微分，神經網路無法輸出 Octree。若要 sample 需要經過很多層。
* Constructive Solid Geometry(構造實體幾何)：建模人員用布林操作建模。
* Tetrahedral Mesh: 用四面體表示。

### 表示間的轉換

* Continuous to Voxels: Sampling
* Voxels to Continuous: Interpolation 插值
* Voxels to Mesh: 用 Marching Cubes Algorithm
  * 對於每個方格，找出八個頂點的組合類型，並給出對應的 mesh
  * 優點：可平行化、不用學習
  * 缺點：Ambiguity 導致有問題，可能需要 remesh 等
* Mesh to Point Cloud: Sample points on triangles
  * 隨機 sample 會導致不均勻，不夠好
  * Farthest Point Sampling: 選擇離已選點最遠的點，這邊的距離要是 Geodesic，在平面上的距離，而不是 Euclidean。結果會好一點。
* Point Cloud to Mesh? Inherently an ill-posed Problem(本質上不適定)
* Point Cloud to Implicit Surface: 找出最近的點，並算出法向量，進而得出距離。
  * 找法向量過程相當於 to Surface Normals
* Implicit Surface to Mesh，先 Discritize，再用 Marching Cubes Algorithm

## Volume Rendering

可參考[知乎文章](https://zhuanlan.zhihu.com/p/595117334)以及[疑似原文](https://www.scratchapixel.com/lessons/3d-basic-rendering/volume-rendering-for-developers/volume-rendering-summary-equations.html)

### 現實現像的觀察

* Absorption: 霧等介質會吸收光線，使得物體看起來暗
* Emission: 物體自己發光
* Scattering: 散射，使光線變模糊
  * Forward: 來自別的方向的光被散射到這個方向
  * Backward: 來自這個方向的光被散射到別的方向

### Prerequisite: Solid Angle 立體角

一般的角度可以定義為圓弧長度除以半徑，而立體角就可以類似的定義為表面積除以半徑平方。  
因此會說一個圓有 $2\pi$ 的弧度，而一個球有 $4\pi$ 的**球面度(sr)**。

可以用積分計算表面積。

### 描述光的方式

#### Radiant Intensity

輻射強度 $I$，從一個來源發出的光

一個點光源的光功率（輻射通量）為 $\Phi$，就是把輻射強度 $I$ 對表面積分。因此在均勻的點光源，$I=\frac{\Phi}{4\pi}$。

#### Irradiance

輻照度 $E$，在某個點每單位面積吸收的功率

$E(x)=\frac{d\Phi}{dA}$，$dA$ 是一個小面積，$d\Phi$ 是這個小面積上吸收的光。

若平面的法向量與光線呈現一個夾角 $\theta$，則因為面積乘以 $\cos\theta$，但輻射通量不變，輻照度也會乘以 $\cos\theta$。

輻照度會隨著距離平方反比衰減。

#### Radiance

輻射率 $L(x,\omega)$，在某位置($x$)、某方向($\omega$)上，通過(或發出、吸收)單位面積(與光線垂直)、單位立體角的輻射通量。

$$
L(x,\omega)=\frac{d I(x,\omega)}{dA_{\perp}}=\frac{d^2\Phi(x,\omega)}{d\omega dA\cos\theta}\\
$$

* 發射時，常常會以輻射強度 $I$ 來表示，所以再除以單位面積
  $$
  L_o(x,\omega)=\frac{dI(x,\omega)}{dA\cos\theta}
  $$
* 吸收時，常常會以輻照度 $E$ 來表示，所以再除以單位立體角
  $$
  L_i(x,\omega)=\frac{dE(x,\omega)}{d\omega \cos\theta}
  $$

##### 環境的輻照度

知道輻射率 $L_i(x,\omega)$，則對於立體角在一個半球上積分，可以得到半球的輻照度 $E$。

均勻半球對於一個水平的小平面，因為有些光線是斜的，因此其實輻照度是 $E=L\pi$

### Light Field

描述空間中所有光線的輻射率的分布。若知道物體的每個點以什麼強度發射光線、以及介質的資料，則可以用這些光線來 render 圖片，這就是 Volume Rendering。

### vs multi-view stereo

multi-view stereo(也就是前面提到的用 correspondence 重建 3D 模型)相當於假設物體散射的光線是均勻的，從任何角度看到的顏色、強度都一樣，但事實顯然不是如此。

### 在一個點的光線變化

吸收率 $\sigma_a$ 的定義為：經過單位長度被吸收的機率。類似的，散射率 $\sigma_s$ 為經過單位長度被散射的機率。

探討不同情況輻射率的變化量：

* Absorption  
  經過一塊長度 $dz$、吸收率 $\sigma_a$ 的介質
  $$
  dL=-\sigma_a(x)L(x,\omega)dz
  $$
* Emission  
  某段介質會發出光，輻射率 $L_e$，則通過長度 $dz$ 的介質
  $$
  dL=\sigma_a(x)L_e(x,\omega)dz
  $$
* Out Scattering
  和吸收類似，但要用散射率
  $$
  dL=-\sigma_s(x)L(x,\omega)dz
  $$
* In Scattering
  和發射類似，但要用散射率
  $$
  dL=\sigma_s(x)L_s(x,\omega)dz
  $$
  其中 L_s 代表從所有方向進來的輻射率。

### Radiative Transfer Equation

減掉吸收、減掉外散射、加上發射、加上內散射，就是一小塊介質產生的光線變化。  
（以下省略 $(x),(x,\omega)$）
$$
\begin{align*}
dL&=-\sigma_aLdz-\sigma_sLdz+\sigma_aL_edz+\sigma_sL_sdz\\
&=-\sigma_aLdz+\sigma_aL'dz\\
&=\sigma_a(L'-L)dz
\end{align*}
\\
\text{其中 } L'=L_e+\frac{\sigma_s}{\sigma_a}(L_s-L)
$$

### Transmittance (Absorption-only)

$T(x,y)$: 有多少比例的輻射率從 x 往 y 的方向($\omega$)會到達 y？只考慮吸收。

* 非均勻介質: 用積分表示
  $$
  \begin{aligned}
  &dL(x,\omega)=-\sigma_a(x)L(x,\omega)dz\\
  &\Rightarrow L(x_0+\omega z,\omega)=\exp\left(-\int_{t=0}^z\sigma(x+\omega t)dt\right)L(x_0,\omega)\\
  &\Rightarrow T(x,y)=\exp\left(-\int_{t=0}^{\|x-y\|}\sigma(x+\omega t)dt\right)
  \end{aligned}
  $$
* 均勻介質:
  $$
  e^{-\sigma\|x-y\|}
  $$

#### 均勻介質 - Volume Rendering

考慮背景光($x_z$)經過吸收後，加上中途發射的光線經過吸收的總和。

$$
L(x,\omega)=T(x_0,x_z)L(x_z,\omega)\\
+
\int_0^z T(x_0,x_t)\sigma_tL_e(x_t,\omega)dt\\
\approx 
\approx \sum_{i=1}^{N}T\left(x_0,x_{t_i}\right)\left(emission_{t_{i+1}}^{t_i}\right)
$$

#### 非均勻介質 - Volume Rendering

#### Volume Rendering with Voxel Grid

#### Spherical Harmonics Model View-Dependent Lighting

#### NEural Radiance Field (NERF)

直接叫模型學習：輸入位置、方向，輸出顏色、透明度。再進行 Volume Rendering，與圖片相比算出梯度後訓練模型。

## 3D Gaussian Splatting

[EWA Splatting](https://courses.cs.duke.edu/spring03/cps296.8/papers/EWAVolumeSplatting.pdf)

之前的方法都是對於相機看出去的每個像素計算，但其實可以在有物體的地方再計算就好。  
3D Gaussian 代表一個橢球，由中心座標($\mathbf{\mu}$)、3x3 的 Covariance matrix($\Sigma$)、顏色、透明度表示，其中 Covariance matrix 代表了橢球的長度、形狀、方向等。  
可理解為 $\Sigma=R S S^\top R^\top$，其中 $R$ 是旋轉矩陣，$S$ 是縮放矩陣。  

3D Gaussian 的 PDF：
$$
G(\textbf{x})=e^{-1/2(\textbf{x}-\mathbf{\mu})^\top \Sigma^{-1} (\textbf{x}-\mathbf{\mu})}
$$

(實際上會乘上一個正規化的常數：$\frac{1}{2\pi|V|^{1/2}}$)  
簡報中表示為 $\mathcal{G}_V(x-t)$，$V$ 是 Covariance matrix，$t$ 是 Gaussian 的中心。  
> 簡報中 $t,p$ 實際上有混用的情況，因此我一律使用 $t$ 代表中心，$p$ 代表 C2W 的位移。

### 大致具體過程

* 先以 SfM 等方式，產生一些點，用來初始化 Gaussian 的位置，作為 Gaussian 的中心。
* 投影到圖像上，與原本圖像對比，用誤差來更新 Gaussian 的位置、大小、顏色、透明度等參數。

### 渲染

無腦的方式：對於每個像素對應到 world space 中的方向，對深度積分，但太花時間。

#### 加速渲染

如果能把 Gaussian 投影到一個 2D 平面，那就可以很簡單的加總，不用對於每個像素、每個深度無論有無物體積分。

投影時需要有一個 space，使得以相機為中心的射線會與平面的法向量正交，實際上會以第三維度作為平面的法向量，這就是 ray space。

積分會變成：

$$
q(\hat{\mathbf{x}})=\int_{\mathbb{R}} \mathcal{G}_V^3(\mathbf{x}-t)dx_2=\mathcal{G}_{\hat{V}}^2(\hat{\mathbf{x}}-\hat{t})
$$
其中 $\hat{V}_{2\times 2}$ 是 $V_{3\times 3}$ 的左上角 $2\times 2$ 的部分。

過程是先把 world space 轉換成 camera space，再轉換為 ray space。

##### Notation

* hat：去掉第三維度，上方的 hat 即為此意思。
* $\mathbf{u}$：camera space 的座標
* $\mathbf{x}$：ray space 的座標
* $t_k$：world space 的 Gaussian 中心
* $\mathbf{u}_k$：camera space 的 Gaussian 中心
* $\mathbf{x}_k$：ray space 的 Gaussian 中心
* $V_k''$：world space 的 covariance matrix
* $V_k'$：camera space 的 covariance matrix，$V_k'=WV_k''W^\top$
* $V_k$：ray space 的 covariance matrix，$V_k=JV_k'J^\top=JWV_k''W^\top J^\top$
* $\phi$：camera-to-world transformation

##### 1. world space 到 camera space

把 Gaussian 從 world space 轉換到 camera space：由於 camera space 到 world space 是以 camera-to-world matrix 轉換，因此可以用它的反矩陣來轉換。

若 C2W 是 $\phi(x)=Wx+p$
$$
\mathcal{G}_{V_k''}(\phi^{-1}(\mathbf{u})-t_k)=\frac{1}{|W^{-1}|}\mathcal{G}_{V_k'}(\mathbf{u}-\mathbf{u}_k)
$$

##### 2. camera space 到 ray space

可惜 camera space 轉換到 ray space 不是 affine mapping：
$$
\mathbf{x}=\begin{pmatrix}x_0\\x_1\\x_2\end{pmatrix}
=m(\mathbf{u})
=\begin{pmatrix}u_0/u_2\\u_1/u_2\\ \|\mathbf{u}\|\end{pmatrix}
$$
但其實可以用它的 Jacobian 來近似：
$$
\mathbf{x}=m_{\mathbf{u}_k}(\mathbf{u})=\mathbf{x}_k+J_{\mathbf{u}_k}\cdot(\mathbf{u}-\mathbf{u}_k)\\
J_{\mathbf{u}_k}=\frac{\partial m}{\partial \mathbf{u}}(\mathbf{u}_k)
$$
$\mathbf{u}_k$：中心在 camera space 的座標。

因此 Gaussian 為：
$$
\frac{1}{|W^{-1}||J^{-1}|}\mathcal{G}_{V_k}(\mathbf{x}-\mathbf{x}_k)
$$

##### 3. Integrate

$$
\begin{align*}
q_k(\hat{\mathbf{x}})&=\int_{\mathbb{R}}\mathcal{G}_{V_k}(\hat{\mathbf{x}}-\hat{\mathbf{x}_k},x_2-x_{k2})dx_2\\
&=\frac{1}{|W^{-1}||J^{-1}|}\mathcal{G}_{\hat{V_k}}(\hat{\mathbf{x}}-\hat{\mathbf{x}_k})
\end{align*}
$$

### 好處

把物體以很多 3D Gaussian 表示後，可以

* 追蹤每個橢圓體的移動，進而做預測
* 明確、互相獨立：隨意縮放、貼上任意模型到任意場景
* particle-based：可以使用既有的物理模擬

## 4D Modeling

動作額外加了很多資訊，通常會是互動時所必須的。

如何描述運動？簡單的作法是像小球一樣當成剛體運動，但背景的移動難以表達，可以切分得很細，比如用每個粒子、像素的移動來表示。這也是模擬流體的方式。

人則是 Articulated Body，也就是具有關節，每個肢體會彼此牽連。

### 描述運動方式

* Particle motion(Lagrangian representation): 在河裡丟樹葉，紀錄樹葉的運動。
* Vector field(Eulerian representation): 在河裡放固定的偵測器，紀錄水流的運動。

### Optical Flow

如何從 2D 影像中找出動作？用 Optical Flow，就是要知道像素如何運動。

#### Brightness Constancy Constraint

同一個點移動時通常顏色不太會變，假設有個點從 $(x,y)$ 以 $(u,v)$ 的速度移動：

$$
I(x+u\Delta t,y+v\Delta t,t+\Delta t)\approx I(x,y,t)
$$

多變數泰勒展開：

$$
\begin{aligned}
&f(x,y)\approx f(a,b)+\frac{\partial f}{\partial x}(a,b)(x-a)+\frac{\partial f}{\partial y}(a,b)(y-b)\\
&I(x+u\Delta t,y+v\Delta t,t+\Delta t)\approx I(x,y,t)+\frac{\partial I}{\partial x}(x,y,t)u\Delta t+\frac{\partial I}{\partial y}(x,y,t)v\Delta t+\frac{\partial I}{\partial t}(x,y,t)\Delta t\\
&\Rightarrow \frac{\partial I}{\partial x}(x,y,t)u\Delta t+\frac{\partial I}{\partial y}(x,y,t)v\Delta t+\frac{\partial I}{\partial t}(x,y,t)\Delta t\approx 0\\
&\Rightarrow \frac{\partial I}{\partial x}\frac{\partial x}{\partial t}+\frac{\partial I}{\partial y}\frac{\partial y}{\partial t}+\frac{\partial I}{\partial t}\approx 0\\
\end{aligned}
$$

$\frac{\partial I}{\partial x}$ 可以用右邊像素減去左邊像素，y 也一樣。  
$\frac{\partial I}{\partial t}$ 可以用下一個時間的像素減去現在的像素。

但有 u v 兩個未知數，需要其他限制。

#### Lucas-Kanade

改進 Brightness Constancy Constraint，使用 Spatial Consistency Constraint：假設鄰近的點有類似的運動。有 n 個點，則變成：

$$
\begin{bmatrix}
\frac{\partial I(x_1,y_1)}{\partial x} & \frac{\partial I(x_1,y_1)}{\partial y}\\
\vdots & \vdots\\
\frac{\partial I(x_n,y_n)}{\partial x} & \frac{\partial I(x_n,y_n)}{\partial y}
\end{bmatrix}
\begin{bmatrix}
\frac{\partial x}{\partial t}\\
\frac{\partial y}{\partial t}
\end{bmatrix}
=-\begin{bmatrix}
\frac{\partial I(x_1,y_1)}{\partial t}\\
\vdots\\
\frac{\partial I(x_n,y_n)}{\partial t}
\end{bmatrix}
$$

寫成 $Ad=b$，則可能會用 $d=(A^\top A)^{-1}A^\top b$ 近似，但當 $A^\top A$ 病態(Pathological)時(eigenvalue 是 0 或很小)，解會數值不穩定。

與圖像連結，低紋理區域(如天空)的空間梯度很小，因此 $A^\top A$ 的 eigenvalue 很小，讓解不穩定。

此方法其實基於三個假設：

* 一階泰勒展開，假設運動幅度不大
* Brightness constancy constraint: 假設運動不會改變亮度
* Spatial consistency constraint: 假設運動在空間上是連續的

在運動太大時會失敗，因此可以先把影像畫質變低（相當於附近的點取平均），這樣運動就變小，再縮放回原本的大小。

如果 Spatial consistency 抓的點實際上是不同物體或景深，則效果會很差。如果能做物體的 segmentation 會好很多。

#### 這個年代的作法

用個神經網路，直接輸出 x y 軸的運動量。

### 3D Motion (4D)

給定單相機(monocular)的 2D 影片，希望能

* 在固定時間模擬不同視角
* 在固定視角模擬不同時間
* 在不同時間模擬不同視角

第一個想法，在每個時刻做 3D Volume Rendering 以 fit 出好的模型，不太好，因為沒有考慮隨時間的變化

#### Model the Motion \explicitly

[Arxiv](https://arxiv.org/abs/2011.12950)

Model 空間中每個點的運動

##### NERF to SpatioTenporal NERF

NERF 是輸入 Position+Direction 輸出 Color+Density。只要在輸入加上時間的維度就行了。

問題

* 但由於單相機，每個時刻只有一個視角的影像。可以用 Depth Loss 來改善。
* 被遮蔽的部分還是沒有被 Constain。用 Static scene loss，因為很大部分是靜態的，把其他時間的像素拿來用：$\|F(x,t)-F(x,t')\|_2^2$
* 還是沒有追蹤每個點隨時間的變化

#### Neural Scene Flow Fields

[Arxiv](https://arxiv.org/abs/2011.13084)

用某時間的每個點對應到其他時刻並 render。

問題：物體可能被遮蔽，比較難跟蹤點的移動。  
解法：

* 發生遮蔽的部分忽略掉，比如讓 Model 預測 i 到 j 哪些點會被遮蔽。把 Color loss 乘上遮蔽的機率，但還要加一項使遮蔽比例盡量低。

還有一個 Constraint 能利用：Cycle consistency constraint，預測 i 到 j 的運動，加上預測 j 到 i 的運動，應該要接近 0。

還是不太夠，如果能把靜態與動態區域分開，動態以上面講的方法做，靜態用原本的 NeRF，會更好一點。

#### 4D-Rotor Gaussian Splatting

[Arxiv](https://arxiv.org/abs/2402.03307)

用 4D Gaussian，因為 Gaussian 是局部連續的，所以可能需要切成很多塊。可以用 2D 平面加上時間變成 3D Gaussian 來想像。

這樣原生就支援了 Optical Flow，因為如果一個 Gaussian 斜斜的，也就是在不同時間的位置不太一樣，就代表了它的運動。

#### Dynamic 3D Gaussians

[Arxiv](https://arxiv.org/abs/2308.09713)

用同一個集合的 3D Gaussian 表示整個動態場景。大小(縮放矩陣)、顏色、透明度、background logit(上面提到作為背景的機率)不能改變，每個 Gaussian 只能改中心位置(三維)、旋轉角度(以四元數表示角度，避免 Gimbal Lock，可參考 [3b1b](https://youtu.be/zjMuIxRvygQ))。

但位置能隨意改變還是太自由，會為了 fit 而太不穩定。可以用基於物理的假設，因為鄰近的 Gaussian 通常會像是剛體一樣，相對位置與旋轉不太會變。

還可以加上 Local-orientation loss: 相鄰的 Gaussian 有類似的旋轉角度。Local-translation loss: 相鄰的 Gaussian 有類似的位移。雖然與剛體假設有點重複，但會讓學習變得更快。

#### DynaDUSt3R

[Arxiv](https://arxiv.org/abs/2412.09621)

聽不太懂

## Generative Model

[Arxiv](https://arxiv.org/abs/2311.16102): Generative Model 可以作為 Discriminative Model，把圖片加上噪音，讓模型針對某個分類，預測加入的噪音為何，與真實值比較。

[Arxiv](https://arxiv.org/abs/2301.00704): 結合 

## Lagrangian Incremental Potential

### Contact Modeling

#### 問題

1. 如何讓物體只有在接觸時才有摩擦力？
2. 如何讓物體在接觸時不會穿過去？
3. 在有摩擦力、不能穿過去的情況下，要如何解 Optimization？

#### Incremental Potential Contact

[Paper on ACM](https://dl.acm.org/doi/abs/10.1145/3386569.3392425)

Contraint 太多，那不如把它們都變成 Optimization 問題。

* Barrier Energy：防止穿透，距離很近時，才有影響。

$$
b(d,\hat d)=\begin{cases}
-(d-\hat d)^2\ln(\frac{d}{\hat d}), & 0<d<\hat d\\
0, & d\geq \hat d
\end{cases}
$$

* 摩擦力：記得有動摩擦力與靜摩擦力的差別。對於一個接觸 k，令其 Oriented sliding bases 為 $T_k(x)$...