3D建模與程式設計

課程總覽


學校日簡報

學校日簡報六年級下學期

單元一:海龜畫圖

LOGO 海龜畫圖

Logo是一種電腦程式設計語言,在1966年由西摩爾·派普特和Wally Feurzeig設計,Logo一詞源自希臘語邏各斯(logos)。Logo是一種直譯語言,和其他語言不同的是,它內建一套海龜繪圖(Turtle Graphics)系統,通過向海龜傳送命令,使用者可以直觀地學習程式的執行過程,因此很適於初學者特別是兒童學習程式設計。

海龜繪圖使得Logo使用者可以通過簡單的編程創作出豐富多彩的視覺效果或圖案。假想一隻帶著畫筆的海龜可以接受簡單的命令,例如向前走100步,或者左轉30度。通過對這隻海龜傳送命令,可以讓它繪製出較為複雜的圖形,例如正方形,三角形,圓等。

海龜的移動相對於它本身所在的位置。例如,命令"左90"意味著讓海龜左轉90度,學生可以站在海龜的角度來思考它將如何執行命令,這使得程式設計更加形象化,也更易於理解。

LOGO 海龜畫圖線上版

code.org 冰雪奇緣闖關活動

網址:https://studio.code.org/s/frozen

底下三個難關,請依據老師課堂上的提示,嘗試過關:

第六關:巢狀迴圈的應用

第十關:平行四邊形四個外角的計算方法

第十四關:自定義函式(Function)的應用

從畫點到畫線

要在舞臺上畫出線條,必須用到 Scratch 的畫筆積木

使用畫筆積木,應該先做「初始化」,也就是把舞台上所有筆跡清除,並讓畫筆角色回到舞台中央面朝上

練習使用函式積木定義自己的指令積木

使用新定義的積木清除畫布(舞臺)

幾何學裡面最基本的單位是點,畫點可以使用「下筆」積木

連續畫點就會形成線,右圖的「畫線」積木用來畫長度 100 的線

改成自行輸入線的長度,積木會更好用,函式積木可以定義輸入方塊以接受外部輸入的資料,在程式設計裡這些方塊被稱為:引數(或稱為「參數」)

引數與變數功能相同,但作用範圍不同,引數僅在該函式積木內有作用。

輸入方塊有兩種:數字或文字、布林值,我們要使用的是前者,並將該輸入方塊命名為 x,你可以把 x 當成該函式積木的內建變數來使用(用拖曳方式引用)

正多邊形的畫法

我們知道繞一圈回原位就是轉 360 度,三角形可以想成是圓形的變形(把一個圓形的橡皮筋套在三根鐵釘上面),因此畫完每一邊要轉 360÷3=120 度,總共要畫三次。

其餘多邊形也可以想成是圓形的變形,畫 N 邊形每次要轉 360÷N 度

把長度和邊數改成輸入方塊並命名為 y 和 z,設計出多邊形函式積木。

利用剛剛設計好的多邊形積木,我們可以畫出複雜圖形

右邊範例是畫 10 個 5 邊形繞一圈的結果,請小朋友自行修改邊長和邊數化出不同的複雜圖形,也可以修改重複次數,但右轉角度也必須同步修改。

圓的畫法

多邊形積木也可以用來畫圓形,方法是把長度改為 1 或 2,邊數改成 360 邊。

我們習慣用直徑來測量圓形的大小,利用多邊形積木畫圓,必須改用邊長,比較難掌握畫出來的大小。

請嘗試設計一個新的積木來畫圓,輸入的資料是直徑。

把直徑乘以圓周率(3.14)算出周長,然後把周長除以 360 就得到 360 邊形的邊長。這樣我們就可以畫出正確大小的圓。

弧的應用

畫圓畫一半就會得到弧線,我們根據畫圓的積木,設計一個新的畫弧積木。

利用畫弧積木,可以進一步設計出更多複雜圖案。

組合兩個弧變成花瓣,然後利用花瓣積木,畫出不同花瓣數量的花。

作業:請利用隨機數在舞台的任意位置,繪製 3 ~ 12 個花瓣,大小 20 ~ 60 的花朵,記得修改畫筆顏色,以呈現出五彩繽紛的花園氣氛。 

範例程式:https://e.meps.tp.edu.tw/scratch/turtle_draw.html

補充資料:五芒星畫法

要畫五芒星,那就先研究三芒星畫法,所謂三芒星其實就是正三角形。小朋友已經知道三角形內角和是 180 度,也就是說「三芒星的三個芒角加起來是 180 度」,事實上「五芒星的五個芒角加起來也是 180 度」。

要畫五芒星的話,就是要把 180 度分給 5 個芒角,180÷5=36,每個芒角 36 度。用海龜來畫圖,每次轉彎的角度是外角,外角的算法是 180-內角,以五芒星為例,就是 180-36=144 度。

下面最右邊的積木可以用來畫任意奇數的芒星,但偶數芒星的算法太複雜,這裡略過不討論。

補充資料:螺旋與遞迴

利用課堂上所設計的「畫弧」函式積木,可以進一步畫出螺旋線,方法是一邊畫弧線,然後一邊把直徑縮小,例如:每畫一條 90 度的弧線就把直徑縮小 5 點,一直縮小到直徑為 0 時停止。

這是一個需要反覆執行相同動作的程式,可以利用「重複執行直到」積木來製作,如下圖左邊的函式積木。這個函式積木裡面需要對「引數(參數)」進行運算操作,但可惜 Scratch 的「引數(參數)」不提供運算功能,所以只能改用變數來設計。

換個方式來思考,把螺旋線最外面一條 90 度弧線擦掉,剩下的圖形也是螺旋線,以此類推,我們可以發現螺旋線就是由更小的螺旋線組成的。只要反覆執行「螺旋線積木」就可以把整個螺旋線畫好。這種函式積木「引用自身」的做法稱為「遞迴」演算法。

下面右側示範的是最簡單的遞迴程式,僅只引用自身一次,而這一次不需要用到變數。下列兩個程式的執行結果完全相同,仔細觀察比較很快就會發現「遞迴其實就是重複執行的另一種寫法」。

單元三:立體建模

三維座標系

在幾何學概念中,「點」是不佔有空間的,僅用來表示「位置」,所以是 0D。「線」是點運動的軌跡,除了位置之外還佔有長度空間,稱為 1D。將線連續排列在一起形成「面」,除了在立體空間的位置外,還佔有長、寬兩種空間,也就是 2D,而「體」則是將面疊在一起而有了高度,因此稱為 3D。

三維座標系即三維空間座標系統,使用三個參數來標示三維空間中的每一個點,右圖是常用的直角座標系,分別用 X、Y、Z 代表三維,而 x、y、z 則是點(x,y,z)與原點 O 在三維上面的距離。

利用電腦來表示 3D 物體的方法就是建立 3D 模型,要將 3D 模型顯示在 2D 螢幕上,需要運用「投射」數學對 3D 模型進行演算,稱為「算圖」(render)。

投射數學源於文藝復興時期的畫家「達文西」所發明的「透視法」,是一種把立體三維空間的形象表現在二維平面上的繪畫方法。達文西是一個博學者:在繪畫音樂建築數學幾何學解剖學生理學動物學植物學天文學氣象學地質學地理學物理學光學力學發明土木工程等領域都有顯著的成就。

取自維基百科

三視圖

除了「透視法」以外還有另外一種將立體投影成平面的方法,稱為「三視圖」。當我們觀察一個物體時,隨著觀測者位置的不同會有上面、下面、左面、右面、面、後面共六個角度,將看到的物體輪廓測量繪製出來的圖形稱為「視圖」,由於上、下視圖方向相反但圖形相同,左、右視圖和前、後視圖也是如此,因此可以把六個視圖歸納成兩個兩個一組,上視圖和下視圖合稱「俯視圖」,左視圖和右視圖合稱「側視圖」,前視圖和後視圖合稱「正視圖」,這三種視圖合稱「三視圖」。

下圖取自國家教育研究院「三視圖-從哪裡看?」教師手冊,請仔細觀察圖表,是否有發覺「透視圖」與「三視圖」之間的關係呢?

視錯覺,是指透過幾何排列、視覺成像規律等手段,製作有「視覺欺騙」成分的圖像進行眼球欺騙,引起的視覺上的錯覺,達到藝術或者類似魔術般的效果。當我們觀察立體圖形時,兩隻眼睛的可視範圍合起來大約是 124 度左右,無法同時看到圖形的左右兩側,而人類的大腦會根據有限的視覺訊息去想像和推測不足的部分,因此很容易造成視錯覺,例如:凹面看成凸面、斷裂的圖形看成是連接的......等等。

Blender

是專業的自由及開放原始碼3D電腦圖形軟體擁有極豐富的高階模組塑造功能,可用於捏塑、建立 3D 模型、材質貼圖、製作 3D 動畫......等等。

在家分作業系統安裝 Blender 軟體示範

在Windows上安裝Blender

在Mac (蘋果電腦) 上安裝 Blender

使用平板怎麼建立模型?

使用平板可以到應用程式商店搜尋「tinkercad」,雖然 tinkercad 功能比較陽春,但要拿來製作雪人模型還是很好用的。有關 tinkercad 的操作示範,請看「四年級下學期浮雕建模單元。

跟著一起做:3D建模示範操作教學影片~~堆雪人

單元四:文字型程式遊戲

什麼是程式語言?

所謂「程式語言」是指用來向電腦發出指令,讓電腦能因應不同狀況採取適當行動的「人工語言」,與自然演化而來的「自然語言」不同例如:國語、英語......等)兩者之間的差異除了產生方式不同、使用目的不同之外,主要的差異是:人工語言有嚴格的語法定義,不符合規範的語法將無法解析意義,具有「單義性」;自然語言則會根據個別使用者允許有語法、意義上的差異,這種特性稱為「多義性」。

最早的程式語言是在電腦發明之前產生的,當時是用來控制提花織布機自動演奏鋼琴的動作而在電腦發明之後,專為電腦設計的「電腦程式語言」大量出現,至今已將近有 1000 種,並且每年仍有新的電腦程式語言誕生。隨著電腦科學的發展,無論是提花織布機或自動演奏鋼琴都已經改由電腦直接控制,也因此「程式語言」通常就是指「電腦程式語言」。

自然語言是先用語音來表達語意(程式語言中稱為語義)然後才發明文字,有了文字以後才發展出文法(程式語言中稱為語法)。而程式語言則一開始就先發展語法,透過語法來定義語義。「語法」是說明程式設計語言中,哪些符號或文字的組合方式是正確的,「語義」則是對於程序的解釋。

過去學過的 Scratch 算不算是一種程式語言呢?如果從 Scratch 積木僅有「語義」沒有定義「語法」的特性來判斷,Scratch 並非傳統所說的「程式語言」,之所以沒有語法是為了避免輸入程式時會有「語法錯誤」導致程式無法正常運作,對於不熟悉程式語言的小朋友來說,要檢查出語法錯在哪裡,會是一件痛苦而且耗時的工作,也可能因此導致小朋友喪失學習興趣。

然而 Scratch 積木所堆積出來的程式是可以確實執行的,在「語義」方面是完整可行的,與傳統所說的「程式語言」並沒有不同。因此有些程式語言專家認為 Scratch 是一種「視覺化」程式語言,因為 Scratch 是透過視覺操作介面用滑鼠拖拉來寫程式,而不是用文書處理軟體(例如:記事本)來寫程式。「視覺化」程式語言只是讓小朋友在接觸真正的「程式語言」之前,培養邏輯與運算思維的工具,其最終目標是要讓小朋友熟悉「文字型」程式語言。

CodeCombat

Python 是一種擁有簡潔語法,容易理解的語言,因此非常適合作為「文字型」程式語言入門學習使用。除此之外,Java Script 也是一種適合作為入門學習的程式語言。透過遊戲方式來學習 Python(或 Java Script)是一件輕鬆又有趣的方法,特別是底下推薦的「CodeCombat」遊戲網站。

請點選右圖右上角的圖示,進入 CodeCombat 網站,然後點選「我是學生」,輸入班級代碼(由老師提供)

進入登入畫面後,請點選右下角的「Sign in with Google」按鈕,使用學校提供的學生信箱帳號密碼登入。

打開 gmail 信箱收取 CodeCombat 網站寄給你的「確認信」,並啟用帳號。

看老師示範前面 2 關並講解遊戲玩法,然後自己嘗試闖關,祝你好運囉!

附錄:浮雕建模

浮雕雕刻的一種,藝術家在一塊平板上將他要塑造的形象雕刻出來,使它脫離原來材料的平面。在 3D 建模裡面,浮雕建模被稱為 2.5D 建模,意思是介於平面和立體之間。

浮雕一般可以分為陽刻和陰刻,與之相對的 2.5D 建模也可分為凸雕凹雕種技法。如果想要的圖案浮在表面材料上面,就是凸雕。如果是沈入於表面材料之中,則稱為凹雕

生活中屬於 2.5D 的物品有:招牌、名、匾額、印章、杯墊、隔熱墊、行李吊牌......等等。這些物品都可以使用 3D 建模軟體繪製,然後透過 3D 印表機製作出來。

3D 建模軟體的分類:

優秀學生作品

多邊形建模

連接網址:https://www.tinkercad.com/,按右上角的「登入」按鈕

登入頁面出現後,點擊「學生,加入您的課程」,然後輸入課程代碼(由老師提供)

點擊課程歡迎畫面下方的「Google」圖示,使用學校提供的學生郵件信箱帳號加入課程。

Tinkercad 教學示範影片

附錄:敲磚塊

電腦遊戲是遊戲的一種,而遊戲的主要成份有目的、規則、挑戰及互動,這些成分可以統稱為「遊戲性」。遊戲性就是一個遊戲之所以吸引人的原因,遊戲性可以帶來「脫離現實」的解放感,也導致有些人會沈溺於遊戲當中。

目的:在遊戲當中,我們都有明確性的目標。而在平時的工作和生活當中,我們未必有明確的目標,這也是很多人感到生活迷茫的原因。很多人是因為在生活當中沒有目標,所以就到遊戲這個虛擬世界裡去尋找目標。

規則:在遊戲當中,規則是相對固定的,而且你玩得越久,對規則就把握得越好遊戲規則是公平的,只要努力總能獲得相應的回報。而在現實社會當中,卻未必都有公平的規則。

互動:只要玩遊戲就會有相應的收穫,例如:稱號、級別、得分、進度條金幣裝備。人與遊戲的互動,都是可以預期結果的。而現實世界卻不是可以預測的

挑戰:所有遊戲都是自願參與的,當面對困難的挑戰時自己可以隨時退出,就算失敗了還可以重新挑戰,有充分的自主權。而現實生活卻不是這樣,總是有許多迫於無奈的事情,而且常常失敗了就沒機會重來。

以遊戲設計的角度來看,電腦遊戲可以簡單分成三個最基礎部分:遊戲內容contents)、核心玩法core gameplay和遊戲系統game system

遊戲內容是指遊戲的故事背景、環境設定、角色設計、配樂、音效、視覺藝術...等等內容,也就是遊戲所具備的文學與藝術成分。

核心玩法是指人與遊戲互動的方式,不同的玩法也會產生不同的遊戲類型,例如:探索、戰鬥、生產、建設、冒險任務、行商、歷史模擬......等等。

遊戲系統是指為了支持核心玩法所設計出來的遊戲機制,例如:探索時的地圖迷霧系統(沒去過的地方在地圖上只看到霧)、戰鬥時的勝負系統、生產時的環境適性加值系統、建設時的資材消耗系統......等等。

在這個單元我們要設計的是動作遊戲「敲磚塊」,遊戲規則如下:

目的:消除所有的磚塊

規則:控制反射板將鋼珠彈到空中撞擊磚塊,磚塊就會消失,清除所有磚塊就過關,如果沒接到鋼珠,遊戲就結束

互動:鋼珠擊中反射板的位置不同,反彈角度就不同,也可以想成反射板中間彈性最好,兩邊彈性較差,玩家透過練習可以控制鋼珠反彈到自己想要的角度,發展出遊戲技巧。

挑戰:遊戲中鋼珠速度會突然變快或突然變慢,考驗玩家的反應能力。不同關卡也有不同難度設計,例如:磚塊較多,排列較不規則。磚塊本身堅固程度也有不同,有的磚塊要敲兩次才會消失,有的磚塊敲不破。

從遊戲設計觀點來看,「敲磚塊」遊戲的三個基礎部分:

遊戲內容:必須要想一個故事來說明遊戲的背景,同時故事也決定了遊戲場景、提示訊息的樣式。

核心玩法:這是動作遊戲,玩家須擁有三項能力:預測鋼珠的位置、滑鼠控制能力、即時反應能力。

遊戲系統:已經在遊戲規則中討論過了,包含:速度突然變化、特殊磚塊設計、關卡難度增加...等要素。

佈置場景與角色

繪製舞台背景

新增玩家角色

新增球角色

操控與反彈

控制玩家角色

發射鋼珠

碰到玩家時要反彈

碰到玩家就反彈

變更音效

為了讓不同關卡可以設定不同的鋼珠速度,我們需要新增一個「全域變數」(適用於所有角色)「速度」。為了方便測試,可以使用一個獨立積木先將此變數設為 5,點擊執行後,再將該積木移除。

勝負判斷

佈置關卡

Scratch 舞台大小為 480 * 360,下半個螢幕用來發射鋼珠和控制反射板,磚塊放置於螢幕上半部,也就是說有 480 * 180 的空間可以佈置關卡。由於磚塊的大小是 48 * 24,可以佈置一列 10 個磚塊共七列,合計 70 個磚塊,如下圖:

新增磚塊角色

放置磚塊

放置多個磚塊

設計關卡

檢查是否過關

有了全域變數「磚塊數量」後,我們就可用它來判斷玩家是否已經過關,當所有磚塊都被打掉,也就是「磚塊數量」等於 0 時就過關了。請把前面所有程式中的「重複無限次」積木,改成「重複直到磚塊數量 = 0」。使用重複無限次時,程式會永遠反覆執行無法結束,這樣也就沒辦法結束第一關進入第二關,所以修改成「過關時結束」對於設計多關卡的遊戲至關重要。

另外,要更好控制遊戲流程,必須把遊戲從「循序執行」改成「事件驅動」,這樣就可以透過「廣播訊息」決定什麼時候要執行哪一支程式。

底下分別是修改過的「玩家」角色程式和「鋼珠」角色程式。

磚塊的分身程式

被鋼珠擊中的音效

多方向的反彈判斷

建立碰撞偵測遮罩

碰撞偵測

關卡控制

為了讓遊戲能夠控制關卡出現的順序,設想遊戲進行的流程如下:

製作第二關和第三關

新增造型

修改磚塊程式

佈置第二關和第三關

修改磚塊主程式

補充教材

提示與過關訊息製作

字幕配樂

字幕動畫

開場字幕

試玩與難度調整

試玩之後,如果覺得遊戲太難過關或是太容易過關,可以怎麼調整呢?

萬一鋼珠呈現水平一直線,只能左右來回移動時,怎麼辦?

可以在鋼珠角色中加入角度變化程式,當玩家按下空白鍵時,讓鋼珠稍微向左或向右傾斜。