2016-06-26 23 views
1

我需要創建此軟件光柵化程序,該投影(P),視圖(V)和模型(M)矩陣可以創建點雲的2D圖像( pc)以位圖格式(單色位圖)從給定的觀點來看。使用視錐體進行3D到2D投影具有翻譯問題

我得算算下來(和東西似乎工作在大多數情況下):

  1. 變換的點雲的點pc' = (P x V x M) x pc(注意,點雲已經在均相體系)
  2. 對於每個點,通過其w(同時小心丟棄具有w接近於零的點。
  3. 丟棄落在視錐外部的點分割的所有組件(通過使用該方法從P提取平截頭體平面中描述here
  4. 變換xy使用(x + 1) * imageWidth/2(-y + 1) * imageHeight/2(要有正確的y座標),每個點到屏幕座標的座標。
  5. 使用(int)y * imageWidth + (int)x(帶有邊界檢查)將產生的xy座標映射到位圖線性索引。

看來,一切工作正常:我得到的確切位圖,如果我用OpenGL渲染它,由任意四元數旋轉點雲仍然會給出有效的結果。

事情很好,直到我有一個翻譯組件在矩陣M!只要我有最輕微的平移量,圖像就會中斷:點雲會嚴重失真(彷彿已經應用了非仿射變換)。沿着哪個方向應用翻譯並不重要,任何翻譯都會攪亂一切,直到點雲不再被識別。起初我雖然我的模型矩陣轉置(導致非仿射變換),但似乎並非如此。

我可以發佈一些代碼,如果需要的話,但鑑於上述概述,我錯過了什麼?有什麼特別的考慮可能需要?

+0

無論如何看起來好的看看這些相關的QA:[瞭解4x4均勻變換矩陣](http://stackoverflow.com/a/28084380/2521214)和[數學計算簡單圖形管道](http:// stackoverflow .com/a/21100338/2521214),所以你可以比較。矩陣的順序是OpenGL風格,因此您還需要使用相同樣式(列主要)中的矩陣,否則操作將表現不同,因爲轉置矩陣是它們的反轉矩陣。我會將矩陣渲染爲座標系軸向量,以查看翻譯後它們是否正常。問題的視頻將有助於 – Spektre

+0

@Spektre謝謝,我會看看那些。內心的感覺說問題是觀看視錐體檢查......今天再次檢查,奇怪的是,翻譯後,相機後面的點仍然看起來不錯!另外,用一些人造球體進行測試,它們都很好看。我有一種感覺,翻譯不是在移動視角。奇怪的原因是,當在貼出的鏈接中使用該方法時,它說如果'P'矩陣是PxVxM,那麼在模型空間中計算平截體面... 有沒有辦法檢查點是否落在視錐體內而不提取飛機? – M2X

+1

我會嘗試改變點的顏色......對於'z zfar'使用'blue'和對其餘的''綠色'使用'這樣你應該看到剪輯是好的...你也可以疊加Frustrum多邊形... – Spektre

回答

1

這個問題非常愚蠢,以至於我爲這麼多時間浪費而感到羞恥。

原來,我的點雲中的一些點有錯誤w組件。我沒有遇到OpenGL方面的任何問題,因爲着色器手動將所有w s設置爲1.在光柵化器端,錯誤的w導致距離相機較遠距離的點在錯誤的透視位置投影。

我使用的測試球沒有任何問題,因爲他們有正確的w組件。

編輯:
只是覺得我還提到這一點:沒有必要提取視錐的飛機,以確定投射點是否視錐或內部沒有下降。人們可以簡單地通過確定變換點(x', y', z', w')中的所有x',y'z'分量來執行該檢查(即,乘以矩陣P x V x M後)落在範圍w'-w'。如果所有三個組件落在該範圍內,則該點是可見的,否則該點在視錐之外。