Navigation

    CreatiCode Scratch Forum

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • CreatiCode

    三维 - 带距离感应器的自动驾驶汽车(难度:3级)

    小教程
    1
    1
    148
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • C
      creaticodeteacher2-mail last edited by admin

       

      用到的相关知识

      • 创建三维场景
      • 更新纹理
      • 使用盒子
      • 使用模型
      • 三维物体的速度
      • 人工智能距离感应器
      • 广播消息
      • 三维旋转
      • 追踪摄像头
      • 矩阵复制
         
         

      介绍

      在本篇教程中,我们将在汽车上安装“距离感应器”,汽车就能自动躲避障碍物。

       
       

      第1步 - 创建三维场景“草地”

      新建一个项目,使用积木“创建三维场景”载入“草地”场景。还要添加三维坐标系以显示三维坐标轴。


       

       

      第2步 - 添加一个新角色“障碍物”

      添加一个新角色,命名为“障碍物”。

      在主角色中,广播一条消息来“添加障碍物”:


       

      在新角色“障碍物”中,当收到广播消息,就添加一个盒子,大小为100,然后移动至位置——y坐标:500,z坐标:50。大家可随意更换其纹理:


       
      现在就得到这样一个盒子:

       
       

      第3步 - 添加汽车

      在主角色中,添加一个汽车模型,高度为60。大家可随意更改其颜色。


       

      汽车被放在场景中央,面对前方的盒子:

       
       

      第4步 - 向前开车

      接下来,我们为车设置“前进速度”100。


       
      汽车就会按照预期向前行驶,并且会穿过盒子。

       
       

      第5步 - 添加跟踪摄像机

      当汽车到处行驶,很快就走出摄像机的视野。我们可以添加一个“追踪摄像头”,当汽车行驶和转向时就会跟踪汽车。

      注意:你需要把方向设置为“目标”,以便于摄像机总是与汽车面向同一方向。另外,“透视度”设为60%,当障碍物遮挡住汽车时,障碍物就变成半透明。


       
      现在应该就能使摄像机跟踪汽车,如下所示:

       
       

      第6步 - 打开前方距离感应器

      接下来,我们要为汽车添加前方距离感应器,以便于让汽车能发现前方的障碍物有多远。

      如下图所示,我们只需开启“前”感应器。现在为了调试用途,将其设为可见。由于汽车高度为60,我们把“z位移”设为30。此外,现在我们只用一个感应器。


       

      现在就能看到前方的距离感应器光束了:

       
       

      第7步 - 当汽车离障碍物太近就停下

      现在我们测试一下距离感应器是否管用。我们可以用一个“重复执行”循环不断检查与前方障碍物的距离,当距离小于250时就停下来。


       
      果然,汽车向前行驶一段距离后停了下来:

       
       

      第8步 - 向左转躲开障碍物

      我们不让汽车停止,而是让汽车左转躲开障碍物。

      做法为,设置“前进速度”为0的积木删除,换成积木“左转3度”。


       
      如下图所示,汽车距离盒子小于250时就开始左转,会一直转到感应器检测不到盒子:

       
       

      第9步 - 换成5个距离感应器

      我们的方案仍然有个问题。汽车会斜着撞到盒子上,原因就是,尽管中间的感应器光束碰不到盒子,汽车右半部分仍然会撞到盒子。

       
      为解决这个问题,我们把1个距离感应器换成5个。这样的话,汽车右前角的感应器光束会碰到盒子,告诉我们仍然有障碍物。


       

      现在汽车会一直左转到5根光束都碰不到障碍物:

       
       

      第10步 - 第二个障碍物

      现在我们的代码应该能适用于任意数量的障碍物。测试方法为,进入“障碍物”角色,再添加一个障碍物。提示,大家只需要复制第一个盒子,比重新添加要快得多。


       
      如下所示,汽车可以躲开这两个盒子:

       
       

      第11步 - 更多一些障碍物

      现在我们尝试添加更多障碍物,利用积木“矩阵复制”。

      在“障碍物”角色,我们可以将盒子沿x轴、y轴方向矩阵复制20行、20列。盒子在x轴、y轴方向的间隔距离均为500。为复制的盒子设置一定程度的随机位置、随机大小和随机方向。

      我们还要把初始的盒子移到场景的左下角(x坐标、y坐标均为负值),这样才能让汽车从障碍物中间开始出发。


       

      从上方看去如下图所示,初始的盒子在左下角,汽车在最中央。


       

      当我们运行程序,汽车能躲开所有障碍物:

       
       

      创意扩展

      大家可以把这个项目扩展成多种形式。以下是一些创意想法:

      1. 不同形状的障碍物:大家可以尝试用球形、圆柱形,甚至是模型。距离感应器适用于各种障碍物。

      2. 左右转向:目前汽车总是左转来躲开障碍物。大家能不能试试左右随机转向?

      1. 先减速再转向:目前汽车如果躲闪不及,仍然会撞到障碍物。我们可以改为检测到障碍物时先减速,躲过障碍物后再恢复正常速度。

      2. 三维迷宫:大家还可以把汽车改为飞机,让飞机在空中飞过障碍物迷宫。飞机要能够上升、下降来躲避障碍物。

      1 Reply Last reply Reply Quote 0
      • First post
        Last post