Navigation

    CreatiCode Scratch Forum

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

    三维 - 避免化身穿过模型(难度:4)

    小教程
    1
    1
    188
    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.
    • info-creaticode
      CreatiCode last edited by admin

      介绍

      当你使用预定义的三维场景(例如“城市”或“城堡”)时,一个常见问题是玩家的化身可能会穿过建筑物或其他模型的墙壁。

      在本教程中,你将学习如何防止这种情况发生。

       
       

      第 1 步 - 改编起始项目

      我已经为你准备了一个起始项目。它先加载“城市”场景,添加化身,然后根据按键事件移动/转动头像。请打开此项目,并将其改编为你自己的副本。

      https://play.creaticode.cn/projects/9d51880b955f25492e346ce8

       
       

      第 2 步 - 添加围墙角色

      为了防止化身穿过物体,最简单的方法是用一个简单的形状(例如盒子或圆柱体)来掩盖那个物体,然后让这个新的形状阻挡住化身的行动。

      首先,创建一个名为“围墙”的新角色,并添加以下积木以在化身前面创建一个大盒子:

      76237dde-611c-434d-ab89-0e52a23772f8-image.png

       
      当你单独点击这 3 个积木来运行它们时,我们就能看到这个新的紫色的墙了:

      0375e927-5ef7-4fb1-b26f-3585559cfd97-image.png

       
       

      第 3 步 - 用墙阻挡化身

      现在切换回“化身”角色,并插入这两个积木。他们将发送“添加围墙”消息,并让在“围墙”角色中创建的任何物体都能阻挡化身的移动。

      093bf8c5-341f-4743-b47e-2859d4d28a8b-image.png
       
      现在如果你再次运行这个项目,你将无法移动头像穿过紫色的墙。

      e4.gif

       
       

      第 4 步 - 使紫色围墙透明

      现在让我们切换到“围墙”角色,并将紫色盒子的透明度更改为 100% :

      e6.gif

       
      现在重启程序,化身还是会被那个盒子挡住,但是我们看不到它了。看起来好像化身被建筑物或道路挡住了。

      e7.gif

       
       

      第 5 步 - 添加标记盒子

      现在你知道如何防止化身跑到任何建筑物中了,所以我们只需要在“围墙”角色中添加更多的盒子来遮盖更多的建筑物。因此,现在唯一的问题就是如何找出这些围墙盒子的大小和位置。虽然我们可以通过反复试验找出答案,但如果我们使用“标记”盒子就容易多了。

      首先,让我们转到“化身”角色,暂时把用于添加和控制化身的积木移开,并添加一个新的黄色盒子。

      b1c32956-5702-4ff7-9655-33d04bccaed1-image.png

       
      它应该是这样的:

      ye.gif

       
       

      第 6 步 - 打开鼠标拾取

      接下来,我们要开启鼠标拾取功能,这样我们就可以点击场景中的任意位置来找到它的位置。此外,选择三维动作类别里这 3 个报告积木“选取点的x位置”、“选取点的y位置”和“选取点的z位置”的复选框,以便它们显示在舞台上。当我们点击场景的不同点时,我们会得到这些点的确切 x/y/z 位置。

      e9.gif

       
       

      第 7 步 - 将标记盒子移动到选定点

      为了更容易查看和调整我们选择的点,让我们在每次进行新选择时将标记盒子移动到被点击的位置:

      bc3dddd2-8e57-4740-b74c-c70d6cfc9d44-image.png

       
      你可以尝试点击不同的点来移动标记盒子:

      f1.gif

       
       

      第 8 步 - 使用标记盒子标记街区的对角顶点

      现在我们可以进行一些测量了。基本方法是将标记盒子放置在你需要遮盖的建筑物(或街区)的 2 个对角,并记下它们的 x 和 y 位置。我们将在下一步中使用这些数字来计算围墙盒子的大小和位置。

      例如,假设我们想用围墙包住化身面前的整个街区(包含3座建筑)。我们把摄像头拉远,然后移动它以到这个街区的上方。然后点击这个街区的左下角,它的 x 位置是 -1596,y 位置是 437。同样,点击这个街区的右上角,它给出的 x 位置是 2114 ,y 位置是 1422 。

      f4.gif

       
       

      第 9 步 - 计算围墙盒子的大小和位置

      现在让我们切换到“围墙”角色,并更新围墙盒子的大小和位置。

      对于它在 x 方向上的大小,我们可以使用 2 个对角顶点的 x 位置 -1596 和 2114 之间的差值,也就是 3710。同样,盒子在 y 方向上的长度是 437 和 1422 之间的差值, 即 985。

      对于围墙中心的 x 位置,它应该是2个对角顶点的x位置的平均值:-1596和2114的平均值是259。同样,对于 y 位置,437和1422的平均值是930。

      因此,我们可以将这 4 个新数字放入我们的程序中。出于调试目的,我们可以暂时将盒子的透明度设置回 0。

      8a773d89-b783-4cda-b44f-b03b749f30b6-image.png

       
      现在你应该得到一个正确覆盖这个街区的围墙盒子了:

      f3.gif

       
      请注意,我们不需要将围墙盒子做得太高。只要它比化身的跳跃高度还要高,我们就知道化身不会穿过它。

       
       

      第 10 步 - 添加更多围墙盒子

      对于剩下的工作,你只需使用相同的测量和计算方法在“围墙”角色中添加更多的积木。如果每个街区需要 1 分钟,那么你将在 20 分钟内完成整个“城市”场景所需要的所有围墙盒子。

      添加所有这些围墙盒子后,将它们重置回完全透明,并删除“化身”角色中处理标记盒子和拾取事件的积木。

       
       

      练习

      如果你想对这种技术进行的更多练习,你也可以尝试将其应用到“城堡”场景中。另外,可以尝试使用不同形状的围墙,例如圆柱形。

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