在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用Arduino和加速度傳感器制作數(shù)字滾球迷宮【后篇】

王偉 ? 2023-02-20 11:54 ? 次閱讀

前篇:用Arduino和加速度傳感器制作數(shù)字滾球迷宮

這次將為大家介紹一個(gè)使用Arduino制作的獨(dú)特電子作品項(xiàng)目,將會(huì)分【前篇】和【后篇】?jī)刹糠诌M(jìn)行介紹。為我們介紹這個(gè)非常有趣的電子制作項(xiàng)目的是平原真先生,他是一位以事物之間的關(guān)系為主題進(jìn)行探索的藝術(shù)家。平原先生同時(shí)也是大阪藝術(shù)大學(xué)的副教授,迄今為止,他使用計(jì)算機(jī)和電子器件制作了很多媒體藝術(shù)作品。在Device Plus上,平原先生也發(fā)表了一些極具意義的電子作品,例如“用Arduino制作的太陽(yáng)能電池板供電數(shù)字生態(tài)箱”和“用Arduino和TOF距離傳感器制作甜甜圈播放器”。在后篇中,我們將會(huì)見證數(shù)字滾球迷宮是如何完成的。

前言

大家好!我是平原。本文是“用Arduino和加速度傳感器制作數(shù)字滾球迷宮”的后篇。在前篇中,我們組裝了電子電路,寫入了Arduino程序,并確認(rèn)了電子部件的工作情況。接下來,在本文中我們將完成實(shí)物迷宮的制作,并使用游戲引擎Unity實(shí)際制作游戲。請(qǐng)大家也一起參與挑戰(zhàn)!

本項(xiàng)目的組成

本項(xiàng)目共分為六個(gè)部分。
在前篇中,我們完成了作品規(guī)劃、電子電路和Arduino程序。
在后篇中,我們將按照以下1到3的步驟進(jìn)行制作。

制作迷宮外殼

創(chuàng)建迷宮的3D模型

Unity程序

1. 制作迷宮外殼

迷宮的設(shè)計(jì)是決定游戲可玩性的重要因素。我們需要一邊想象小球如何滾動(dòng)一邊制作迷宮。

我們按照以下步驟制作迷宮外殼:

設(shè)計(jì)盒子

設(shè)計(jì)迷宮

切割材料

組裝盒子和迷宮

固定電子部件

粘貼標(biāo)記

poYBAGPyzkWALEn_AAJaIA-a0Fk729.jpg

步驟1:設(shè)計(jì)盒子

盒子由5塊椴木單板粘合而成。盒子的尺寸為寬145mm、寬145mm、高70mm,以便里面有足夠的空間放置部件。板的厚度為4mm。為了使角部貼合在一起,設(shè)計(jì)時(shí)要考慮到厚度。在背面的板上打一個(gè)可以讓USB數(shù)據(jù)線穿過的孔。請(qǐng)使用Illustrator設(shè)計(jì)要裁剪的形狀。請(qǐng)參閱分發(fā)文件CutBox.ai

>> 分發(fā)文件下載(50.4MB)

pYYBAGPyzkaAIJP8AABvqRcR3mc644.jpg

步驟2:設(shè)計(jì)迷宮

在這個(gè)迷宮中,將正方形的盤面分成10個(gè)方格×10個(gè)方格,并設(shè)置圍墻。起點(diǎn)在左下角,終點(diǎn)在右上角。我創(chuàng)建了3種不同難度級(jí)別的迷宮。這里創(chuàng)建的迷宮數(shù)據(jù)不僅會(huì)用作激光加工機(jī)的切割數(shù)據(jù),還會(huì)用于創(chuàng)建要在Unity中使用的3D模型。

在Illustrator中,將正方形分隔成10個(gè)方格 x 10個(gè)方格并繪制之間圍墻。使用網(wǎng)格功能會(huì)很方便。需要一邊想象小球的滾動(dòng)一邊思考迷宮的設(shè)計(jì)。

如果從頭開始創(chuàng)建比較麻煩,可以參考下面的迷宮自動(dòng)生成工具。

>>自動(dòng)創(chuàng)建迷宮

完成后,調(diào)整線條的粗細(xì),勾勒出整體輪廓,然后調(diào)整其大小以適應(yīng)145mm x 145mm的盒子。

poYBAGPyzkmAbcBAAAFekAw2viU450.jpg

迷宮的地板與盒子底部的形狀相同。將墻壁與地板粘在一起形成迷宮。然后雕刻起點(diǎn)(S)和終點(diǎn)(G)。

創(chuàng)建具有3個(gè)難度級(jí)別的迷宮。1級(jí)沒有特別的關(guān)卡(左)。2級(jí)的起點(diǎn)和終點(diǎn)之間沒有連接,無法直接到達(dá)終點(diǎn),小球在途中掉入一個(gè)洞中,就會(huì)穿越到另一個(gè)洞(中間)。3級(jí)的中心被挖空成圓形,這部分會(huì)像旋轉(zhuǎn)門一樣移動(dòng)(右)。請(qǐng)參閱分發(fā)文件中的CutMaze.ai。

pYYBAGPyzkuAQPuyAAClo7_IyD8963.jpg

步驟3:切割材料

請(qǐng)使用創(chuàng)建的數(shù)據(jù)用激光加工機(jī)對(duì)椴木單板進(jìn)行切割。椴木單板的厚度為4mm,請(qǐng)根據(jù)要使用的設(shè)備進(jìn)行切割所需的設(shè)置。

poYBAGPyzk6AcogaAAFq-62Cn0k323.jpg

切割后的迷宮。迷宮的墻壁很薄,應(yīng)該小心處理,以免它們斷裂。

pYYBAGPyzlGAZ6exAAJXAYYd6Oo373.jpg

pYYBAGPyzlSABn2DAAE25OhrU5A868.jpg

步驟4:組裝盒子和迷宮

用木材專用膠粘貼盒子。這種膠即使用量很少也可以粘得很牢固,不要用量太大哦。

poYBAGPyzliAQKrSAAFivoa4jSs791.jpg

以同樣的方式將迷宮的地板和墻壁粘在一起。請(qǐng)用牙簽等在迷宮的墻壁背面粘上少量的膠,然后根據(jù)地板和墻壁的位置進(jìn)行粘貼。注意不要混淆表面和背面,以及起點(diǎn)和終點(diǎn)的位置。

poYBAGPyzluAImOKAAKkGc-MXyk352.jpg

步驟5:固定電子部件

使用3D打印機(jī)制作一個(gè)面包板底座,將底部抬高28mm,使反射式光電傳感器處于接觸蓋子背面的高度。請(qǐng)使用分發(fā)文件BreadboadHolder.stl。如果您正好有一個(gè)高度合適的盒子,也可以用它來代替。

pYYBAGPyzl6AOcr1AAD33FdOHqM854.jpg

將面包板嵌入支架中,并用雙面膠將支架和Arduino UNO固定在盒子上。

pYYBAGPyzmKAetEXAALSJzXZxs0078.jpg

步驟6:粘貼標(biāo)記

制作標(biāo)記用于反射式光電傳感器的讀取。請(qǐng)?jiān)诓桓赡z紙上打印兩個(gè)30mm x 30mm正方形并列的矩形。由于反射式光電傳感器對(duì)噴墨打印機(jī)的墨水沒有反應(yīng),所以請(qǐng)用黑色的筆涂抹為黑白、白黑、黑黑。

poYBAGPyzmWAQGaSAAEs12ZIGFI404.jpg

將標(biāo)記粘貼在蓋子背面的反射式光電傳感器的位置。下面的照片中,從左到右的難度等級(jí)依次為1級(jí)、2級(jí)和3級(jí)。1級(jí)難度的迷宮,反射式光電傳感器1為黑色,反射式光電傳感器2為白色。難度的差異是通過白色和黑色的組合來判斷的。

poYBAGPyzmmAUgS7AAIL7MxaySk089.jpg

2. 創(chuàng)建迷宮的3D模型

我們按照以下步驟創(chuàng)建迷宮的3D模型:

從Illustrator導(dǎo)出SVG文件

將SVG文件導(dǎo)入Fusion360

利用推擠功能創(chuàng)建立體模型

輸出OBJ文件

步驟1:從Illustrator導(dǎo)出SVG文件

將Illustrator中的迷宮數(shù)據(jù)導(dǎo)出為SVG文件。移動(dòng)在“1.制作迷宮外殼”的步驟2中創(chuàng)建的迷宮輪廓數(shù)據(jù),使中心為0,0。從Illustrator菜單中選擇[文件] > [另存為],然后選擇SVG作為文件類型。請(qǐng)創(chuàng)建從1級(jí)到3級(jí)共3個(gè)文件。

pYYBAGPyzmyAXlu9AAEAvls3FuY137.jpg

步驟2:將SVG文件導(dǎo)入Fusion360

將步驟1中導(dǎo)出的SVG文件導(dǎo)入到3D CAD軟件Fusion 360中。Fusion360的安裝方法請(qǐng)參考其官網(wǎng):

>> Fusion360

請(qǐng)從Fusio 360的菜單中,選擇 [插入] > [插入SVG], 將步驟1中導(dǎo)出的SVG文件導(dǎo)入Fusio 360。導(dǎo)入的形狀是草圖。

poYBAGPyzm-AFiGYAAG_t11xsZU025.jpg

步驟3:通過推擠功能創(chuàng)建立體模型

推擠迷宮的形狀,使其成為立體模型。請(qǐng)將整個(gè)草圖向下推擠5mm以使其成為地板。接下來,請(qǐng)僅將墻壁部分向上推出5mm。

pYYBAGPyznOAXaEVAAHFpTKEpU0379.jpg

在2級(jí)難度迷宮的地板上打兩個(gè)用來穿越的孔,孔徑約為Φ8mm。
3級(jí)難度的迷宮,在中央挖空Φ48mm的圓圈,制作兩層地板。

步驟4:輸出OBJ文件

需要從Fusion 360導(dǎo)出OBJ文件。請(qǐng)從Fusion 360的菜單中選擇[文件] > [導(dǎo)出] ,然后將文件導(dǎo)出為OBJ文件。由于該過程需要在云端完成,因此需要一些時(shí)間。完成后,該文件將會(huì)進(jìn)入下載文件夾中。分發(fā)文件MazeLv1.obj、MazeLv2.obj、MazeLv3-A.obj、MazeLv3-B.obj是完成后的數(shù)據(jù)。

poYBAGPyznWAK_JXAAEdi5ocpZ8528.jpg

3. Unity程序

終于到了Unity中的程序部分了。請(qǐng)按照以下步驟操作:

在Unity中創(chuàng)建一個(gè)新項(xiàng)目

加載3D模型

配置小球

運(yùn)用物理運(yùn)算

安裝Serial Port Utility Pro

主程序

設(shè)置終點(diǎn)

2級(jí)關(guān)卡

3級(jí)關(guān)卡

切換迷宮

步驟1:在Unity中創(chuàng)建一個(gè)新項(xiàng)目

本次使用的Unity版本為2019.4.8f1 Personal。Unity的安裝方法請(qǐng)參考其官網(wǎng):

>> Unity

請(qǐng)用3D模式創(chuàng)建一個(gè)新的Unity項(xiàng)目。

pYYBAGPyzniASGr1AADeatHUOgo116.jpg

步驟2:加載3D模型

加載迷宮的3D模型。將Fusio 360導(dǎo)出的OBJ文件拖放到Unity項(xiàng)目面板中的Asset文件夾中。

創(chuàng)建一個(gè)空的GameObject來掛載迷宮。請(qǐng)從Unity菜單中,選擇[Game Objects(游戲?qū)ο螅 > [Create Empty(創(chuàng)建空對(duì)象)]。 將新建的GameObject重命名為“MazeObject”,并將Transform的位置設(shè)置為0。

將3D模型配置于stage上。將剛剛加載的地圖的3D模型“MazeLv1”拖放到層級(jí)面板的“MazeObject”中。如果直接這樣用,大小和旋轉(zhuǎn)會(huì)很奇怪,因此需要進(jìn)行調(diào)整以使其處于正確的位置。請(qǐng)通過檢視面板的Transform,將旋轉(zhuǎn)設(shè)置為X270、Y180,將縮放設(shè)置為0.2。以同樣的方式設(shè)置2級(jí)的3D模型。3級(jí)由“MazeLV3-A”和“MazeLV3-B”兩個(gè)3D模型組成,因此請(qǐng)創(chuàng)建一個(gè)名為“MazeLv3”的空GameObject,并將這兩個(gè)3D模型放入其中。

pYYBAGPyznuAWNKlAAGFDRqI2Yg032.jpg

需要更改每個(gè)級(jí)別的顏色。請(qǐng)從Unity菜單中選擇 [Asset] > [Create] > [Material],創(chuàng)建三個(gè)材質(zhì)。名稱分別是“MatLv1”、“MatLv2”和“MatLv3”。在材質(zhì)的Inspector面板的反照率(Albedo)項(xiàng)目中更改顏色。我們將“MatLv1”設(shè)置為淺藍(lán)色,“MatLv2”設(shè)置為黃色,“MatLv3”設(shè)置為橙色。請(qǐng)將創(chuàng)建的材質(zhì)拖放到“MazeLv1”、“MazeLv2”、“MazeLv3-A”、“MazeLv3-B”中的網(wǎng)格上。可以看到迷宮已被著色。

pYYBAGPyzn6AWfhhAAHquiMCfWw268.jpg

當(dāng)前,三個(gè)迷宮是重疊顯示的,但“MazeLv2”和“MazeLv3”處于初始狀態(tài),可以將它們禁用,在Inspector面板中名稱的左側(cè)取消選中即可。

步驟3:配置小球

將小球配置在起點(diǎn)。請(qǐng)從Unity菜單中,選擇[Game Objects(游戲?qū)ο螅 > [3D Objects(3D對(duì)象)] > [Sphere(球體)]。對(duì)象的名稱是“Sphere”。更改為從正上方向下看的視角,更容易對(duì)齊位置。我想讓小球從空中落下,所以將y設(shè)置為5.0左右。

poYBAGPyzoGAKRGtAAF0RzAyAz0577.jpg

步驟4:運(yùn)用物理運(yùn)算

給3D模型賦予判斷碰撞的功能。請(qǐng)?jiān)凇癕azeObject”中選擇“MazeLv1”,在Unity菜單中選擇[Component(組件)] > [Physics(物理)] > [Rigid Body(剛體)]。從剛體的設(shè)置項(xiàng)目中取消選中“Use Gravity(使用重力)”并選中“Is Kinematic(開啟動(dòng)力學(xué))”。碰撞檢測(cè)項(xiàng)請(qǐng)選擇“連續(xù)且動(dòng)態(tài)地進(jìn)行碰撞檢測(cè)”。需要減少墻壁的摩擦力。然后請(qǐng)從Unity菜單中選擇[Component(組件)] > [Physics(物理)] > [Mesh Collider(網(wǎng)格碰撞器)]。網(wǎng)格碰撞器設(shè)置項(xiàng)目中的網(wǎng)格,請(qǐng)選擇“MazeLv1”中包含的網(wǎng)格。

將剛體和網(wǎng)格碰撞器附加給“MazeLv2”、“MazeLv3-A”和“MazeLv3-B”并進(jìn)行相同的設(shè)置。

poYBAGPyzoaAE34DAAIZvN_68yk954.jpg

最后,將剛體附加給小球。選擇“Sphere”,然后從Unity菜單中選擇 [Component(組件)] > [Physics(物理)]> [Rigid Body(剛體)]。我希望“Sphere(球體)”根據(jù)重力移動(dòng),因此仍保持選中“UseGravity(使用重力)”。

如果在這個(gè)階段執(zhí)行程序,小球應(yīng)該會(huì)落下并碰撞迷宮。您可以試試看這部分的運(yùn)行情況。

poYBAGPyzomAAqhvAAErMIxRKEs839.jpg

步驟5:安裝Serial Port Utility Pro

Unity與Arduino之間的通信僅通過標(biāo)準(zhǔn)功能也能實(shí)現(xiàn),但這次我們將使用名為“Serial Port Utility Pro (SPUP)” 的工具。使用SPUP進(jìn)行通信時(shí),您可以不必?fù)?dān)心運(yùn)行環(huán)境的差異。這個(gè)工具在資源商店的售價(jià)為79美元,不過您可以從其官網(wǎng)下載試用版。試用版需要在通信量達(dá)到一定程度時(shí)重新啟動(dòng)Unity。我們可以在開發(fā)過程中使用試用版,在想長(zhǎng)期使用時(shí)購(gòu)買它。

>> Serial Port Utility Pro

下載試用版后,請(qǐng)解壓縮ZIP文件。從Unity菜單中,請(qǐng)選擇[Assets(資產(chǎn))] > [Import Package(導(dǎo)入包)] > [Custom Package(自定義包)] ,然后選擇ZIP文件中包含的“spup_v2_free.unitypackage”。在接下來出現(xiàn)的窗口中,請(qǐng)選擇并導(dǎo)入包中的所有文件。

然后,創(chuàng)建一個(gè)空的GameObject,并附加SPUP組件。請(qǐng)從Unity菜單中,選擇[Game Objects(游戲?qū)ο螅 > [Create Empty(創(chuàng)建空對(duì)象)]。 將新創(chuàng)建的游戲?qū)ο笾孛麨椤癝PUPObject”。選擇“SPUPObject”后,請(qǐng)從Unity菜單中選擇[Component] > [SerialPort] > [SerialPort Utility Pro],添加組件。

poYBAGPyzoyAbrQbAAGcOis9TrY718.jpg

設(shè)置為連接Arduino UNO。使用USB數(shù)據(jù)線將Arduino UNO連接到您的電腦,在已連接狀態(tài)下按下“SerialPort Utility Pro”上顯示“Show the devices connected to this PC”的黃色按鈕。如果您按下在新窗口中打開的按鈕,將會(huì)自動(dòng)輸入VenderID、ProductID和Serial Number。需要使通信速度與Arduino程序中設(shè)置的值相匹配。請(qǐng)從BaudRate的下拉菜單中選擇57600bps。需要設(shè)置接收來自Arduino的數(shù)據(jù)的方法。請(qǐng)將“Read Protocol”設(shè)置為“Line Feed Data To String”。

pYYBAGPyzpCAD71QAAGvoCziLAE566.jpg

步驟6:主程序

創(chuàng)建一個(gè)用SPUP執(zhí)行串行通信并根據(jù)加速度傳感器模塊的值移動(dòng)迷宮的程序。這是本項(xiàng)目的核心程序。

請(qǐng)從Unity菜單中選擇[Assets] > [Create] > [C# Script],創(chuàng)建一個(gè)C#文件,并將其命名為“MazeScript”。雙擊C#文件打開編輯器,輸入以下代碼。

MazeScript.cs

using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class MazeScript : MonoBehaviour { public SerialPortUtility.SerialPortUtilityPro serialPort = null; Vector3 accSensor;//加速度傳感器 int photoRef1 = 0;//反射式光電傳感器1 int photoRef2 = 0;//反射式光電傳感器2 int threshold = 700;//反射式光電傳感器閾值 int mazeType = 0;//0:無 public GameObject mazeLv1;//迷宮Lv1的游戲?qū)ο?public GameObject mazeLv2;//迷宮Lv2的游戲?qū)ο?public GameObject mazeLv3;//迷宮Lv3的游戲?qū)ο?public GameObject ball;//小球的游戲?qū)ο?public GameObject goalText;//顯示終點(diǎn) public Vector3 cameraPosOffset;//小球和相機(jī)的距離 Vector3 ballDefaultPos; void Start () { ballDefaultPos = ball.transform.position;//記錄小球的初始位置 reset(); } void Update () { //攝像頭 Camera.main.transform.position = ball.transform.position + cameraPosOffset; Camera.main.transform.LookAt(ball.transform.position); // 旋轉(zhuǎn) Vector3 rotationEuler = new Vector3(Mathf.Atan2(accSensor.x, accSensor.z) / Mathf.PI *180, 0, Mathf.Atan2(accSensor.y, accSensor.z) / Mathf.PI *180); Quaternion rotation = Quaternion.Euler(rotationEuler); gameObject.transform.rotation = Quaternion.Lerp(gameObject.transform.rotation,rotation, 0.1f); // 復(fù)位 if(Input.GetKeyDown(KeyCode.Space)) { reset(); } } public void reset() { setMaze();//迷宮的初始化 ball.transform.position = ballDefaultPos; ball.GetComponent().velocity = Vector3.zero; ball.GetComponent().angularVelocity = Vector3.zero; goalText.SetActive(false); stopVibe();//振動(dòng)電機(jī)停止 } public void setMaze() { Debug.Log("photoRef1:" + photoRef1 +" photoRef2:" + photoRef2); if( (photoRef1 == 0) && (photoRef2 == 0)) { //如果值為 0,則不執(zhí)行任何操作 return; }else if( (photoRef1 < threshold) && (photoRef2 > threshold) ) { //1級(jí) mazeType = 1; mazeLv1.SetActive(true); mazeLv2.SetActive(false); mazeLv3.SetActive(false); }else if( (photoRef1 > threshold) && (photoRef2 < threshold) ) { //2級(jí) mazeType = 2; mazeLv1.SetActive(false); mazeLv2.SetActive(true); mazeLv3.SetActive(false); }else if( (photoRef1 < threshold) && (photoRef2 < threshold) ) { //3級(jí) mazeType = 3; mazeLv1.SetActive(false); mazeLv2.SetActive(false); mazeLv3.SetActive(true); } } public void ReadComplete(object data) { var text = data as List; if(text.Count != 5) return; accSensor = new Vector3( float.Parse(text[0]), float.Parse(text[1]), float.Parse(text[2])); photoRef1 = int.Parse(text[3]); photoRef2 = int.Parse(text[4]); } public void startVibe() { //使振動(dòng)電機(jī)運(yùn)轉(zhuǎn)的命令 serialPort.WriteCRLF("start"); } public void stopVibe() { //使振動(dòng)電機(jī)停止的命令 serialPort.WriteCRLF("stop"); } }

請(qǐng)將“MazeScript”拖放到“MazeObject”。

從“MazeObject”的檢視面板中設(shè)置“MazeScript”。將“SPUPObject”拖放到Serial Port(串行端口)。將“MazeObject”中的“MazeLv1、Lv2、Lv3”分別拖放到“Maze Lv1、Lv2、Lv3”項(xiàng)目中。將“Sphere”拖放到“Ball”上。Goal Text(終點(diǎn)文本)將在稍后設(shè)置,因此暫時(shí)將其留空。Camera Pos Offset用來設(shè)置攝像頭和小球保持多少距離。請(qǐng)輸入x 0、y 5、z -3。

poYBAGPyzpOAQcMvAAHicDx2-lY437.jpg

在“SPUPObject”的檢視面板的SerialPortUtilityPro設(shè)置中,有一個(gè)叫做“Read Complete Event Object(Object)”的項(xiàng)目。該項(xiàng)目用來指定接收到串行通信時(shí)調(diào)用的函數(shù)。這里為“MazeScript”的 ReadComplete函數(shù)。

請(qǐng)單擊項(xiàng)目右下角的加號(hào)圖標(biāo)。將Maze Object(迷宮對(duì)象)拖放到“無(對(duì)象)”字段。單擊右上角的Nofunction下拉菜單,然后選擇[MazeScript] > [ReadComplete]。

pYYBAGPyzpWAClHIAAAfkH7fVbQ939.jpg

如果在這里執(zhí)行程序,應(yīng)該可以收到來自Arduino的加速度傳感器模塊數(shù)據(jù),并且迷宮應(yīng)該可以動(dòng)了。那就試試這部分程序的運(yùn)行情況吧。然后,該休息一下了!

pYYBAGPyzpiAMshRAAE8MoZv94M942.jpg

步驟7:設(shè)置終點(diǎn)

我們需要?jiǎng)?chuàng)建一個(gè)當(dāng)成功到達(dá)終點(diǎn)時(shí)做出反應(yīng)的機(jī)制。在終點(diǎn)設(shè)置一個(gè)用于判斷碰觸終點(diǎn)的透明對(duì)象(觸發(fā)器),當(dāng)小球碰到觸發(fā)器時(shí),會(huì)顯示文本對(duì)象。

請(qǐng)從Unity菜單中選擇 [Game Object] > [3D Object] > [Cube],創(chuàng)建一個(gè)立方體。將其重命名為“GoalTrigger”,并將其放置在層級(jí)面板的“MazeObject”中。移動(dòng)到地圖右上角的終點(diǎn)附近,通過縮放來調(diào)整大小。請(qǐng)取消選中“Mesh Renderer(網(wǎng)格渲染器)”,并將其設(shè)為隱藏,選中“BoxClider”的“設(shè)為觸發(fā)器”。

poYBAGPyzpyAApQ-AAE37-GJVak886.jpg

然后需要配置文本對(duì)象。請(qǐng)從Unity菜單中選擇[Game Object] > [3D Object] > [3DText]。將其重命名為“GoalText”,并將其放置在層級(jí)面板的“MazeObject”中。當(dāng)使Transform的X旋轉(zhuǎn)90度時(shí),應(yīng)該可以看到“HelloWorld”字樣。在檢視面板的文本項(xiàng)目中輸入“GOAL!!!”。改變Transform的位置,將其移動(dòng)到終點(diǎn)附近,將縮放設(shè)置為 0.2,并將字體大小設(shè)置為 100。

pYYBAGPyzp-AVapGAAFmuCPmh4s375.jpg

將用于判定到達(dá)終點(diǎn)的程序附加到“GoalObject”。
請(qǐng)從Unity菜單中選擇[Assets] > [Create] > [C# Script(C#腳本)],創(chuàng)建一個(gè)C#文件,并將其命名為“GoalScript”。雙擊C#文件打開編輯器,輸入以下代碼。

GoalScript.cs

using System.Collections; using System.Collections.Generic; using UnityEngine; public class GoalScript : MonoBehaviour { public GameObject goalText; MazeScript MazeScript; void Start() { MazeScript = transform.root.GetComponent(); } void OnTriggerEnter(Collider other) { //接觸時(shí)調(diào)用的事件 if(other.name == "Sphere"){//如果名字是Shpere, goalText.SetActive(true);//顯示終點(diǎn)文本 MazeScript.startVibe();//發(fā)送使振動(dòng)電機(jī)運(yùn)轉(zhuǎn)的命令 } } }

請(qǐng)將“GoalScript”拖放到“GoalTrigger”,將“GoalText”拖放到“Goal Script”的“Goal Text”項(xiàng)目中。

從“MazeObject”的檢視面板中,將“GoalText”拖放到“MazeScript”的“GoalText”欄中。

如果在這里執(zhí)行程序,當(dāng)?shù)竭_(dá)終點(diǎn)時(shí)會(huì)顯示“GOAL!!!”,并且振動(dòng)電機(jī)應(yīng)該會(huì)振動(dòng)。要停止振動(dòng)時(shí),請(qǐng)按空格鍵重置游戲。終于像游戲樣了!

poYBAGPyzqGAAwYMAAEUNJ4Rm5s683.jpg

步驟8:2級(jí)關(guān)卡

需要給2級(jí)難度的迷宮添加扭曲功能。將觸發(fā)器配置在地板開孔的下方,然后將小球移動(dòng)到扭曲對(duì)象的坐標(biāo)處。

首先,請(qǐng)禁用“MazeLv1”并激活“MazeLv2”。就像設(shè)置到達(dá)終點(diǎn)判定機(jī)制一樣,制作一個(gè)立方體,將其放在地板開孔的下方,然后選中“BoxClider”的“設(shè)為觸發(fā)器”。對(duì)象的名稱是“WarpIn1”和“WarpIn2”。

接下來,需要配置對(duì)象,用來指定要扭曲的目標(biāo)。請(qǐng)從Unity的菜單中選擇[Game Object] > [Create Empty]。對(duì)象的名稱是“WarpOut1”和“WarpOut2”。將其配置在另一個(gè)孔的附近。

請(qǐng)將“WarpIn1”、“WarpIn2”、“WarpOut1”和“WarpOut2”放入層級(jí)面板的“MazeLv2”中。

pYYBAGPyzqWAT6PDAAFi1mIDKmg535.jpg

需要編寫一個(gè)腳本來控制扭曲。請(qǐng)創(chuàng)建C#文件并在編輯器中輸入以下代碼:

WarpScript.cs

using System.Collections; using System.Collections.Generic; using UnityEngine; public class WarpScript : MonoBehaviour { public GameObject warpOut; void OnTriggerEnter(Collider other) { if(other.name == "Sphere"){ other.transform.position = warpOut.transform.position; } } }

請(qǐng)將“WarpScript.cs”附加到“WarpIn1”和“WarpIn2”中,并將“WarpOut1”和“WarpOut2”拖放到“Warip Out”項(xiàng)。

當(dāng)執(zhí)行這部分程序時(shí),小球掉進(jìn)洞里,會(huì)穿越到另一個(gè)洞附近。

poYBAGPyzqiANFfkAAETnbE1ErM057.jpg

步驟9:3級(jí)關(guān)卡

3級(jí)難度的迷宮由兩部分組成。迷宮外側(cè)為“MazeLv3-A”,中間圓形挖空部分為“MazeLv3-B”。需要使中心部分緩慢旋轉(zhuǎn)。請(qǐng)禁用“MazeLv2”并激活“MaseLv3”。然后編寫使對(duì)象旋轉(zhuǎn)的代碼。請(qǐng)創(chuàng)建一個(gè)C#文件并輸入以下代碼:

RotateScript.cs

using System.Collections; using System.Collections.Generic; using UnityEngine; public class RotateScript : MonoBehaviour { void Update() { transform.Rotate(new Vector3(0.0f, 0.0f, 0.05f)); } }

將“RotateScript.cs”附加到“MazeLv3-B”后,中心部分將會(huì)旋轉(zhuǎn)。碰撞檢測(cè)功能也會(huì)正常工作。

pYYBAGPyzqqAShbPAAE9_D4f-CE585.jpg

步驟10:切換迷宮

終于完成了這三個(gè)迷宮。最后,我們需要進(jìn)行一些設(shè)置,使替換實(shí)物迷宮時(shí)3D模型迷宮也會(huì)切換。請(qǐng)?jiān)?級(jí)實(shí)物迷宮放置在盒子上的狀態(tài)下,運(yùn)行Unity項(xiàng)目。當(dāng)按下空格鍵時(shí),控制面板上將會(huì)顯示如下所示的反射式光電傳感器反應(yīng)值。

photoRef1:451 photoRef2:971

在1級(jí)實(shí)物迷宮的背面,在反射式光電傳感器1的位置貼有黑色標(biāo)記,在反射式光電傳感器2的位置貼有白色標(biāo)記。也就是說,反應(yīng)值為黑色451,白色971。根據(jù)反射式光電傳感器的高度,該值可能會(huì)有所不同,但存在“黑色<白色”的關(guān)系。

1級(jí)是黑白,2級(jí)是白黑,3級(jí)是黑黑,所以需要確定白色和黑色的閾值,當(dāng)滿足每個(gè)條件時(shí)就切換迷宮。

請(qǐng)看“MazeScript.cs”的第13行。在這里設(shè)置閾值。我們將閾值設(shè)為700,該值大致位于白色(451)和黑色(971)的中間。

int threshold = 700;//反射式光電傳感器閾值

在按下空格鍵時(shí)調(diào)用的setMaze()中,處理不同的情況。

public void setMaze() { Debug.Log("photoRef1:" + photoRef1 +" photoRef2:" + photoRef2); if( (photoRef1 == 0) && (photoRef2 == 0)) { //如果值為 0,則不執(zhí)行任何操作 return; }else if( (photoRef1 < threshold) && (photoRef2 > threshold) ) { //1級(jí) mazeType = 1; mazeLv1.SetActive(true); mazeLv2.SetActive(false); mazeLv3.SetActive(false); }else if( (photoRef1 > threshold) && (photoRef2 < threshold) ) { //2級(jí) mazeType = 2; mazeLv1.SetActive(false); mazeLv2.SetActive(true); mazeLv3.SetActive(false); }else if( (photoRef1 < threshold) && (photoRef2 < threshold) ) { //3級(jí) mazeType = 3; mazeLv1.SetActive(false); mazeLv2.SetActive(false); mazeLv3.SetActive(true); } }

已完成的Unity項(xiàng)目請(qǐng)參考分發(fā)文件中的“UnityApp”。但是,免費(fèi)版的SerialPortUtilityPro無法分發(fā)文件,因此刪除了SerialPortUtilityPro包和“SPUPObject”。請(qǐng)參閱步驟5進(jìn)行設(shè)置。

4. 結(jié)束語(yǔ)

大家辛苦了!這個(gè)“數(shù)字滾球迷宮”怎么樣?我認(rèn)為這是一個(gè)使用Arduino和傳感器將實(shí)物和數(shù)字內(nèi)容混合在一起的有趣作品。

在本文中,我們制作了三個(gè)stage,還制作了要穿越的洞和旋轉(zhuǎn)的墻壁。此外,還可以根據(jù)創(chuàng)意和想法創(chuàng)建各種stage,比如貌似有粘性而緩慢移動(dòng)的地板、進(jìn)入內(nèi)部會(huì)彈出到空中的大炮、以及追球的對(duì)手角色。請(qǐng)大家勇敢地嘗試制作原創(chuàng)stage作品!

本系列連載一覽

前篇:用Arduino和加速度傳感器制作數(shù)字滾球迷宮
后篇:用Arduino和加速度傳感器制作數(shù)字滾球迷宮(本章)

poYBAGPyzqyALXDSAAA53eATtLI993.png

平原真

以事物之間的關(guān)系為主題進(jìn)行探索的藝術(shù)家。他使用電腦和電子設(shè)備創(chuàng)作了很多媒體藝術(shù)作品,近年來,主要使用木材和石頭等天然素材創(chuàng)作三維立體作品。日本長(zhǎng)岡造形大學(xué)副教授。Oggoroggo Products的代表。著有《Arduino實(shí)戰(zhàn)! 通過電子制作讓夢(mèng)想成真》(OHMSHA)。https://makotohirahara.com/

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3313

    瀏覽量

    49232
  • 加速度傳感器
    +關(guān)注

    關(guān)注

    12

    文章

    475

    瀏覽量

    55253
  • Arduino
    +關(guān)注

    關(guān)注

    188

    文章

    6477

    瀏覽量

    187840
  • Unity
    +關(guān)注

    關(guān)注

    1

    文章

    127

    瀏覽量

    21879
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是加速度傳感器加速度傳感器如何工作

    。但是剛開始的時(shí)候,你會(huì)發(fā)現(xiàn)光測(cè)量?jī)A角和加速度好像不是很有用。但是,現(xiàn)在工程師們已經(jīng)想出了很多方法獲得更多的有用的信息。加速度傳感器可以幫助你的機(jī)器人了解它現(xiàn)在身處的環(huán)境。是在爬山?還是在走下坡,摔倒
    發(fā)表于 02-02 15:30

    arduino學(xué)習(xí)筆記12 - ADXL345加速度傳感器實(shí)驗(yàn)

    中就是使用加速度傳感器與陀螺儀進(jìn)行卡爾曼濾波進(jìn)行姿態(tài)矯正。本次試驗(yàn)使用的ADXL345數(shù)字傳感器,通過I2C或者SPI接口直接輸出數(shù)字信號(hào)。
    發(fā)表于 10-24 09:39

    加速度傳感器的應(yīng)用詳解

    幾個(gè)例子,更好的認(rèn)識(shí)加速度傳感器。  游戲控制  加速度傳感器可以檢測(cè)上下左右的傾角的變化,因此通過前后傾斜手持設(shè)備來實(shí)現(xiàn)對(duì)游戲中物體的前后左右的方向控制,就變得很簡(jiǎn)單。  圖像自動(dòng)翻
    發(fā)表于 12-07 15:30

    加速度傳感器應(yīng)用詳解

    例子,更好的認(rèn)識(shí)加速度傳感器。 游戲控制 加速度傳感器可以檢測(cè)上下左右的傾角的變化,因此通過前后傾斜手持設(shè)備來實(shí)現(xiàn)對(duì)游戲中物體的前后左右的方向控制,就變得很簡(jiǎn)單。 圖像自動(dòng)翻轉(zhuǎn)
    發(fā)表于 11-07 16:15

    加速度傳感器的原理

    加工方法制造的加速度傳感器難以全面滿足這些要求。于是應(yīng)用新興的微機(jī)械加工技術(shù)制作的微加速度傳感器應(yīng)運(yùn)而生。這種
    發(fā)表于 11-08 15:46

    加速度傳感器原理

    加工方法制造的加速度傳感器難以全面滿足這些要求。于是應(yīng)用新興的微機(jī)械加工技術(shù)制作的微加速度傳感器應(yīng)運(yùn)而生。這種
    發(fā)表于 11-09 10:39

    如何測(cè)量汽車剎車踏板的位移和加速度

    要求測(cè)量汽車剎車踏板的位移和加速度,然后用VB上位機(jī)顯示,單片機(jī)是STC08S2,已有最小系統(tǒng),加速度準(zhǔn)備用3軸加速度傳感器測(cè)量,位移傳感器
    發(fā)表于 07-19 05:56

    加速度傳感器的選型

    由于傳感器應(yīng)用十分廣泛,類型多種多樣,在各行各業(yè)都有應(yīng)用。因此,在這里主要介紹用于振動(dòng)測(cè)試的振動(dòng)傳感器的選型。按測(cè)量振動(dòng)參量分類可分為三大類:位移傳感器速度
    發(fā)表于 08-11 07:49

    加速度傳感器的工作原理解析

    滿足這些要求。于是應(yīng)用新興的微機(jī)械加工技術(shù)制作的微加速度傳感器應(yīng)運(yùn)而生。這種傳感器體積小、重量輕、功耗小、啟動(dòng)快、成本低、可靠性高、易于實(shí)現(xiàn)數(shù)字
    發(fā)表于 05-17 07:00

    陀螺儀傳感器和加速度傳感器的區(qū)別是什么?

    陀螺儀傳感器和加速度傳感器有什么不同?
    發(fā)表于 05-18 06:55

    單片機(jī)和加速度傳感器的跌倒監(jiān)測(cè)系統(tǒng)設(shè)計(jì)

    本文介紹了單片機(jī)和加速度傳感器的跌倒監(jiān)測(cè)系統(tǒng)設(shè)計(jì)方案。
    發(fā)表于 06-05 08:00 ?13次下載

    三軸加速度傳感器原理_三軸加速度傳感器應(yīng)用

    本文首先介紹了三軸加速度傳感器原理,其次介紹了三軸加速度傳感器優(yōu)點(diǎn),最后介紹了三軸加速度傳感器應(yīng)
    發(fā)表于 10-17 15:19 ?1.9w次閱讀

    如何選擇合適的加速度傳感器

    這個(gè)是最先需要考慮的。這個(gè)取決于你系統(tǒng)中和加速度傳感器之間的接口。一般模擬輸出的電壓和加速度是成比例的,比如2.5V對(duì)應(yīng)0g的加速度,2.6V對(duì)應(yīng)于0.5g的
    發(fā)表于 01-17 16:44 ?1890次閱讀

    Arduino和加速度傳感器制作數(shù)字滾球迷宮【前篇】

    這次將為大家介紹一個(gè)使用Arduino制作的獨(dú)特電子作品,將會(huì)分【前篇】和【后篇】?jī)刹糠诌M(jìn)行介紹。為我們介紹這個(gè)非常有趣的電子制作項(xiàng)目的是平原真先生,他是一位以事物之間的關(guān)系為主題進(jìn)行
    的頭像 發(fā)表于 02-20 13:24 ?1240次閱讀
    <b class='flag-5'>用</b><b class='flag-5'>Arduino</b><b class='flag-5'>和加速度</b><b class='flag-5'>傳感器</b><b class='flag-5'>制作數(shù)字</b><b class='flag-5'>滾球迷宮</b>【前篇】

    使用Arduino和加速度計(jì)陀螺儀傳感器MPU9250制作指南針

    電子發(fā)燒友網(wǎng)站提供《使用Arduino和加速度計(jì)陀螺儀傳感器MPU9250制作指南針.zip》資料免費(fèi)下載
    發(fā)表于 06-26 10:24 ?1次下載
    使用<b class='flag-5'>Arduino</b><b class='flag-5'>和加速度</b>計(jì)陀螺儀<b class='flag-5'>傳感器</b>MPU9250<b class='flag-5'>制作</b>指南針
    主站蜘蛛池模板: 天堂网www| 高h肉肉视频在线播放观看 高黄视频 | 日本一区二区在线免费观看 | 国产成人精品高清免费 | 四虎在线最新永久免费播放 | 你懂的国产精品 | 国产aaaaaa | 免费观看a黄一级视频 | videofreeones性欧美另类 | 午夜在线观看免费高清在线播放 | 亚洲欧美在线一区 | 中文一区在线观看 | 久久精品国产亚洲aa | 成人美女隐私免费 | 在线视频亚洲 | 九九热在线精品 | 中文永久免费看电视网站入口 | 免费国产不卡午夜福在线观看 | 亚洲视频在线免费看 | 色婷婷亚洲综合五月 | 天天玩天天操 | 日韩在线视频免费观看 | 末满18以下勿进色禁网站 | 欧美一级在线免费观看 | 女人牲交一级毛片 | a级网| 特黄特a级特别特级特毛片 特黄特色大片免费播放路01 | 手机看片免费永久在线观看 | 欧美性猛交xxxx黑人喷水 | 青娱乐伊人 | 福利视频一区二区 | 美女露出尿口让男人桶爽网站 | 最近2018中文字幕免费看2019 | 色中色资源 | 一级毛片美国一级j毛片不卡 | 日本xxxx69| 欧美日韩你懂的 | 激情五月婷婷综合网 | 国内色综合精品视频在线 | 免费午夜影片在线观看影院 | 么公的好大好硬好深好爽在线视频 |