Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • CreatiCode
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo

CreatiCode Scratch Forum

  1. CreatiCode Forum
  2. 知识库
  3. 小教程
  4. 三维 - 避免化身穿过模型(难度:4)

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

Scheduled Pinned Locked Moved 小教程
1 Posts 1 Posters 890 Views
  • 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.
  • CreatiCodeI Offline
    CreatiCodeI Offline
    CreatiCode
    wrote on last edited by admin
    #1

    介绍

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

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

     
     

    第 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
    0

    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
    Reply
    • Reply as topic
    Log in to reply
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes


    • Login

    • Don't have an account? Register

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • CreatiCode