坐標系變換


@版權聲明:本文版權歸作者所有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出,
本文鏈接[[簡書 - 寫文章 (jianshu.com)](坐標系變換 - 簡書 (jianshu.com))]([簡書 - 寫文章 (jianshu.com)](坐標系變換 - 簡書 (jianshu.com)))
如有問題, 可郵件(yumxuanyi@qq.com)咨詢。


關鍵字:OpenCASCADE

屏幕坐標系:以像素為單位 原點位于左上角,從左到右為X正方向,從上到下為Y正方向


image.png

A表示從屏幕坐標系 (原點在左上角 x正向向右 y正向向下)

到 屏幕坐標系,(原點在中心 x正向向右 y正向向上)
A=\begin{bmatrix} 1 &0 & \frac{-W }{2}\\ 0 &-1 & \frac{H }{2}\\ 0 &0 &1\\ \end{bmatrix}

A矩陣的意義:1. 將原坐標系中點 經(jīng)過矩陣運算 得到一個新的點,這個點還是位于原坐標系中
2. 構造了一個新的坐標系,新的坐標系中的點,在原坐標系中的位置點。
而我們要的是,原坐標系中的點,在新坐標系中的位置。所以可以對A求逆。

B = \begin{bmatrix} 1 &0 & \frac{W }{2}\\ 0 &-1 & \frac{H }{2}\\ 0 &0 &1\\ \end{bmatrix} ={A^{-1}}

Nw矩陣表示NDC-到窗口坐標系
N_W = \begin{bmatrix} \frac{W}{2} &0 & 0\\ 0 & \frac{H }{2} & 0\\ 0 &0 &1\\ \end{bmatrix}
W_N矩陣表示窗口到NDC坐標系
{W_N} = \begin{bmatrix} \frac{2}{W} &0 & 0\\ 0 & \frac{2}{H} & 0\\ 0 &0 &1\\ \end{bmatrix} ={N_W}{^{-1}}

所以從像素坐標系到NDC坐標系

{P_N} = {W_N} * A = \begin{bmatrix} \frac{2}{W} &0 & 0\\ 0 & \frac{2}{H} & 0\\ 0 &0 &1\\ \end{bmatrix} *\begin{bmatrix} 1 &0 & \frac{-W}{2}\\ 0 &-1 & \frac{H }{2}\\ 0 &0 &1\\ \end{bmatrix} = \begin{bmatrix} \frac{2}{W} &0 & -1\\ 0 & \frac{-2}{ H} & 1\\ 0 &0 &1\\ \end{bmatrix}

所以從NDC坐標系到像素坐標系

{N_P} = {P_N}^{-1} = \begin{bmatrix} \frac{W}{2} &0 & \frac{W}{ 2}\\ 0 & \frac{-H}{ 2} & \frac{H}{ 2}\\ 0 &0 &1\\ \end{bmatrix}
當給定窗口像素點的坐標(Px,Py),求NDC坐標位置
{P_N} * P = \begin{bmatrix} \frac{2}{ W } &0 & -1\\ 0 & \frac{-2}{ H } & 1\\ 0 &0 &1\\ \end{bmatrix} *\begin{bmatrix} Px \\ Py \\ 1 \\ \end{bmatrix} =\begin{bmatrix} \frac{2}{ W } Px -1.0\\ \frac{-2}{ H } Py +1.0\\ 1.0 \\ \end{bmatrix}

OpenCascade中,查看V3d_View中代碼
ndc中的點(xn,yn,zn) 窗口中的點(xp,yp)

convert(IXP,IYP,RXV,RYV) 中
xn = xp*2/w - 1.0
yn = (h-yp) * 2 / h - 1.0

convert(RXv, RYv,IXp,IYp) 中
xp = (xn + 1)* W / 2;
yp = H - H(yn+1)/2.0

以上變換滿足上面的矩陣推導結果


convert(IPX,IPY,Rx,RY,RZ )
xn = 2 * xp / w -1.0;
yn = 2 * (h-1-yp)/w - 1.0;
zn = 2.0 * 0.0 - 1.0;


convert(Rx,RY,RZ ,IPX,IPY)
xp = (xn + 1.0)* W / 2;
yp = H -1 - H(yn+1.0)/2.0


中卻不同,不同的原因是變換之前 窗口多了一個偏移量
相當于對于窗口像素坐標加了一個偏移量

OF = \begin{bmatrix} 1 &0 & 0\\ 0 & 1 & 1\\ 0 &0 &1\\ \end{bmatrix}

變換后 再變換到NDC空間
xp = xp
yp = yp+1

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容