根據維基百科的解釋:「電腦圖學是研究電腦在硬體和軟體的幫助下建立電腦圖形的科學學科,是電腦科學的一個分支領域。」如果你喜歡程式設計,對於電腦圖學也有著興趣,馬上就會瞭解到,電腦圖學是資料結構、演算法與數學的綜合應用。

在這領域,程式設計不單只是拼裝元件的任務,曾經我也從當中找到過感動。

從2D繪圖開始

這一年來沉迷於運用程式設計來進行3D建模,一方面是發表的作品在著名3D分享網站Thingiverse,或者是國內3D列印社群中,都有著一定的受歡迎度,因而帶來了一定的回饋與成就感,二方面也許也是因為,當初在打算離開電機領域時,其實是打算朝著美術設計相關領域發展,結果後來就誤打誤撞進入了程式設計領域。

近來幾經思索,也許並不是偶然,因為退伍後第一份工作,公司的業務之一就是研發遊戲,當時主要是2D遊戲居多,因而經常有機會跟相關業務同仁進行交流,偶而也協助遊戲相關知識的文件化,因此也就接觸了不少2D繪圖的相關技術與技巧,我曾經分享出來的簡單影像處理軟體,就是那時在學習Java之時,同時結合一些2D繪圖知識,使用Java 2D實現出來的產物。

雖然只是2D繪圖,然而就算只是結合遞迴,也足以創造出許多美麗的圖案,若進一步結合貼圖、雙緩衝區繪圖、海龜繪圖、一些數學,或者一些物理知識(像是重力加速度),就可以設計出一些簡單、有趣的畫面,再經由遊戲部門的同事指點,自己倒也能寫些橫向、縱向捲軸,或甚至是2.5D概念的小遊戲了。一方面是因為我對美術有興趣,二方面是使用程式設計,也可以進行繪圖相關設計,所以,最初對程式設計的感動,應該就是來自於此,也一路促成了我後來不斷地往程式設計這方面前進。

曾經有位大師說過,每當他學習一門新的程式語言時,他總會試著寫個文字編輯器來作為練習。時至今日,學習一門程式語言時,我仍有著看看這門語言,能否進行繪圖相關設計的習慣,我的網站裡也還一直留著〈電腦圖學入門〉的文件,記錄著當初的學習心得,後來為了學習HTML5 Canvas的使用,重新使用JavaScript語言來實現了當中的所有範例,所以,無論是對HTML5或者是JavaScript的運用,都是一份很好的練習。

試著挑戰3D繪圖

同樣是電腦繪圖,3D繪圖與2D繪圖的難度就有很大的差別,除了大家基本上都知道的直角座標之外,還有各種不同繪圖場合上會使用的座標系統,必須去瞭解與知道何時運用,像是極座標、柱狀體座標、齊次座標等。

因為,想要繪製一個3D物件,基本上必須知道物件的頂點位置,以及平面索引,這跟採用的座標系統有關。而為了能計算出頂點位置,必須運用到數學。至於如何經濟地儲存頂點位置與平面索引,則需要運用不同的資料結構,接著如何有效率地走訪各頂點,就是演算法的問題。

有趣的地方在於,就算是在平面的螢幕上,也能使用投影透視法來創造出物件的遠近感。對於學習素描的人來說,透視法應該是基本常識,而在電腦繪圖上,則可以透過一個公式推導,將既有的頂點作個換算來達到效果。如果有多個物件,或者是平面之間有前後關係,則要考量深度處理,平面法線判定法是其中之一,為了進行這類的處理,除了基本的三角函式之外,還得運用向量運算等數學。

在學習這類相關知識的過程中,《Java於演算法與資料結構之實習應用》以及《JAVA 2D/3D繪圖程式設計實例應用》這兩本書,對剛入門3D繪圖的我幫助很大,上面提到的繪圖相關名詞,在書中都有解釋,雖然使用Java實現,實際上與語言並沒有直接關係,而是電腦繪圖的領域知識。

在不斷學習電腦圖學的過程中,一個明顯的事實就是:「寫程式到底要不要用到數學、演算法、資料結構?」但其實這類問題並不存在,這些是結合在一起運用的,如果有程式庫或3D引擎輔助,雖然可以省去不少的功夫,要能善加利用,還是需要相關的知識背景,如果對這類爭辯還在苦惱著選哪邊站,不妨就試著接觸電腦圖學相關的程式設計吧!

因3D列印而重溫

可惜的是,對3D繪圖的相關學習,在我離開公司之後就中斷了,然而也因為使用程式學習電腦圖學的這個過程,奠定了一定的程式設計基礎,也累積了程式設計方面的自信心與興趣,而且,就如此走了這麼多年之後,沒想到會因為自造者文化的興起,接觸3D列印而重溫了電腦圖學。

在3D列印這塊領域,其實與程式設計能相關聯的部份,並不止於電腦圖學。就目前我知道的,還有韌體的控制,開放原始碼方面玩家最熟悉的是Marlin,幾乎許多開放架構的3D列印機都使用它,有興趣的可以看看〈3D Printer韌體原始碼解析心得(以Marlin為對象)〉這份簡報。

另一個有趣的部分,是透過Raspberry Pi這類單板電腦來與3D列印機互動,在日前的PyCon Australia 2016中,就出現一個有趣的講題〈3D Printer Control with Python〉,當中是在Raspberry Pi上,使用Python程式庫OpenGB,建立一個簡單的HTTP伺服器,並與3D列印機連結進行溝通,這麼一來,就可以在任何地方使用瀏覽器,透過網路來監控3D列印機。

至於我接觸的方向,是結合程式設計進行3D建模。在一開始運用遞迴創造出隨機迷宮之後,隨著創造的模型越複雜,越來越需要循著過去的軌跡,重拾相關的繪圖知識,於是,我找出了當初入門3D繪圖而後來被塵封十幾年的那兩本書,而近來在運用OpenSCAD的polygon與polyhedron模組時,突然想起了,這不就是以前學習過的頂點索引法嗎?在回顧〈電腦圖學入門〉的文件時,腦袋中又有了許多的想法,或者說是感動。

感動歸感動,實際上知道頂點索引法是一回事,如何找出頂點之間的規則關係,運用來自動建立索引陣列又是另一回事。例如,在《3D Printed Science Projects》這本書第一章的範例,就讓我卡了一陣子,給定任一z = f(x,y)函式,在求得各頂點座標之後,要怎麼自動建立索引陣列,從而利用polyhedron模組來繪製呢?範例當中有原始碼,然而,這並不是單看原始碼就可以瞭解的事,只好拿起筆來試著推導看看了。

找回最初感動之餘

最近在我的社交網站朋友圈中,偶而都會看到「莫忘初衷」這四個字,好像是最近很多人穿著印製著這類文字的T恤,有些人是自我期許,有些人是略帶嘲諷地加了個註解「你有過嗎?」而我想的其實是,如果真的找回了初衷,那麼,下一步該怎麼做呢?

這是我這一陣子經常在苦惱的事,重溫電腦圖學文件或者那些塵封之書,終究只是一時之計,最終只是找回過去曾經擁有的東西罷了,這一年來透過3D列印與建模找回最初感動之餘,若不能找到進一步的成長與突破,那不過就像是只剩一張嘴、只會話當年勇的中年大叔罷了。

在電腦圖學的探索與回顧中,獲得的樂趣真的很多,隨之而來的苦惱,則引導我,追求更進一步的程式建模、韌體探索,或像是瞭解〈3D Printer Control with Python〉這類的方向,偶有進展,先前的苦惱就會換來更多的樂趣,然後這些樂趣就會引導下一次的思考,讓最初的感動與樂趣不斷地延續與拓展。

作者簡介


Advertisement

更多 iThome相關內容