自訂角色

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

您可以匯入自訂網格來創建從 NPC 到動畫船布的一切。我們使用了 3D匯入器 的自訂設置來帶入更多的奇異性自訂角色,例如神秘的黑洞生物和友好但未意識到的服務機器人。

以下部分討論我們如何使用 扭曲和皮膚 , PBR (表面外觀) , 以及 VFX 來構建我們命名為 "生物" 的更複雜角色。我們希望它發光、散發一些光、有粒子煙霧軌跡,以及涉及扭曲一個骨架的流動動作,以創造出類似真實生物的波浪。

Creature Banner

裝備

當我們正在裝備生物時,我們發現最好將角色模型化為中立姿勢,因為那種姿勢最適合在多個方向彎折。如果我們模型化生物時已經彎曲了它的觸手,那麼如果我們動畫觸手彎曲到相反的方向,它就會導致伸展。以下截圖顯示生物在自然狀態下:

從中立姿勢出發,我們以經濟的方式添加關節,重點關注需要最多運動的區域。越少的關節越好,因為當你脫下角色時,你必須管理它們,當你動畫它們時,你也會有更少的控制。在以前的截圖中,生物看起來有很多關節在中心,但主體只有一個關組合。

其他大多數關節都朝向觸手和下顎。使用觸手,我們想要大量的次要運動,或是分層的運動,來創建一個說服人的效果,即所有運動都是自擁有進行的。然而,觸手的中心質量如此接近,以至於感覺浪費將它們所有的關節制作在性能和努力動畫上。因此,我們反而將中心質量視為單一大型帳篷,其尖端離開了中心質量。

Creature Front, Maya

我們發現以下指引很有用,因此角色網格會正確地匯入 Studio:

  • 個別的關節和骨頭必須擁有獨特的名稱。
  • 網格不得與節點和骨頭具有相同名稱。
  • 網格在脫皮/綁定之前不應有變形;換言之,變形應為 0 並且縮放應為 1。
  • 網格正常應該面向外部(模型不應該從內向外看)。
  • 骨架不應有任何比例因子;所有關節應為 [1、1、1]。

外觀

當我們完成生物的骨架時,下一步是要脫掉網格。外觀可能是一項艱巨的任務,因此為了使事情變得輕鬆,最好熟悉您 DCC 應用程式的不同初始外觀設定,以便找到您喜歡的外觀。因為這是一個有機角色,我們為它塗上了大量的脫落在每個節點和重疊之間。這邊,彎曲感覺平滑而不鋒利。以下截圖分別顯示不良的皮膚和光滑的皮膚:

不好的皮膚
>

平滑皮膚
>

我們發現以下指引產生了最佳的蒙皮效果:

  • 外觀影響(即移動時會影響模型的一部分)應該是每個vertex最多4個影響。
  • 聯合和網格名稱需要獨一無二,既內部獨一無二,又相對獨一無二。
  • 你想要匯入 Studio 的任何聯結必須對模型的蒙皮有一些影響,否則引擎不會匯入它。當可能的時候,將你的模型置於原始或「綁定」姿勢。

將網格匯入工作室

將自訂角色匯入工作室是過程中最令人興奮的部分之一,因為您可以在建造立的體驗中查看自己的創作!

要將網格匯入工作室:

  1. 從 DCC 應用程式匯出角色,並確保以追蹤中事項:

    • 所有正常、比例和名稱都正確。
    • 角色擁有所有關節和骨骼階層以及所有網格。
    • 網格的每個網格部分的三角形數量都小於 10,000 個。
    • 網格總尺寸不超過任何軸的 2000 單位。
    • 請參閱網格要求以獲得完整的模型規格列表。
    Creature in DCC Tool
  2. 3D匯入器 中,匯入自定義的 .fbx.obj 文件。

    Creature Imported Into Studio

讓生物發光

一旦生物的模型穩定且不需要進一步匯入 Studio,我們就開始組合表面外觀對象、燈光和視覺效果。我們這麼做是為了確保模型的質量足夠好,以便進行放置和編輯任何一個方面之前。

Glowing Creature Example

我們知道我們希望生物變得黑暗,焦點是眼睛和其「粗魯」的觸手。對比度高的地方往往會引起注意,因此擁有幾個強烈的地方可以確保觀眾知道要專注於什麼。工作室支持自發光的螢光材料,因此我們在早期就將眼睛分開,讓它們與其他角色的材料獨立。我們對觸手做了類似的操作,因此只有它們的尖端會發光。

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 更新功能。

    本地腳本

    -- 將此片段添加到現有的本地腳本,使用 PreSimulation
    -- 連線
    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觸角」,我們也使用了透明在 SurfaceAppearance 與那些部分融合。

    Illumination Example

    我們發現創建表面外觀紋理地圖時,遵循這些指引有助於提高效率:

    • 請確保您的地圖不大於 1024×1024。
    • 您的綠色通道可能需要翻轉,取決於您在應用程式中工作的應用程式。

動畫生物

動畫非常主觀,具有個人風格。選項包括動作捕擷取、在您的 DCC 應用程式中手動「鍵框」動畫或使用 Studio 的強大動畫編輯器。

如我們之前提到的,我們想確保液體運動和足夠的肢體數量,同時還有足夠的肢體,因此生物動畫感覺自然且「分層」。分層也稱為次要運動,是你在日常生活中看到的一種現象 — 當你伸出手臂時,每個肢體都會對初始動力從上臂反應,而身體中的每個肢體都不會同時移動或休息。

我們使用這個技巧來動畫生物覺得像肢體在它的身體驅動的運動反應一樣,如下所示:

Creature Animation Example

如果使用外部的 DCC 應用程式進行動畫,我們發現以下指南最適合:

  • 將框架速率設為至少 30 FPS。
  • 使用與您申請相同角色創建您的動畫。
  • 將您的動畫資料匯出為獨立的 .fbx 文件。

因為我們在 Studio 之外動畫角色,所以我們需要使用動畫編輯器來匯入動畫檔案 .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