<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Cocos Creator 3.0 3D 模型換裝及組合動畫實現(xiàn)方案

          共 7280字,需瀏覽 15分鐘

           ·

          2021-09-11 13:16

          >>PIE


          引擎選擇


          在游戲引擎的選擇上,我們之所以確定使用 Cocos Creator 3.0,主要是因為其以下幾個優(yōu)勢:

          • 2D & 3D 融合:Cocos Creator 3.0 實現(xiàn)游戲 2D 與 3D 能力的融合,在一定程度上已基本滿足 PIE 所需要的 2D UI 及 3D 人物的游戲支持。

          • 開源:Cocos 的一大特征就是開源且免費,既能夠大幅度降低項目初期的試錯成本,也提供給游戲引擎定制的能力。PIE 的實際業(yè)務場景相對比較復雜,因此能夠根據(jù)業(yè)務需求對引擎進行特定的調(diào)整對于技術(shù)團隊而言尤其重要。

          • 良好的生態(tài):Cocos 的技術(shù)生態(tài)相對來說完善,具備獨立的技術(shù)論壇且活躍度足夠,包括官方文檔、各類博客在內(nèi)的學習資源豐富,開發(fā)者能夠快速入門并實踐。同時官方對于 Cocos 也具備穩(wěn)定的迭代周期,能夠保證引入項目之后的穩(wěn)定性。


          3D 模型


          目前 Cocos Creator 支持 FBX  glTF 兩種格式的模型文件,通過對比,我們選擇了 FBX 模型文件來實現(xiàn)我們的功能。對 FBX 模型的使用方法不太熟悉的同學,可以先移步 Cocos Creator 模型資源官方文檔進行了解,上面介紹得比較詳細。鏈接地址:

          http://docs.cocos.com/creator/3.0/manual/zh/asset/mesh.html


          FBX 模型結(jié)構(gòu)


          FBX 資源文件


          包含紋理貼圖、材質(zhì)球、Mesh、骨骼動畫和骨骼信息:


          FBX 文件生成的預制體


          預制體節(jié)點結(jié)構(gòu):


          節(jié)點的組件結(jié)構(gòu):


          從圖中可以看出來,clothes 節(jié)點中 3D 屬性相關(guān)的組件主要是 cc.SkinnedMeshRenderer,這個組件下有 Materials、Mesh 和 Skeleton 三個組件綁定了文件資源中的貼圖,材質(zhì)球和骨骼信息資源。


          問題


          在調(diào)研使用 FBX 模型生成的人物進行換裝和播放多個動作時,遇到了如下幾個問題:

          • 只更換節(jié)點下的 Materials 組件,只能達到變換 clothes 顏色的效果,不能更換 clothes 的樣式。

          • 更換 Mesh 組件,會對整個模型的綁定關(guān)系有影響,整個人物的顯示會出現(xiàn)問題。

          • 人物模型在播放第二個動作時,會將第一個動作先停掉,直接開始播放第二個動作,不能同時播放多個動作。


          解決方案


          思路


          最核心的思路就是拆分,本來是用一個模型組成的節(jié)點,拆分成多個模型,每個需要替換的部位都獨立拆分成一個模型,所有部位模型的骨骼信息相同,只保留自身部位的材質(zhì),然后控制好層級,就能達到和使用一個模型同樣的效果。


          >>拆分前

          >>拆分后


          上面是拆分前和拆分后人物在 Creator 中的節(jié)點結(jié)構(gòu)。


          拆分前人物形象只由一個 FBX 文件生成,root 節(jié)點下是各個部位的節(jié)點。


          拆分后由一個空節(jié)點 user_famale 作為根節(jié)點,根節(jié)點下的 hair-root,cloth-root,body-root 和 face-root 是拆分后各部位的父節(jié)點的占位節(jié)點,每個父節(jié)點下會添加一個的 FBX 生成的模型節(jié)點,total、hair、cloth、body 和 face 都是由 FBX 模型生成的 prefab 掛載在對應的父節(jié)點上(total-root 也是單獨一個 FBX 生成的預制體,這里保存了這個人物的所有動畫信息)。


          由上面兩種方式實現(xiàn)的 3D 人物,展示效果是一致的,具體如下圖:



          注意事項


          同一人物下的不同部位使用的 FBX 模型的骨骼信息必須是一樣的,比如上面的人物模型,hair-root,cloth-root,body-root 和 face-root 這幾個部位的對應的模型節(jié)點使用的 FBX 模型,需要使用同樣的骨骼信息。


          換裝實現(xiàn)步驟


          • 確定人物結(jié)構(gòu)

          按照換裝需求將人物拆分成不同的部位,比如需要換衣服的,則 cloth 分出一個節(jié)點;需要換發(fā)型的,則 hair 分出一個部位,下圖是實現(xiàn)的例子的拆分圖。


          • 關(guān)鍵代碼

          實現(xiàn)了一個 Role.ts 腳本組件,綁定在上面所說的 Role 節(jié)點上,以下是換裝主要代碼邏輯 changePart 的實現(xiàn):

          import { _decorator, Component, Node, Prefab, instantiate } from 'cc';
          const { ccclass, property } = _decorator;
           
          @ccclass('Role')
          export class Role extends Component {
              //換裝節(jié)點
              @property(Node) totalRoot!: Node
              @property(Node) clothRoot!: Node
              @property(Node) hairRoot!: Node
              @property(Node) faceRoot!: Node
           
              //換裝資源
              @property({ type: [Prefab] }) clothPrefabs: Prefab[] = []
              @property({ type: [Prefab] }) hairPrefabs: Prefab[] = []
              @property({ type: [Prefab] }) facePrefabs: Prefab[] = []
           
              clothIdx = 0
              hairIdx = 0
              faceIdx = 0
           
              start () {
                  // [3]
              }
           
              changePart(partPrefabs: Prefab[], partName: string, partRoot: Node) {
                  //更換部件
                  let partIdx = 0
                  if (partName === 'cloth') {
                      this.clothIdx += 1
                      partIdx = this.clothIdx
                  }
                  if (partName === 'hair') {
                      this.hairIdx += 1
                      partIdx = this.hairIdx
                  }
                  if (partName === 'face') {
                      this.faceIdx += 1
                      partIdx = this.faceIdx
                  }
                  const partNode = instantiate(partPrefabs[partIdx % partPrefabs.length])
                  partRoot.removeAllChildren()
                  partRoot.addChild(partNode)
          }


          其他


          這種拆分的方式能夠支持多個部位同時播放動畫,但本質(zhì)上沒有解決同一個模型不能同時播放兩個動畫的問題,這里是不同部位的模型節(jié)點同時播放動畫。


          資源大小分析


          這種拆分的方法對資源來說主要是每個部位的模型都需要有一個統(tǒng)一的骨骼信息,但是,如果不拆分,整個 FBX 模型的每個部位也會有自己獨立的骨骼信息,所以拆分的方式和不拆分的方式資源基本一般大。


          效果預覽



          總結(jié)


          • 開始技術(shù)調(diào)研的時候 Creator 3.0 剛發(fā)布,以為不需要拆分,只需要替換節(jié)點下的材質(zhì)和 Mesh 就能實現(xiàn)換裝,踩了一些坑,再進一步探索后才找到這個方案。

          • 這個方案是開發(fā)同學和設(shè)計同學共同研究探索出來,起初對 Cocos Creator 3D 的能力都不太熟悉,非常感謝設(shè)計同學的幫助。

          • Creator 3.0 的發(fā)布后,Cocos 對 3D 方面的支持有了巨大的提升,希望 Cocos 在 3D 方面越做越好。





          「Cocos Star Meetings」上海站周六(9月11日)下午14:00即將在上海閔行利豐廣場-2號樓 WeWork 空間1樓會議室正式開始!大城小胖 x 貝塔,攜手樂府互娛夏凱強、夢求游戲魏軍燕、微貍科技夏羊群、以及我們的老朋友 SuperSuRaccoon 將圍繞游戲開發(fā)和 Cocos 引擎使用帶來一系列技術(shù)干貨。活動限額80人,趕快戳【閱讀原文】或掃描下方二維碼報名吧!



          往期精彩

          瀏覽 97
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产一级片直播 | 先锋影音成人av 翔田千里无码破解 | 二区在线观看 | 欧美性极品少妇精品网站 | 欧美久久久久久久久久久久 |