<圖學玩家 第002篇 原創文>
Ray Marching可以做為判斷Ray與3D表面相交情況的一種演算法。其算法原理主要是基於SDF的應用。以下圖為例,假設一射線由左下往右上移動,而右下角綠色球體則為透過SDF資訊所隱式(Implicit)表示的球面。藉由SDF的資訊,我們可以算出在每個Step之後,所要跨出的下一Step距離。
那為何SDF的資訊可以做為每個Step的依據呢? 以下圖為例,左上一相機對各方向發射線時,因為我們可以透過SDF得知與右下球面的最短距離,因此每個方向走該最短距離就可以確保不會有因為跨太大步而錯過球面的問題。
跨完第一步後,在每個位置仍可以透過SDF得知與球面的最短距離(青色箭頭),因此可以放心地繼續往射線方向跨出同青色箭頭長度的一步(如下圖所示)。
繼續前述步驟,接著會發生兩種情況。第一種情況如下圖,紅色射線遲早會與球面相交或相切。
第二種情況則如下,射線後續每一Step離球面越來越遠,則可以推知該射線與球面永不相交。
計算射線與球面是否相交有許多方式,例如可以直接用向量方式,透過線性代數去求解。當然Ray Marching應用不止於此,在渲染上的應用可能才是更為大家所熟知。只是透過該範例,可以讓大家比較直觀的了解Ray Marching算法的真正含意。