• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            SoRoMan

            人若無名,便可專心練劍.

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              12 隨筆 :: 1 文章 :: 41 評(píng)論 :: 0 Trackbacks

            感覺很多書上都沒講清楚透視投影變換的推導(dǎo)過程,自己推導(dǎo)了下,以前一直含糊的關(guān)于方形/非方形的視平面和屏幕的寬高比的問題也有了答案.本文組織如下:

            1.相機(jī)空間到視平面的變換
            2.視平面到屏幕的變換
            3.綜合
            4.一般情形

            1.相機(jī)空間到視平面的變換


            ?????????????????????? * p (xc,0, zc)
            ???????????????????? ?/ |
            ??????????????????? ?/? |
            ?????????????????? ?/?? |
            ?????????? X??? |/???? |
            ?????????? ^???? *p' |(xp,0,zp)
            ?????????? |?? / |????? |
            ?????????? |? /? |???? ?|
            ?????????? | /?? |???? ?|
            C(cam)?|/??? |???? ?|
            --------*----|----*------------->Z
            ?????????? 0??? dx?? zc
            ???? (X-Z平面的投影示圖)

            a.透視投影一般的視景體為棱臺(tái),相機(jī)空間的物體會(huì)投影到視平面z=d,這里考慮左手坐標(biāo)系,矩陣使用行優(yōu)先方式。如圖所示,由相似三角形知識(shí)可知相機(jī)空間中的物體投影到視平面上的坐標(biāo)為:

            xp = xc*(dx/zc)
            yp = yc*(dy/zc)

            其中,xc,yc,zc為相機(jī)空間坐標(biāo),xp,yp,zp為視平面坐標(biāo),dx,dy為x,y軸向的視距view distance,視平面到camera的距離,
            故相機(jī)空間投影到視平面上的矩陣Tcp為:

            |dx 0? 0 0? |

            |0? dy 0 0? |

            |0? 0?? 1 1? |

            |0? 0?? 0 0? |

            (驗(yàn)證:Tcp右乘點(diǎn)p(xc,yc,zc,1)得點(diǎn)p'(xc*dx, yc*dy, zc, zc),轉(zhuǎn)換為3D坐標(biāo)為(xc*dx/zc, yc*dy/zc, 1),正確。)

            ********************************************************************
            注:因?yàn)檗D(zhuǎn)換過程中點(diǎn)使用的是4D齊次坐標(biāo),所以最后需轉(zhuǎn)換為3D坐標(biāo)。4D齊次坐標(biāo)(x,y,z,w)轉(zhuǎn)換為3D坐標(biāo)的方法為除以w分量,即對(duì)應(yīng)3D坐標(biāo)為(x/w,y/w,z/w)。
            ********************************************************************


            考慮dx/zc和dy/zc項(xiàng),如果dx != dy,則投影后x,y的比例會(huì)發(fā)生變化(原因:投影前坐標(biāo)比例為xc/yc,投影后為xp/yp = xc*(dx/zc)/yc*(dy/zc) = xc*dx/yc*dy),從而投影后的圖像的x,y比例會(huì)發(fā)生變形。

            ---------------------------------------------
            結(jié)論1:所以,一般都會(huì)令d=dx=dy,即x,y向的視距相同。否則,圖像失真。
            ---------------------------------------------

            考慮視角(view angle,或視野filed of view)的問題,視角的大小不會(huì)影響到物體投影后的坐標(biāo),只會(huì)影響可視的范圍。

            在視距一樣的情況下,x,y軸的視角可以不一樣。如果一樣,那么視平面就是一個(gè)正方形的。于是有:

            tan(theta_x/2) = width_p/d
            tan(theta_y/2) = height_p/d?

            其中,theta_x,theta_y為x,y軸向的視角,width_p,height_p為視平面z=d的寬度(x軸)和高度(y軸)。
            ----------------------------------------------------------------
            結(jié)論2:視平面的寬高比rp=width_p/height_p = tan(theta_x/2)/tan(theta_y/2)。
            ----------------------------------------------------------------

            2.視平面到屏幕的變換

            下面就是視平面到屏幕的變換了,這是一個(gè)2D到2D的變換(視平面的坐標(biāo)需伸縮以填滿整個(gè)屏幕空間,即在視平面中出現(xiàn)的所有的點(diǎn)要變換到屏幕上去,同時(shí)x,y軸向的比例還要維持和變換前一樣,以免比例失真,同時(shí)視平面的坐標(biāo)原點(diǎn)和屏幕中心點(diǎn)(x0=(width_s)/2, y0=(height_s)/2)對(duì)應(yīng)),其實(shí),就是一個(gè)坐標(biāo)縮放加平移的過程:

            xs = xp*kx + x0
            ys = -yp*ky + y0
            ?
            矩陣Tps為:

            |kx???? 0??????0 0? |

            |0????? -ky????0 0? |

            |0????? 0?????? 1 0? |

            |x0?? y0??????0 1? |

            (驗(yàn)證:Tps右乘點(diǎn)p(xp,yp,zp,1)得點(diǎn)p'(xp*kx + x0, -yp*ky + y0, zp, 1),轉(zhuǎn)換為3D坐標(biāo)為(xp*kx + x0, -yp*ky + y0, zp),正確。)

            其中,kx,ky(kx>0,ky>0)為x,y軸向的縮放因子(kx=(width_s)/(width_p), ky = (height_s)/(height_p),和視距相同,kx,ky的值必須一樣,否則圖像的x,y比例又會(huì)發(fā)生變形。這里-yp*ky是因?yàn)橐话闫聊坏膟軸是向下的,跟相機(jī)空間和視平面坐標(biāo)系中的y軸方向相反。
            ------------------------------------------------------------------------------------------------
            結(jié)論3: 一般令k=kx=ky,即x,y向的縮放因子相同。否則,圖像失真。
            于是有,width_s/width_p = height_s/height_p,變化等式得,rp = width_p/height_p = width_s/height_s = rs
            所以,在x,y軸視距一樣的情況下,要想最后變換到屏幕上的圖像x,y比例不失真,必須rp=rs,即視平面的寬高比和屏幕的寬高比一樣。

            -----------------------------------------------------------------------------------------------

            ********************************************************************
            注:若屏幕寬高為W,H,當(dāng)W != H,即屏幕不為方形的時(shí)候,要確保投影到屏幕上的圖像x,y比例不失真,則x,y軸視角(或視野FOV)肯定不能相等。
            原因: 由結(jié)論2,3知,rp=width_p/height_p = tan(theta_x/2)/tan(theta_y/2)=width_s/height_s=rs=W/H。 故由W/H != 1 => theta_x != theta_Y.
            ********************************************************************

            3.綜合:

            相機(jī)空間點(diǎn)p轉(zhuǎn)換到屏幕空間點(diǎn)p',變換公式為:

            xs = xc*(dx/zc)*kx + x0 = xc*(d/zc)*k + x0
            ys = -yc*(dy/zc)*ky + y0 = -yc*(d/zc)*k + y0

            綜合變換矩陣(相機(jī)空間到屏幕空間)Tcs為:
            ?
            Tcs = Tcp*Tps =

            |d*k??? 0?????? 0 0? |

            |0????? -d*k??? 0 0? |

            |x0???? y0????? 1 1? |

            |0????? 0???????? 0? 0|

            ?其中,d為視距,k為屏幕寬高比或視平面寬高比,x0,y0為屏幕中心,注:最后需轉(zhuǎn)換為3D坐標(biāo)。

            (驗(yàn)證:Tcs右乘點(diǎn)p(xc,yc,zc,1)得點(diǎn)p'(xc*d*k + x0*zc, -yc*d*k + y0*zc, zc, zc),轉(zhuǎn)換為3D坐標(biāo)為(xc*(d/zc)*k + x0, -yc*(d/zc)*k + y0, 1),正確。)

            4.一般情形:
            ?************************************
            視距為1,x軸視角為90度,屏幕寬高為W,H.
            ************************************
            ?
            代入d=1,theta_x = PI/2,x0= W/2,y0=H/2,則視平面寬高為width_p = 2。
            要確保屏幕上的圖像x,y比例不失真,即rs=rp,有
            height_p = 2/rp=2/rs=2H/W,
            k=kx=ky=width_s/width_p = W/2.

            于是,矩陣為:

            Tcs1 =?

            |W/2??? 0?????? 0 0? |

            |0????? -W/2??? 0 0? |

            |W/2??? H/2?? 1 1? |

            |0????? 0???????? 0 0? |



            ?? |W/2??? 0????????????????? 0 0? |

            |0????? -H/2*(W/H)??? 0 0? |

            |W/2??? H/2????????????? 1 1? |

            |0????? 0?????????????????? ?0 0? |

            (可以看到,y軸的縮放因子中乘上了寬高比(aspect ratio))
            ?這個(gè)矩陣較常用。

            ---------------------
            有什么問題,歡迎探討.
            ?

            posted on 2006-09-17 00:34 SoRoMan 閱讀(8417) 評(píng)論(4)  編輯 收藏 引用

            評(píng)論

            # re: 探討:3D透視投影變換詳解-兼談視平面和屏幕的寬高比問題 2007-03-29 12:10 heihei
            Can you give you commons ,why it is  回復(fù)  更多評(píng)論
              

            # re: 探討:3D透視投影變換詳解-兼談視平面和屏幕的寬高比問題[未登錄] 2007-03-29 12:13 a
            http://www.chinasoft.org.cn/Html/mm/05155655.html  回復(fù)  更多評(píng)論
              

            # re: 探討:3D透視投影變換詳解-兼談視平面和屏幕的寬高比問題 2008-05-14 11:29 啊夏
            hi SoRoman:
            在你的博客上拜讀了你的大作"探討:3D透視投影變換詳解-兼談視平面和屏幕的寬高比問題".受益良多.

            我按照你文章里面描述的.自己推導(dǎo)了一個(gè)公式.
            世界坐標(biāo)系的建立是這樣的. x左向右.y上向下,z朝向屏幕里面.
            在里面有一點(diǎn) p(x,y,z);
            設(shè)視點(diǎn)v (0,0,vz); 然后采用透視投影將p投在 xoy平面上.

            我的公式是這樣的.

            t = -z/vz;
            x' = t*x;
            y' = t*y;
            然后直接將 點(diǎn)(x',y') 繪制到 xoy屏幕上.

            現(xiàn)在我遇到的問題是,在對(duì)線采用這樣的方式進(jìn)行投影的時(shí)候會(huì)有飛線的情況發(fā)生.(我是在一個(gè)地圖引擎中使用). 在地圖級(jí)別比較小的情況下,繪制還算正確.但是如果地圖一放大線就亂了. 郁悶了好長(zhǎng)時(shí)間了,希望能得到你的回信. 我的MSN: ren543#hotmail.com   回復(fù)  更多評(píng)論
              

            # re: 探討:3D透視投影變換詳解-兼談視平面和屏幕的寬高比問題 2012-09-22 09:24 xwl
            tan(theta_x/2) = width_p/d
            tan(theta_y/2) = height_p/d

            這是地方有點(diǎn)問題吧,應(yīng)該是
            tan(theta_x/2) = width_p/2d
            tan(theta_y/2) = height_p/2d
              回復(fù)  更多評(píng)論
              


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久精品国产亚洲av麻豆蜜芽| 亚洲AV无码一区东京热久久| 亚州日韩精品专区久久久| 亚洲一区精品伊人久久伊人| 午夜精品久久久久久99热| 亚洲欧美精品伊人久久| 一本大道久久香蕉成人网| 国产精品久久久久影视不卡| 伊人久久大香线蕉AV一区二区 | 无码任你躁久久久久久久| 久久久久久无码Av成人影院| 内射无码专区久久亚洲| 精品久久久久久久久中文字幕| 亚洲AV伊人久久青青草原| 青青热久久综合网伊人| 亚洲女久久久噜噜噜熟女| 欧美午夜A∨大片久久| 99精品久久精品| 久久亚洲精品人成综合网| 亚洲国产精品成人久久蜜臀 | 国产亚洲色婷婷久久99精品91| 久久AV无码精品人妻糸列| 综合久久一区二区三区| 国内精品久久久久久久亚洲| 国产精品久久精品| 久久91亚洲人成电影网站| 色欲久久久天天天综合网精品 | 欧美丰满熟妇BBB久久久| 香蕉久久夜色精品国产2020| 久久一区二区免费播放| 大香网伊人久久综合网2020| 99久久精品免费观看国产| 久久亚洲国产午夜精品理论片 | 久久人人爽爽爽人久久久| 亚洲国产精品成人久久| 久久国产欧美日韩精品免费| 久久青青草原精品国产不卡| 伊人久久大香线蕉综合热线| 久久精品国产AV一区二区三区| 色综合久久夜色精品国产| 精品国产99久久久久久麻豆|