在攝像機渲染時近大遠小的程度只受物體的深度影響?

在兩個大小相同的物體深度相同時,為什麼在屏幕邊緣的物體沒有比屏幕中央的物體要小?MVP變換我大體是明白的,而且按照變換的結果,確實屏幕邊緣的物體大小與屏幕中心的物體大小相同,但是按照現實世界的經驗來講,近大遠小不應該與物體和人眼的距離有關嗎?

怕我描述的不清楚,附一張圖:

攝像機的FOV我設置成了179 攝像機的位置是(0,0,0),中間物體的位置是(0,0,3),右側物體的位置是(530,0,3)。在屏幕上看起來是一樣大的。


你設置中間物體的位置是(0,0,3),右側物體的位置是(530,0,3),你設置的兩個物體的Z軸(深度)是一樣,所以是一樣大。


你的理論沒錯,而你出現的問題主要是因為你在測試中所設置的FOV(Field of View)-也就是視野過大所造成的,正常人的視角大約是45°左右,179°基本上是不會出現的。


因為投影實際上是把3D世界投到屏幕上了,屏幕一般是中間離你近,旁邊離你遠,看上去旁邊的就小了(曲面屏除外)


我是這樣理解的:

一般3D渲染引擎提供的默認透視矩陣使用的是平面小孔成像的原理,現實生活中的攝影機和攝像機也是這樣的,我們在看電視和電影的時候並沒有感覺有什麼不對,是因為這種透視在一定的範圍內是近似符合我們的直覺的。

而真實世界中,生物的眼球是球形的,當在特定的視區範圍內,我們能明顯感受到題主給出的透視感覺,這種透視其實是攝影當中常用的魚眼透視(球形透視)。

如果需要實現這種球形透視,當然也可以構造特定的透視矩陣來實現。只不過這個矩陣應該是一個非線性變換的矩陣(空間變換不均勻)。我沒有嘗試實現過這種效果,公式題主可以去搜索一下實現公式。

參考:

科學網-魚眼相機成像、校準和拼接(筆記) - 王琳的博文


推薦閱讀:

OpenGL ES 依次渲染到不同紋理速度很慢?
cocos2dx 如何做到無卡頓載入紋理?
理論計算機圖形渲染技術是否已經到了沒有什麼可以研究的地步了?

TAG:OpenGL | Unity遊戲引擎 | OpenGLES | 計算機圖形學 | DirectX |