關(guān)于透視的一些筆記

為什么頭圖是python?因?yàn)楹竺婧芏嗍纠龍D是用turtle畫(huà)的(
該筆記記錄了關(guān)于透視的心智模型,一些繪制透視圖的準(zhǔn)則,并簡(jiǎn)述了倍增線條、二等分、四等分、任意等分和透視中畫(huà)圓的方法。
關(guān)于透視的心智模型
沒(méi)看過(guò)多少材料,也不懂?dāng)?shù)學(xué),這一節(jié)全程胡謅,注意甄別!例子均使用 blender 繪制。
透視是在二維的畫(huà)布上展示三維物體的技術(shù),可以通過(guò)計(jì)算機(jī)圖形學(xué)(以及攝影?不知道呢)中的抽象來(lái)理解透視,并建立對(duì)透視的心智模型。
這里有三個(gè)概念:相機(jī)(camera),視口(viewport),對(duì)象(object);相機(jī)不用解釋?zhuān)暱诳梢哉J(rèn)為是相機(jī)的可視范圍,也是我們的畫(huà)面本身,它在這里是一個(gè)和相機(jī)有一定距離的矩形,其中相機(jī)在視口的投影為視口的中心。視口可以不是平面,通過(guò)改變平面的形狀,我們可以得到其它類(lèi)型的透視比如魚(yú)眼透視,人眼是魚(yú)眼透視。改變視口和相機(jī)的距離和視口的寬高比,我們就能得到不同的焦距;對(duì)象即為我們想繪制的對(duì)象,如立方體,球,少女等。


我們要繪制特定對(duì)象,就是做對(duì)象到相機(jī)在視口上的投影,具體來(lái)說(shuō),就是對(duì)對(duì)象的每個(gè)部分,做它和相機(jī)的連線,找到連線在視口上的交點(diǎn)。方法類(lèi)似于下圖(中心),但是投影面 P 在點(diǎn)和對(duì)象之間。

就是這么簡(jiǎn)單,只需要投影這一道工序,近大遠(yuǎn)小,消失點(diǎn),一二三點(diǎn)透視,一切透視圖的性質(zhì)都自動(dòng)地得到了。
近大遠(yuǎn)小
同一個(gè)對(duì)象,如果它正好在視口上,則它的投影大?。ɡL制的大?。┖退旧硪恢?;它離視口越遠(yuǎn),它向相機(jī)在視口上的投影就會(huì)越小,這是符合直覺(jué)的。


畸變
但一個(gè)很有趣的點(diǎn)是,如果這個(gè)物體始終在平行于視口的平面上運(yùn)動(dòng),則(只要還在可視范圍內(nèi),)它的投影大小是不會(huì)縮短的,甚至有可能會(huì)變大!下圖是一個(gè)很明顯的例子,這些球體的球心均在同一個(gè)平面上且半徑相同,但形狀完全不同:


是誰(shuí)說(shuō)球在任何角度都是球的?
焦距:遠(yuǎn)處的變化小,近處的變化大
攝影中有所謂的長(zhǎng)焦鏡頭,他們說(shuō),長(zhǎng)焦鏡頭有“空間壓縮”效果,變形幅度小,近大遠(yuǎn)小的感覺(jué)不明顯。通過(guò)調(diào)整視口的大小,可以模擬長(zhǎng)焦鏡頭的效果。
固定視口的寬高比和相機(jī)到視口的距離,則視場(chǎng)角(FOV,水平方向可視角度,常用在游戲里)和焦距成反比,下面展示了各視場(chǎng)角下同一個(gè)場(chǎng)景:




可以認(rèn)為,不同視場(chǎng)角(焦距)下所看到的場(chǎng)景,就是去裁剪“原圖”中間的部分并放大到原圖的大小。
通過(guò)固定物體平行于視口方向的大小,并調(diào)整遠(yuǎn)離視口方向的大小,我們能夠模擬不同焦距下的畫(huà)面,這個(gè)可以應(yīng)用在繪畫(huà)中,它也證明,比較指向不同消失點(diǎn)的線段的長(zhǎng)度是不可能的,因?yàn)樗鼤?huì)隨著焦距的大小而改變。
下面是不同焦距看同一張椅子:


也能認(rèn)識(shí)到,當(dāng)鏡頭距離物體非常遠(yuǎn)的時(shí)候,物體看起來(lái)就會(huì)像正視圖一樣了。
一點(diǎn)透視
當(dāng)六面體的一個(gè)面平行于視口的時(shí)候,得到的就是一點(diǎn)透視,下面展示了低焦距和高焦距下的一些一點(diǎn)透視的正方體,其中高焦距將相機(jī)移遠(yuǎn)了。



平行于視口的線總是平行的
如果我們沿遠(yuǎn)離鏡頭的軸旋轉(zhuǎn)一個(gè)六面體,則該六面體背后的面的邊的方向如何確定?和面前的面的邊平行。因?yàn)檫@兩條邊和視口平行且相互平行,因此投影到視口上仍舊是平行的。

二點(diǎn)透視
如果六面體只有一條邊平行于視口,則我們得到二點(diǎn)透視。
下面的立方體均沿垂直方向旋轉(zhuǎn)了 45 度:

三點(diǎn)透視
如果六面體沒(méi)有任何面和邊平行于視口,則得到三點(diǎn)透視。三點(diǎn)透視通常出現(xiàn)在非平視的情況,下面的圖示在二點(diǎn)透視的基礎(chǔ)上將相機(jī)的角度向下調(diào)整了 20 度,并向上移動(dòng)了相機(jī)。

tips
使用下面的畫(huà)法的時(shí)候盡量減少測(cè)量次數(shù)以減少錯(cuò)誤的累計(jì),比如畫(huà)等分時(shí)盡量把問(wèn)題轉(zhuǎn)化為畫(huà) 2 的 n 次方等分
始終關(guān)心視平線高度
垂直消失點(diǎn)比水平消失點(diǎn)更重要(因?yàn)椴煌瑢?duì)象一般水平消失點(diǎn)不同,但垂直消失點(diǎn)相同)
把要畫(huà)的事物當(dāng)成六面體(盒子)去看待
始終使用近大遠(yuǎn)小的常識(shí)去檢查畫(huà)面是否正確,比如二分事物時(shí),靠近鏡頭的部分會(huì)比遠(yuǎn)離對(duì)象的部分更大,猜測(cè)等分線的位置時(shí)也可以使用此種手段
指向不同消失點(diǎn)的線段的長(zhǎng)度是無(wú)法比較的,會(huì)隨著相機(jī)的距離和 FOV(焦距)發(fā)生改變,因此選一個(gè)合適的比例并假定它們等長(zhǎng)即可
不要追求完全徒手繪畫(huà),該依賴(lài)工具就依賴(lài)工具,無(wú)論是透視尺還是 3d 輔助繪畫(huà),內(nèi)容和效率最重要
不要追求完全正確的透視,要為內(nèi)容服務(wù),如果畫(huà)面需要夸張和扭曲,那就夸張和扭曲
一些透視畫(huà)法
下面的透視畫(huà)法中均依賴(lài)這樣的假設(shè):在平面作圖中僅使用連線來(lái)進(jìn)行的作圖方法,在透視圖中仍然適用,無(wú)論一點(diǎn),二點(diǎn),還是三點(diǎn)透視。無(wú)論這個(gè)假設(shè)是否為真,至少下面的畫(huà)法的效果都還蠻符合直覺(jué)。
下面的畫(huà)法均使用一個(gè)二點(diǎn)透視圖做例子(這些畫(huà)法都是在面上操作的,一個(gè)面顯然最多是二點(diǎn)透視)。
要將這些畫(huà)法應(yīng)用到一點(diǎn)透視,把“做點(diǎn)到消失點(diǎn)的連線”修改為“過(guò)該點(diǎn)的邊的平行線”即可。
二等分
因?yàn)楸对鼍€段也需要用到二等分,這里先描述二等分畫(huà)法。二等分就是將一個(gè)指向某消失點(diǎn)的線段分為等長(zhǎng)的兩段。
要進(jìn)行二等分,只需對(duì)要操作的面的相對(duì)交點(diǎn)做連線,找兩條連線的交點(diǎn)和消失線做直線,該直線即為等分線,其和面的邊的交點(diǎn)即為等分點(diǎn)。
比如,要二等分 CD,則先連接 AC,BD,找到交點(diǎn) E,直線 EY 即為二等分線,EY 和 AB,CD 的交點(diǎn)為二等分點(diǎn);垂直方向的二等分點(diǎn)同理。

這個(gè)很容易證明,不表了。
倍增線段
倍增線段,該畫(huà)法將一條指向消失點(diǎn)的線段長(zhǎng)度增加一倍。它常用于“拷貝”等分點(diǎn)。
要做 DC 的倍增線段,需要找到 BC 的中點(diǎn) E(在垂直方向上應(yīng)用二等分),連接和延長(zhǎng) AE,AE 和 DC 的延長(zhǎng)線交點(diǎn)為 F,則 DC = CF。

要證明 DC=CF,只需要證明三角形 BEA 和三角形 CEF 全等即可,這是容易證的。
四等分
四等分是容易的——做二等分后,前后再各做一次二等分即可。任意 2 的 n 次方等分均可如此。
任意等分
偶數(shù)等分在網(wǎng)絡(luò)上都能查到很多資料,現(xiàn)在該來(lái)點(diǎn)魔法嘍——精確地畫(huà)出任意 n 等分,即使 n 是質(zhì)數(shù)或任意奇數(shù),這里直接給出規(guī)律——要找到 n 等分點(diǎn),若 n 為偶數(shù),則需要先找到 n/2 等分點(diǎn)(n 等分點(diǎn)可以在找到 n/2 等分點(diǎn)后再在前后進(jìn)行一次二等分得到),若 n 為奇數(shù),則需要先找到 n-1 等分點(diǎn)。這個(gè)方法是如此地機(jī)械化,以至于可以編程實(shí)現(xiàn),下面是幾種使用該方式的示例,分別使用 p5.js,geogebra,turtle 繪制。



證明
現(xiàn)在試著證明,如果已經(jīng)得到了 n 等分線,能僅通過(guò)連線(在平面情況下是做平行線,透視情況下是連接點(diǎn)和消失點(diǎn))和找交點(diǎn)找到 n+1 等分線。
考慮下面的平面矩形,我們已經(jīng)找到 n 等分線(EF),現(xiàn)在要找 n+1 等分點(diǎn)。連接 BD,AF,它們的交點(diǎn)在 n+1 等分線上,證明如下(不會(huì) latex,手寫(xiě)了):

三等分
要找到三等分點(diǎn),我們首先需要找到二等分線 EF,然后連接 AF,AF 和 BD 交點(diǎn)就在三等分線上。做完第一個(gè)三等分線后,可以使用倍增來(lái)找到第二個(gè),或者對(duì)后三分之二這個(gè)矩形找二等分。

五等分
要找到五等分點(diǎn),我們首先需要找到四等分線 EF(這是容易做的),然后連接 AF,AF 和 BD 交點(diǎn)就在五等分線上。做完第一個(gè)五等分線后,可以對(duì)后五分之四的矩形做四等分。

七等分
要找到七等分點(diǎn),首先需要找到六等分線,要找到六等分線,首先要找到三等分線……以此類(lèi)推。做完第一個(gè)七等分線后,對(duì)后七分之六點(diǎn)矩形做六等分即可,或者使用倍增法一步步推。
十一等分
剩余無(wú)論多少等分都是一樣的操作,比如對(duì)十一等分,我們需要先找到十等分點(diǎn),因此需要先找到五等分點(diǎn),因此需要先找到四等分點(diǎn)……找到第一個(gè)十一等分線后,對(duì)后十一分之十的矩形做十等分即可。
透視圓的畫(huà)法
不想寫(xiě)了,感覺(jué)這個(gè)沒(méi)啥實(shí)踐意義,留張圖。

參考資料
《Computer Graphics from Scratch》
https://coloso.global/en/products/illustrator_mogoon_us
代碼
下面的代碼包括繪制二三四五等分和倍增線段的python代碼,沒(méi)啥意義,只是水水字?jǐn)?shù)。