數學知識

之前我們說有三個方向可以走 - 光、紋理、數學。然後我們簡單看了一個光的例子來學習z-buffer和紋理,現在我們來看一下相關的數學知識。這些也很重要。

需要了解的概念包括:

  • 矩陣是如何變換向量的: V = Matrix * V
  • 窗口變換、坐標變換: 同樣可以用矩陣表示
  • 正交投影、透視投影:矩陣表示
  • 左手坐標系vs右手坐標系
  • ...

這部分可以參考我的一些文章

  • [從零開始計算機圖形學]之十四數學知識 中的齊次坐標、變換矩陣部分
  • 矩陣的逆、坐標變換和窗口變換
  • LookAt、Viewport、Perspective矩陣
  • 左手坐標系vs右手坐標系

經過這些補充之後,我們需要知道的是為了變換物體位置,並且符合近大遠小的原則我們最終畫在屏幕上的點需要經過這些變換:

頂點 → 世界坐標系 → 攝像頭坐標系 → 投影 → 屏幕坐標系

viewport * projection * view * model * vertex.

加上數學

這裡我們簡單用一點點數學,我們不動物體,但是把眼睛/攝像頭放到 z = 3 的位置,頭像縮小一點點,再加上透視投影。

結果:

看起來不錯,近大遠小我們能看出來。

KrisYu/tinyrender?

github.com圖標

在geometry.h 中有較大的修改,引入了矩陣類及其運算。

說起數學我們還不能逃開一些問題,比如:

  • 我們在代碼中沒有考慮當我們變換物體的時候,它的法向量會怎樣變化?是否可以用同樣的矩陣來變換?→ 法向量變換
  • 我們把物體映射到一個範圍,但是不是物體的所有部分都在我們能看到的區域,所以這裡還需要一個裁剪步驟
  • 有些三角形可以提前丟棄(比如處於視線背面的),我們可以儘早的丟掉它們,這樣可以節省計算 → 參考隱藏面消除 中的背面消除部分
  • 需要比較清楚什麼時候選什麼坐標系中的頂點,比如光:它應該是跟哪個坐標系或者變換在什麼狀態下的頂點互動?

推薦閱讀:

相關文章