我正在開發用於HTML5畫布的基本射線引擎,該引擎用於像Wolfenstein 3D和Doom這樣的遊戲中作爲學習練習/愛好項目。我已經到了使用紋理貼圖在畫布上繪製牆的地步,經過相當一部分努力獲得相交測試功能之後,這種方法工作得很好。Raycasting引擎渲染創建輕微變形朝向屏幕邊緣增加
我正在糾正「魚缸」/「魚眼」失真效應(由於距離屏幕中心的角度越來越遠到相交點引起的失真效應),但我仍然有一個非常輕微但顯着的彎曲屏幕邊緣的失真。這可以在下面的圖片中可以看到(我畫直線的紅色線條,使效果更明顯):
任何人都可以闡明這是什麼失真的來源是光?這不是一個大問題,但我一直無法找出原因,所以我明顯錯過了一些東西,我相信有人必須知道答案。我已經非常廣泛地搜索了這個問題,並且網上沒有太多信息,但是我在論壇帖子中發現了以下代碼片段:
「使用恆定角增量而不是水平投影引起的翹曲是另一回事 - 這是橫向拉伸/聚束效應,儘管通常只有一個幾乎不明顯的效果(對於合理的FOV,儘管可以定義999999度FOV的事實應該響鈴),但除此之外,根本沒有任何合理的方式來補償它的開始是正確的......使用固定增量的角度是錯誤的,那就是所有這些。「
這聽起來像它可能指的是我正在經歷的同樣的失真,但除了提示固定角度增量是問題的根源之外,它沒有提供太多的幫助或洞察力(這是一個彎曲的失真,朝向屏幕邊緣看起來符合這個建議)。我使用來校正失真的功能是:
function m_CorrectRayLengthDistortion(dist, angleFromCentre){
return dist * Math.cos(MOD_Maths.degToRad(angleFromCentre));
}
MOD_Maths是一個公用程序模塊(在這種情況下用於從度的角度轉換爲弧度,從而餘弦函數可以使用它)。
對此的任何幫助都非常感謝,如果有人回答此問題,希望爲將來任何人遇到問題提供指導,因爲在線可用的主題缺乏信息。
謝謝:)
這並不像Wolfenstein/Doom的光線投射。他們使用了多個像素寬的列用於牆壁,但在這裏您似乎有1個像素寬的列;那個,或者你的紋理映射是離開的。 –
是的,我使用1像素寬的列,但這與我提到的遊戲(我只是試圖從同一個渲染系統中獲得更高的分辨率)是微不同的。我不是想複製Doom或Wolf3D的復古外觀,那不是重點。 –