三维/人工智能 - 可持续发展目标7 - 利用距离感应器控制光源(难度:2级)
-
用到的相关知识
介绍
可持续发展目标是联合国于2015年正式发布的17个目标。这17个目标是大家都要完成的学习清单。
本篇教程是关于节省电能,与第7个目标“负担得起的清洁能源”相关。
在如下三维动画中,我们在隧道入口处利用距离感应器检测是否有车进入隧道,并自动打开隧道内的灯光:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/5db2d4b6-6350-49b8-9751-5dc5e3c24e07.gif" width="510" style="border-radius: 5px; border: 1px solid #29622d;">
第1步 - 新建一个带三维坐标轴的空场景
新建一个项目,删除角色“角色1”,把角色“空的1”重命名为“主角”。
添加积木“创建三维场景”以加载空场景,再添加三维坐标系以显示三维坐标轴。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/d335b5d2-4bff-48eb-bf50-d322a9a898d5.png" width="300" style="">
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/d0d11c4d-e12b-44c4-8bf8-ee42fe183f0c.gif" width="480" style="">
第2步 - 绿地上一条路
接下来,我们在一片广阔的绿地上添加一条很长的路,用一个平面表示绿地,用盒子表示路。注意,路的宽度为100。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/88bf36f8-a71f-4258-a568-589edbafca43.png" width="700" style="">
结果如下所示:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/b794c4c9-46fb-411a-8368-5757871d632f.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第3步 - 隧道管子
接下来,添加一个管子来表示隧道。需要旋转至朝向y轴,并向前移动,使一端与原点对齐。其直径也为100,这样的话上半部分刚好遮住路。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/c4d0991a-7ed4-41b0-922e-a5b02cef9c2f.png" width="1100" style="">
依次运行每个积木的结果:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/dd9cf438-5bbe-41bc-9031-d234a74f3705.gif" width="1000" style="">
第4步 - 暗光源
接下来,删除场景内的所有光源,然后添加一个较暗的光源:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/5904ab11-8355-4024-9aa1-01740a2b8ec2.png" width="800" style="">
现在隧道看起来很暗了,这样的话,我们在隧道内添加光源以后才会形成较好的反差:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/a32acf76-226c-438e-acd9-5d298b154f4e.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第5步 - 用一个新角色添加感应器盒子
现在我们在隧道前部添加一个感应器盒子。更合理的办法就是,新建一个角色来管控传感器,这样就更容易找到代码,并且这个角色中的所有积木都将应用于感应器。
首先,“主角”角色广播一条消息“添加感应器”。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/a4c944fe-ad7c-4f6c-9cf5-7cccc794500c.png" width="250" style="">
然后,在名为“感应器”的新角色中,添加一个大小为5的小盒子。将其移动至y坐标为-50处,以便于当汽车进入隧道前就可以检测到汽车。https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/99687f4c-ff49-4f64-8b6f-019a403c89ba.png" width="500" style="">
盒子如下所示:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/dabb20fe-b2f7-4a74-ae09-d4c9cbdb9a23.gif" width="510" style="border-radius: 5px; border: 1px solid #29622d;">
第6步 - 在盒子左侧添加距离感应器
在“感应器”角色中,为盒子开启距离感应器 。提示,我们把盒子放在了马路右侧,所以只需要检测它左侧走过的物体。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/57b682b0-99a3-450b-8a8f-01c27285db69.png" width="1200" style="">
大家可以看到盒子左侧发射的传感器射线,长度为60。驶过的汽车所报告的距离会小于60。https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/3f2bd297-f228-41f1-b144-117f6121a824.gif" width="510" style="border-radius: 5px; border: 1px solid #29622d;">
第7步 - 定期检验感应器读数
若要使用距离感应器,我们只需要重复不断地读取感应器的数值。每当发现与左侧物体的距离小于60,意味着有汽车正在驶过,那么我们就要广播一条消息“打开灯光”:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/34eaa75a-009f-41db-abd5-31156a21c2bc.png" width="600" style="">
注意,每次读取以后要等待0.5秒,这样就不会读取太频繁。只要整个汽车驶过感应器的时间超过0.5秒,我们就会检测到。当然了,如果你想处理开得很快的车,就要缩短这个等待时间。
第8步 - 在隧道内添加光源
接下来,我们要用一个新角色在隧道内添加光源。
首先,“主角”角色广播一条消息“添加光源”:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/5790087d-5290-4579-882e-de9e505c6900.png" width="250" style="">
然后,添加一个新角色“光源”。每当它收到广播消息,就在隧道入口处的穹顶添加一个聚焦光源.我们用圆锥体来表示光源,但需要把尺寸缩小到5%。
此外,由于默认情况下聚焦光源向前照射,为了使它向下照射,我们需要绕x轴旋转90度。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/3794d6b3-11c5-41c9-8ce7-aa2061fbbc24.png" width="1000" style="">
这三个积木的分步演示如下:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/bf7299fe-8653-4118-ab6b-32d5b0eaa283.gif" width="1010" style="border-radius: 5px; border: 1px solid #29622d;">
第9步 - 用变量循环添加4个光源
现在我们成功添加了一个光源,接下来用变量循环添加4个。我们将使用一个新变量“i”,让它从1走到4。4个灯分别命名为“灯1”、“灯2”、“灯3”、“灯4”,同时,位置要分别移动至y坐标100、200、300、400。变量“i”用来计算名称和y坐标。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/6cb7c519-0590-4ab1-aa63-82f3ada9c708.png" width="1000" style="">
现在隧道内就有了4盏灯:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/454cd85a-a690-4f65-ae43-d5510a874223.gif" width="510" style="border-radius: 5px; border: 1px solid #29622d;">
第10步 - 开关灯
为了节省电能,我们要让隧道内的灯默认情况下为关闭状态。在后面添加一个积木即可,每添加一个光源之后就先关闭它。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/96084c16-654e-408d-babd-b06086ba3529.png" width="600" style="">
之后,每当距离感应器发送消息“打开灯光”,我们就可以遍历每个灯并打开。https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/d38586cf-eebe-4348-bf67-5fd339b06dc5.png" width="350" style="">
第11步 - 添加汽车
最后一步,我们要添加一辆汽车,最好在一个新角色中添加,新角色命名为“汽车”。
首先,“主角”角色广播一条消息来“添加汽车”:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/ea93a0ea-6a6a-4124-95a7-1755ee27dc4b.png" width="250" style="">
然后,添加一个名为“汽车”的新角色,每当该角色收到消息“添加汽车”,就添加汽车物体。我们把汽车的起点y坐标设为-200,汽车就会驶过感应器盒子。我们把前进速度设为50,在感应器盒子旁边驶过时就不会太快:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/bdbc7da1-1d3a-491e-ad62-73f9a13c6447.png" width="500" style="">
现在我们就可以观察到当汽车驶过感应器盒子时灯光打开:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/51f2005c-c781-4876-919f-a26ea4d50b95.gif" width="450" style="border-radius: 5px; border: 1px solid #29622d;">
第12步 - 使用跟踪摄像头
为了从汽车视角查看灯光效果,我们可以用追踪摄像头在汽车后面跟随汽车拍摄。只需要在“汽车”角色中添加如下积木:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/f57c4c7e-4a83-438d-ac85-74f267de62e4.png" width="1000" style="">
从汽车后面看到的情景如下:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/37206cd6-6cdf-499b-8c41-082eca6502bc.gif" width="510" style="border-radius: 5px; border: 1px solid #29622d;">
第13步 - 整理项目
在发布项目之前,我们要整理一下项目,删除一些不必要的物体。
第一,在“主角”角色中隐藏三维坐标轴:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/5bb5f3ba-62c0-46a5-a5bc-bdb06b8e685e.png" width="360" style="">
第二,在“感应器”角色中,让感应器盒子变得很小,因为不需要看到这个盒子。https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/752995de-fe87-4b8e-87b7-4ead3cd34b3b.png" width="550" style="">
第三,还是在“感应器”角色中,隐藏感应器射线:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/5047458e-683b-44af-b9d8-d50f74025fbb.png" width="1100" style="">
最终演示结果如下:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/5db2d4b6-6350-49b8-9751-5dc5e3c24e07.gif" width="510" style="border-radius: 5px; border: 1px solid #29622d;">
创意扩展
大家可以用自己的创意想法扩展这个项目,可以扩展成很多种形式。以下是一些例子:
-
关灯:大家可以在隧道出口处再装一个距离感应器,当汽车驶过后关闭灯光。
-
不止一辆车:如果有多辆汽车,只有当所有汽车通过隧道后才能关闭灯光。
-
双向交通:如果隧道内双向通行,你应该如何修改感应器来处理这种情况?
-
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login