三维 - 避免化身穿过模型(难度:4)
-
介绍
当你使用预定义的三维场景(例如“城市”或“城堡”)时,一个常见问题是玩家的化身可能会穿过建筑物或其他模型的墙壁。
在本教程中,你将学习如何防止这种情况发生。
第 1 步 - 改编起始项目
我已经为你准备了一个起始项目。它先加载“城市”场景,添加化身,然后根据按键事件移动/转动头像。请打开此项目,并将其改编为你自己的副本。
https://play.creaticode.cn/projects/9d51880b955f25492e346ce8
第 2 步 - 添加围墙角色
为了防止化身穿过物体,最简单的方法是用一个简单的形状(例如盒子或圆柱体)来掩盖那个物体,然后让这个新的形状阻挡住化身的行动。
首先,创建一个名为“围墙”的新角色,并添加以下积木以在化身前面创建一个大盒子:
当你单独点击这 3 个积木来运行它们时,我们就能看到这个新的紫色的墙了:
第 3 步 - 用墙阻挡化身
现在切换回“化身”角色,并插入这两个积木。他们将发送“添加围墙”消息,并让在“围墙”角色中创建的任何物体都能阻挡化身的移动。
现在如果你再次运行这个项目,你将无法移动头像穿过紫色的墙。
第 4 步 - 使紫色围墙透明
现在让我们切换到“围墙”角色,并将紫色盒子的透明度更改为 100% :
现在重启程序,化身还是会被那个盒子挡住,但是我们看不到它了。看起来好像化身被建筑物或道路挡住了。
第 5 步 - 添加标记盒子
现在你知道如何防止化身跑到任何建筑物中了,所以我们只需要在“围墙”角色中添加更多的盒子来遮盖更多的建筑物。因此,现在唯一的问题就是如何找出这些围墙盒子的大小和位置。虽然我们可以通过反复试验找出答案,但如果我们使用“标记”盒子就容易多了。
首先,让我们转到“化身”角色,暂时把用于添加和控制化身的积木移开,并添加一个新的黄色盒子。
它应该是这样的:
第 6 步 - 打开鼠标拾取
接下来,我们要开启鼠标拾取功能,这样我们就可以点击场景中的任意位置来找到它的位置。此外,选择三维动作类别里这 3 个报告积木“选取点的x位置”、“选取点的y位置”和“选取点的z位置”的复选框,以便它们显示在舞台上。当我们点击场景的不同点时,我们会得到这些点的确切 x/y/z 位置。
第 7 步 - 将标记盒子移动到选定点
为了更容易查看和调整我们选择的点,让我们在每次进行新选择时将标记盒子移动到被点击的位置:
你可以尝试点击不同的点来移动标记盒子:
第 8 步 - 使用标记盒子标记街区的对角顶点
现在我们可以进行一些测量了。基本方法是将标记盒子放置在你需要遮盖的建筑物(或街区)的 2 个对角,并记下它们的 x 和 y 位置。我们将在下一步中使用这些数字来计算围墙盒子的大小和位置。
例如,假设我们想用围墙包住化身面前的整个街区(包含3座建筑)。我们把摄像头拉远,然后移动它以到这个街区的上方。然后点击这个街区的左下角,它的 x 位置是 -1596,y 位置是 437。同样,点击这个街区的右上角,它给出的 x 位置是 2114 ,y 位置是 1422 。
第 9 步 - 计算围墙盒子的大小和位置
现在让我们切换到“围墙”角色,并更新围墙盒子的大小和位置。
对于它在 x 方向上的大小,我们可以使用 2 个对角顶点的 x 位置 -1596 和 2114 之间的差值,也就是 3710。同样,盒子在 y 方向上的长度是 437 和 1422 之间的差值, 即 985。
对于围墙中心的 x 位置,它应该是2个对角顶点的x位置的平均值:-1596和2114的平均值是259。同样,对于 y 位置,437和1422的平均值是930。
因此,我们可以将这 4 个新数字放入我们的程序中。出于调试目的,我们可以暂时将盒子的透明度设置回 0。
现在你应该得到一个正确覆盖这个街区的围墙盒子了:
请注意,我们不需要将围墙盒子做得太高。只要它比化身的跳跃高度还要高,我们就知道化身不会穿过它。
第 10 步 - 添加更多围墙盒子
对于剩下的工作,你只需使用相同的测量和计算方法在“围墙”角色中添加更多的积木。如果每个街区需要 1 分钟,那么你将在 20 分钟内完成整个“城市”场景所需要的所有围墙盒子。
添加所有这些围墙盒子后,将它们重置回完全透明,并删除“化身”角色中处理标记盒子和拾取事件的积木。
练习
如果你想对这种技术进行的更多练习,你也可以尝试将其应用到“城堡”场景中。另外,可以尝试使用不同形状的围墙,例如圆柱形。