摘自
unity的實現**
//main problem encountered is camera.projectionmatrix = ??????? worked but further from camera became more inaccurate
//had to use gl.getgpuprojectionmatrix( ) seems to stay pretty exact now
//in script somewhere:
matrix4x4 viewmat = camera.worldtocameramatrix
;matrix4x4 projmat = gl.getgpuprojectionmatrix( camera.projectionmatrix, false );
matrix4x4 viewprojmat = (projmat * viewmat);
shader.setglobalmatrix("_viewprojinv", viewprojmat.inverse);
//in fragment shader:
uniform float4x4 _viewprojinv;
float4 getworldpositionfromdepth( float2 uv_depth )
先獲取當前位置的深度值,區間為[0,1]。然後把screen space的座標轉換到標準裝置空間(ndc),directx在ndc中x,y的區間是[0,1]。opengl是[-1,1],所以對opengl,最後乘上逆矩陣,之後做一次標準化。
方法很簡潔,就是把ndc的座標再通過逆矩陣轉換到世界座標。但其正確性需要證明一下,因為這裡有非線性變換,就是最後標準化,除以w的步驟。
簡要證明假設v
,pv ,p
分別為camera和projection轉換矩陣,最後得到的ndc的座標為(x
,y,z
) (x,
y,z)
。因為projection分成了兩個部分,線性部分和非線性部分,線性部分就是做矩陣變換,非線性部分就是除以最後的w維(其實w=
z′w =z
′,z′
z
′是當前點對應於世界空間中與camera在z軸的距離,看下面的投影矩陣形式就知道了),得到歐氏空間座標,也就是(x
,y,z
) (x,
y,z)
。因為看不到unity的原始碼,所以這裡寫出一般的正交投影矩陣,
r r
為aspect ratio,
α' role="presentation" style="position: relative;">α
α為vertial field of view,
f f
為視椎體遠平面,
n' role="presentation" style="position: relative;">n
n為視椎體近平面。 p=
⎡⎣⎢⎢
⎢⎢⎢⎢
1rtan(α/
2)00
001tan(α
/2)0
000f
f−n1
00−n
ff−n
0⎤⎦⎥
⎥⎥⎥⎥
⎥ p=[
1r
tan(α
/2)0
0001
tan(α
/2)0
000f
f−n−
nff−
n001
0]
unity使用的矩陣左乘,即 p∗
vin=
vout
p ∗v
in=v
ou
t,所以正交投影矩陣形式應該跟上面類似。乙個歐氏空間的頂點(x
,y,z
) (x,y
,z
)對應無數個齊次空間點(x
w,yw
,zw,
w)( xw
,yw,
zw,w
),w是非零的。
對於上述問題,假設w=
z′w =z
′,z′
z
′是當前點對應於世界空間中與camera在z軸的距離,區間為[n
ear,
far]
[ ne
ar,f
ar
],把ndc下的點(x
,y,z
) (x,
y,z)
寫成齊次座標(x
w,yw
,zw,
w)×1
w (xw
,yw,
zw,w
)×1w
,乘以逆變換矩陣將會得到實際在world space中對應的點(x
0,y0
,z0,
1)×1
w (x0
,y0,
z0,1
)×1w
,因為最後要做一次標準化,所以1w
1
w最後會消去,最終得到對應的歐氏座標。
補充進一步了解投影變換可以參考
根據身高重建佇列
題目 假設有打亂順序的一群人站成乙個佇列。每個人由乙個整數對 h,k 表示,其中h是這個人的身高,k是排在這個人前面且身高大於或等於h的人數。編寫乙個演算法來重建這個佇列。leetcode406 注意 總人數少於1100人。示例輸入 7,0 4,4 7,1 5,0 6,1 5,2 輸出 5,0 7,...
根據身高重建序列
是好想,但思路不好想,如果用c語言的話,那你的指標還得用的熟練 假設有打亂順序的一群人站成乙個佇列。每個人由乙個整數對 h,k 表示,其中h是這個人的身高,k是排在這個人前面且身高大於或等於h的人數。編寫乙個演算法來重建這個佇列。注意 總人數少於1100人。示例輸入 7,0 4,4 7,1 5,0 ...
LeetCode 根據身高重建佇列
題目如下 假設有打亂順序的一群人站成乙個佇列。每個人由乙個整數對 h,k 表示,其中h是這個人的身高,k是排在這個人前面且身高大於或等於h的人數。編寫乙個演算法來重建這個佇列。注意 總人數少於1100人。示例輸入 7,0 4,4 7,1 5,0 6,1 5,2 輸出 5,0 7,0 5,2 6,1 ...