腳下生根 之深度探索安卓OpenGL投影矩陣

2021-08-05 19:42:38 字數 1879 閱讀 1874

世界變化真快,前段時間windows開發技術熱還在如火如荼,web技術就開始來勢洶洶,正當web呈現欣欣向榮之際,安卓小機械人,咬過一口的蘋果,winphone開發平台又如閃電般劃破了混沌的web世界。

相信很多開發者都在疑問,為什麼世界不是圍著我轉?而是我在圍著世界轉。我的答案是,少林寺的和尚學打架,首先要學會站樁。要練功,先佔三年樁。少林寺的和尚打架從來不圍著別人轉,而是別人圍著他轉。

世界的原理都是相通的,開發者一樣,要做到腳下生根。

最近幾天在看opengl的投影矩陣,自己也實現了乙個投影矩陣:

【1 0 0 0】

【0 1 0 0】

【0 0 1 1/d]

[0 0 0 0]

其中d代表的是近平面的距離也就是near。

做任何事情,必須帶著疑問去學習,這是我的原則,不然就不要學,盡信書不如無書,是懂非懂不如不懂。我的疑問是為什麼opengl的投影矩陣那麼複雜,我想複雜必然有其複雜的道理。經過一番研究,其根本原因是為了將實景體對映到乙個立方體,範圍是【-1,1】的邊長為2的立方體。而不是直接變換到螢幕上。這就是opengl的想法。因此,像我那樣直接轉換到螢幕上就不對了。x,y經過這個變換後到-1,1. 而z的變換則必須滿足線性變換的規則。這個推導的過程並不複雜。原理是,x,y按照線性比例進行壓縮。z軸則進行一次線性變換以滿足線性矩陣的要求。這些推導很簡單,就不說了。

接下來要講的東西更加出人意外,因為既然研究ui的底層實現,不能僅僅限於opengl。於是我又追根究底地剖解了一下skia庫。skia庫在3d上可以說在opengl面前就是小菜一碟。但是它在2d圖形處理上,可以說opengl就是小菜一碟。因此互為補充。當然我研究的是skia也增加了一些在2d圖形進行3d特效的東東。其中有一些矩陣變換。剛好印證了我的矩陣是多麼的正確。具體參照skcamera.cpp這個檔案。具體裡面的那些數學矩陣運算怎麼怎麼進行的就不說了。根本原理就是我上面提到的那個投影矩陣。

這些東西很簡單。不是嗎?

具體opengl是怎麼算的,稍微有點線性代數知識的人,高等代數等都可以看懂,下面是這個鏈結。

void skcamera3d::patchtomatrix(const skpatch3d& quilt, skmatrix* matrix) const 

const skscalar* patchptr;

skpoint3d diff;

skscalar dot;

diff.fx = quilt.forigin.fx - flocation.fx;

diff.fy = quilt.forigin.fy - flocation.fy;

diff.fz = quilt.forigin.fz - flocation.fz;

dot = skunit3d::dot(*(const skunit3d*)(const void*)&diff,

*(const skunit3d*)(((const skscalar*)(const void*)&forientation) + 6));

// patchptr的結構為其中u,v 代表列向量

// origin 是座標原點

patchptr = (const skscalar*)&quilt;

/*其中matrix表示乙個3x3的矩陣

第一行代表u的係數,第二行是v的係數,第三行是diff 的係數

matrix 的每一列代表的是乙個座標軸。

*/ //第一列

//第二列

patchptr += 3;

//第三列

patchptr = (const skscalar*)(const void*)&diff;

matrix->set(skmatrix::kmpersp2, sk_unitscalar1);

}

深度探索Linux核心之自動分配UDP本地埠

在sock dgram型別的套接字的操作函式集的sendmsg成員函式中,每次呼叫對應的第4層協議的sendmsg成員函式時,都會進行埠號的檢查,如果沒有繫結就呼叫協議的成員函式get port進行自動繫結。代表inet域網路層套接字的結構體struct inet sock有兩個埠號相關的成員 u1...

深度探索c 物件模型學習筆記之物件

在c 中,有兩種資料成員 靜態的和非靜態的,以及三種類成員函式 靜態的 非靜態的和虛函式。已知如下class point宣告 class point 考慮乙個問題,class point在機器中是怎麼表現的呢?簡單物件模型 簡單物件模型,是為了降低c 編譯器的設計複雜度,賠上了空間和執行器的效率而開...

深度探索C 物件模型 之物件的差異加上多型之後

class zooanimal class bear public zooanimal dances dance know zooanimal za zoey zooanimal pza za bear b yogi bear pb b bear rb pb 基類zooanimal的物件布局如下,假...