根據深度資訊重建世界座標

2021-08-20 22:38:09 字數 2586 閱讀 4664

摘自

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 ...