自定义角色

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

您可以导入自定义网格来创建从 NPC 到动画船布的一切。我们使用了 3D 导入器 的自定义设置来引入更多奇异的自定义角色,例如神秘的黑洞生物和友好但未意识到的服务机器人。

以下部分讨论了我们如何使用 扭曲和皮肤 , PBR (表面外观) , 以及 VFX 来构建我们命名为 "生物" 的更复杂角色。我们希望它发光,发出一些光,有粒子烟雾的踪迹,以及涉及皮肤扭曲足以产生说服力的触角的液体运动。

Creature Banner

装备

当我们在装备生物时,我们发现最好将角色模型化为中立姿势,因为那个姿势最适合在多个方向弯曲。如果我们模型化了生物的触手已经弯曲,那么如果我们动画了触手弯曲反向,它将导致伸展。以下截图显示了生物在自然状态下:

从中立姿态,我们以经济的方式添加了关节,专注于需要移动最多的区域。越少的连接越好,因为当你皮肤你的角色时,你必须管理它们,当你动画它们时,你将拥有更少的控制权。在以前的截图中,生物看起来像中心有很多关节,但主体只有一个接头。

其他大多数关节都朝向触手和下颌。使用触手,我们想要大量的次要运动,或是分层的运动,来创建一个说服人的效果,即使它们都是独拥有移动。然而,触手的中心质量如此接近,以至于感觉浪费了为它们所有的人制作关节,既在性能上,又在动画上。因此,我们反而将中心质量视为单个较大的触角,其末端离开了中心质量。

Creature Front, Maya

我们发现以下指南很有用,因此角色网格导入到 Studio 时无误:

  • 个人关节和骨骼必须有独特名称。
  • 网格不能与关节和骨头拥有相同的名称。
  • 网格在裁剪/绑定之前不应有变形;换言之,变形应为 0 且缩放应为 1。
  • 网格正常应面向外部(模型不应从内向外看)。
  • 骨架不应有任何缩放因子;所有关节应为 [1, 1, 1]。

皮肤

当我们完成生物的骨架时,下一步是要皮肤网格。皮肤可能是一项艰巨的任务,因此为了让事情更轻松,最好熟悉您 DCC 应用程序的不同初始皮肤设置,以便找到您喜欢的皮肤。由于这是一个有机角色,我们在每个节点和之间的重叠上都加了大量的衰减。这样,弯曲感觉平滑而不锋利。以下截图分别显示了粗略皮肤和光滑皮肤:

差劲的皮肤
光滑皮肤

我们发现以下指南产生了最好的蒙皮效果:

  • 皮肤影响(即它们在移动时影响模型的一部分)应为每个vertex最多 4 个影响。
  • 共同和网格名称需要独一无二,既相互之间,又相互之间。
  • 你想要导入工作室的任何关节必须对模型的蒙皮有一定影响,否则引擎不会导入它。每当可能的情况下,将你的模型置于原始或“绑定”姿势。

将网格导入到工作室

将自定义角色导入到工作室是过程中最令人兴奋的部分之一,因为你可以在建造的体验中看到你的创作!

要将网格导入到工作室:

  1. 从 DCC 应用程序中导出角色,并确保以关注中/正在关注内容:

    • 所有正常、缩放和名称都正确。
    • 角色拥有所有关节和骨骼层次以及所有网格。
    • 网格的每个部分都小于 10,000 个三角形。
    • 网格总体积不超过任何轴的 2000 单位。
    • 请参阅网格要求获取完整的模型规格列表。
    Creature in DCC Tool
  2. 3D 导入器 中,导入自定义 .fbx.obj 文件。

    Creature Imported Into Studio

让生物发光

一旦生物的模型稳定且不需要进一步导入工作室,我们就开始组合表面外观对象、灯光和视觉效果。我们这样做是为了确保模型的质量足够好,以便进行放置和编辑任何一个方面之前。

Glowing Creature Example

我们知道我们希望生物是黑色的,焦点是眼睛和其“粗鲁”的触手。对比度高的点倾向于引起注意,因此拥有一些强的点可以确保观察者知道要关注什么。Studio 支持自发光的霓虹材料,因此我们在早期就将眼睛分开,以便它们可以与其他角色的其余部分形成自己的材料。我们为触手做了类似的事情,所以它们只会在它们的尖端发光。

Creature Eyes in Studio

霓虹材料不发出实际光,因此在进行一些测试后,我们添加了单独的部件来控制光的放置和发射方向。这保证了照明以一种方式被引导,以增强眼睛的发光并且也投射自己的光源。

Point Light in Studio

注意到 SpotLights 将视觉效果添加到靠近其他表面或玩家的生物身上。

Creature Light Example

此外,我们还希望生物的触手能发射一些粒子,这样它移动时就会留下一道烟雾踪迹。因为触手很长,将 ParticleEmitter 添加到整个触手会使粒子从整个触手而不是尖端发出。为了应对这一问题,我们使用了位于触角末端附近的小部分,因此我们可以控制粒子的发射尺寸、位置和方向。

Particle Example

让 VFX 跟随角色

皮肤角色的网格位置在生物动画时不会更新,因此我们需要一种方法来确保 VFX、SFX 和灯光都正确地跟随生物。为了实现这一目标,我们创建了一个 VFX 控制器脚本并使用 CollectionService 通知包含 VFX 的部件骨头位置以及跟随它们的方式。

  1. 我们将以下 LocalScript 放置在 StarterPlayerStarterPlayerScripts 中。这实际上运行了 VFX 更新函数。

    本地脚本

    -- 将此片段添加到现有的本地脚本中,可以进行预模拟
    -- 连接
    local RunService = game:GetService("RunService")
    local vfx = require(workspace.VfxUpdateModule)
    RunService.PreSimulation:Connect(vfx.updateVfx)
    模块脚本

    -- 该模块将零件附加到动画中,因此它们随着更新而更新
    -- 动画播放。它是当前限制的解决方案
    -- 与关节和骨头,并不总是必要的。
    --
    -- 前提:
    -- 要被包含,模型需要“AnimatedVfxModel”标签和一个文件夹
    -- 与动画同步的所有部分。每个部分都需要
    -- 一个名为“附加骨名称”的属性,指向附加骨的名称
    -- 你想要附加到的骨。零件也应该已经在它们的
    -- 与所需骨相对的正确位置。
    --
    -- 使用:
    -- 本地脚本应需要此模块,然后连接
    -- VfxUpdateModule.updateVfx 到 RunService.PreSimulation 事件。
    local VfxUpdateModule = {}
    local CollectionService = game:GetService("CollectionService")
    -- 设置 - 这应该在每个客户端运行一次。
    -- 收集标签的所有模型
    local vfxModels = CollectionService:GetTagged("AnimatedVfxModel")
    local vfxTable = {} -- 我们将存储所有零件和抵消
    -- 为每个模型分配一个表,以容纳所有的 vfx 部分和偏移值
    for _, model in vfxModels do
    vfxTable[model] = {}
    local vfxParts = model:FindFirstChild("VFX"):GetChildren() -- 找到 theVFX 文件夹
    -- 通过属性找到骨头,计算每个部分的偏移量。
    for _,part in vfxParts do
    local name = part:GetAttribute("AttachedBoneName")
    local bone = model:FindFirstChild(name, true)
    if bone then
    local offset = (bone.TransformedWorldCFrame:inverse() * part.CFrame)
    vfxTable[model][part] = {bone, offset}
    else
    warn("Vfx part refers to bone that could not be found.")
    end
    end
    end
    print(vfxTable)
    -- 更新 - 这应该链接到每个客户端的 RunService.PreSimulation
    -- 通过所有模型,然后更新模型上的所有部件匹配骨架。
    function VfxUpdateModule.updateVfx()
    for model, vfxParts in vfxTable do
    for part, bone in vfxParts do
    part.CFrame = bone[1].TransformedWorldCFrame * bone[2]
    end
    end
    end
    return VfxUpdateModule
  2. 我们创建了一个 VFXUpdateModule ModuleScript 来告诉任何标记为适当的对象使用 AnimatedVfxModel 在游戏事件上更新。

  3. 我们使用 动画视觉效果模型 标记了必要的模型组,可从 视图 选项卡访问。使用标签可以让 VFXUpdateModule 知道哪个对象作为第一个 VFX 子对象寻找,并应用更新。

    VFX In Studio Example
  4. 最后,我们添加了 附加骨名称 自定义属性到我们想要动画的部分,并添加了我们想要跟关注的关节的准确名称。

纹理生物

接下来,我们设置了 PBR(物理基础渲染)纹理地图。这些强大的比图给生物带来各种闪亮和表面变化,让它看起来像有很多小坑和缺陷。这个视觉效果可以帮助卖出生物在接近玩家时的外观。

Creature Texturing Comparison

这是我们如何创建表面外观纹理地图的方法:

  1. 这个角色的纹理地图都放在每张地图上的一个“单片”上。这使生物更高效,意味着我们必须处理更少的纹理地图或 SurfaceAppearance 对象。

  2. 对于需要发光或自发光的区域,例如“grabby tentacles”,我们也使用了透明在 SurfaceAppearance 与那些部分融合。

    Illumination Example

    我们发现,在创建表面外观纹理地图时,遵循这些指导方针很有用:

    • 确保您的地图不大于 1024×1024。
    • 您的绿色通道可能需要根据您工作的应用程序进行翻转。

动画生物

动画非常主观,具有个人风格。选项包括运动捕文本捕捉、在您的 DCC 应用程序中手动“键框”动画或使用 Studio 的强大动画编辑器。

正如我们之前提到的,我们想确保我们有足够的关节为流体运动以及足够的肢体,因此生物的动画感觉自然且“分层”。层叠也被称为次要运动,它是你在日常生活中看到的一件事——当你把手臂扔出去时,每个关节都会反应于上臂的初始冲动,而你身体中的每个关节都不会同时移动或休息。

我们使用了这种技巧来动画生物,让它感觉像是它的身体驱动的运动反应了肢体:

Creature Animation Example

如果使用外部 DCC 应用程序进行动画,我们发现以下指南最适合:

  • 将框架率设置为至少 30 FPS。
  • 使用与你要应用的角色相同的角色创建你的动画。
  • 将您的动画数据导出为单独的 .fbx 文件。

因为我们在工作室之外动画了角色,所以我们需要使用动画编辑器导入动画文件.fbx。编辑器允许您选择具有关节或马达的任何虚拟形象,并通过时间线上的点驱动它们。

要导入动画:

  1. 在工具栏的 虚拟形象选项卡 中,打开 动画编辑器

  2. 选择您想在 Roblox 中动画的装配角色。角色应与您在外部 DCC 应用程序中装配的角色相同。

  3. 点击编辑器窗口的左上角的 按钮,选择 从FBX动画导入 ,然后找到你导出的 .fbx 动画文件。

    Animation Import Example 2
  4. 当你对你的动画满意时,你可以将其导出以发现动画 ID,然后使用 Roblox 脚本运行它们。例如,你可以将 Script 添加到导入角色的模型组中,并使用以下代码运行动画:

    Animation Script Example

    local animationId = "YOUR_ANIMATION_ID"
    local char = script.Parent
    local animController = char:FindFirstChildWhichIsA("Humanoid") or char:FindFirstChildOfClass("AnimationController")
    local animation = Instance.new("Animation")
    animation.AnimationId = "rbxassetid://" .. tostring(animationId)
    local animTrack = animController:LoadAnimation(animation)
    animTrack:Play(0, 1, 1)

最终结果

经过几次调整颜色、光亮度和一些更多粒子效果以提供给窗口前更强的光环效果后,这是空间站中的最终结果!

Final Creature Rendering