效果

目标!画出蒙皮动画的骨架。

视频

https://www.bilibili.com/video/BV1pM411m7Yw

PPT

https://zfxdvouj61.feishu.cn/file/boxcnwgESO6zdQetO7oNhKboNsd
以下为PPT文字稿,建议还是看视频

讲讲自己对蒙皮骨骼动画的理解,并在 Cocos Creator 3.6 中绘制出骨架~希望对大家有帮助~

这是我们今天实现效果,在 Cocos Creator 中把骨架画出来,图中绿色的线就是绘制的骨架

在开始之前,我们介绍一下如何导入模型?长按3d资源拖入到资源管理器中.

让我们看看gltf资源包括什么(介绍最下方),mesh 网格,texture 贴图,material 材质,animation 动画 ,skeleton 骨架数据。根节点有个动画组件,cips是动画列表,default clip 是默认动画, play on load 是加载后自动播放。Sockets 是挂点系统。启用 useBakedAnimation 时会使用预烘焙骨骼动画系统(所有动画数据都会按照指定帧率提前预采样、烘焙到全局复用的骨骼动画贴图合集上),禁用 useBakedAnimation 后会使用实时计算骨骼动画系统(动画数据会输出到场景的骨骼节点树中)。

mesh 就是网格,由三角形拼成的网格,可以看到这个网格有7325个顶点,和11186个三角形,minpos 就是包围盒最小值, maxpos 就是包围盒最大的值

关于网格,这张图会看的清楚一点,由多个三角形构成。

材质就像是给刚才的网格穿上的衣服,贴图就像是衣服上好看的图案

可以在这个模型上看到贴图的部件,是通过纹理映射的方式显示这张图片。例如手套映射到贴图的右下角。

还有一种常见的贴图叫法线贴图,简单来说这张贴图可以让模型更有凹凸感

骨架,就像是人体的骨骼一样。蒙皮,蒙的就是网格相对于骨架的位置

事实上,在实现中并没有骨架,并不是一条一条的线,而是一个一个的点。叫做关节或者说骨骼点。蒙皮就是根据根据这个点,计算网格点的位置。

选中场景中的3d模型,点击动画编辑器,进入动画编辑模式。可以预览动画效果。

点击播放按钮就可以播放了。可以看到右上角的属性面板并没有变化,那么这个动画是移动的是什么呢?

前面几个点的 postion rotation 并没有发生变化

可以看到后面几个点位移旋转发生了变化,这些点就是骨骼(关节)。蒙皮动画的本质是改变骨骼的节点信息,网格再根据骨骼点实时计算网格的形状。

材质,网格,骨架是由蒙皮网格渲染器(skinmeshrenderer) 组织在一起。

总结一下,一个3d资源拖入到场景中的结构是怎么样的。根节点有一个骨骼动画组件。他的儿子中包含了骨骼蒙皮渲染组件(将材质,网格,骨骼组织在一起)。还有种儿子是骨骼(关节),蒙皮动画实际上是对这些骨骼点进去移动旋转,然后网格再根据这个点的信息,再计算网格的形状(蒙皮)。

了解了上面的知识,我们现在开始实战吧。我们的目标是画出这个骨骼!

我们该如何绘制骨架呢?只要在这些骨骼点和其父节点画一条线就行了。

我们要画的是这些骨骼,这些骨骼的数据应该在哪里获取呢?是的,就在骨架数据中获取,骨架数据就是在蒙皮网格渲染器中。

model 就是对应这初始节点。先拿到蒙皮网格渲染器的组件,找到骨架数据,再找到骨骼点,并做上标记。最后再递归按深度优先的顺序把所有骨骼点保存起来。这个bones就是所有的关节点了。

那么我们应该用什么组件画骨架呢?这里用了 Cocos Creator 的线段组件。对有爸爸的骨骼们创建线段组件。把每个骨骼和他爸爸的世界坐标告诉线段组件,就能画出骨架了。

还需要注意的是,要想把这东西画到最前!需做到 透 深 优!透是指透明渲染队列。在 Cocos Creator 默认的前向渲染管线中,是先渲染不透明队列再渲染透明队列。选择透明队列就可以再更后的阶段绘制。深 指的是 深度读写都关闭,深度写是影响之后东西的绘画,深度读是只被之前绘画的深度影响,当然我们都不想影响就都关了。优 是只 优先级,要在最后画!

最后,介绍一下这个脚本怎么使用。将这个脚本拖入到场景中,再挂上场景中的3D模型就可以了。

小结~ 1.动画驱动骨骼 2.骨骼决定网格 3.画最前,透深优

代码

import { _decorator, Component, Node, SkinnedMeshRenderer, Line, SkeletalAnimation, Color, gfx, GradientRange, log } from 'cc';
const { ccclass, property } = _decorator;@ccclass('SkeletonHelper')
export class SkeletonHelper extends Component {@property(Node)model: Node = null!private bones: Node[] = []private lines: Line[] = []start() {log('欢迎关注微信公众号【白玉无冰】 https://mp.weixin.qq.com/s/-I6I6nG2Hnk6d1zqR-Gu2g')const skeletalAnimation = this.model.getComponent(SkeletalAnimation)skeletalAnimation.useBakedAnimation = false; // maybe todoconst skinMeshRds = this.model.getComponentsInChildren(SkinnedMeshRenderer)skinMeshRds.forEach(element => {const skinningRoot = element.skinningRootelement.skeleton.joints.forEach((v) => {const node = skinningRoot.getChildByPath(v)node['isBone'] = true;})});const bones = this.getBoneList(this.model);this.bones = bones;for (let i = 0; i < bones.length; i++) {const bone = bones[i];if (bone.parent && bone.parent['isBone']) {const line = this.addComponent(Line);const state = { priority: 255, depthStencilState: new gfx.DepthStencilState(false, false) }// @ts-ignoreline._materialInstance.overridePipelineStates(state)line.worldSpace = true;line.width.constant = 0.01;line.color.mode = GradientRange.Mode.TwoColors //there are some bugs in cocos creator // engine\cocos\particle\models\line-model.ts   // engine\cocos\particle\animator\gradient.tsline.color.colorMin = Color.BLUEline.color.colorMax = Color.GREENline.positions = [bone.worldPosition, bone.parent.worldPosition] as never[]this.lines.push(line)}}}showSkeleton(show: boolean) {this.lines.forEach(l => l.enabled = show)}private getBoneList(object: Node) {const boneList: Node[] = [];if (object['isBone']) {boneList.push(object);}for (let i = 0; i < object.children.length; i++) {boneList.push.apply(boneList, this.getBoneList(object.children[i]));}return boneList;}lateUpdate(deltaTime: number) {let lineIndex = 0;for (let i = 0; i < this.bones.length; i++) {const bone = this.bones[i];if (bone.parent && bone.parent['isBone']) {const line = this.lines[lineIndex++];line.positions = [bone.worldPosition, bone.parent.worldPosition] as never[]}}}
}

视频

“点赞“ ”在看” 鼓励一下

【3D游戏基础】蒙皮骨骼动画与骨架相关推荐

  1. 蒙皮骨骼动画 unity_在Unity中沿航路点设置蒙皮网格动画

    蒙皮骨骼动画 unity This post is a guide to importing a skinned mesh with a looping animation and then anim ...

  2. 3D游戏基础 Direct3D(一) D3D基本概念及渲染流水线简介

    终于,在前3篇文章里面聊完了基本的空间几何概念,现在可以说到实际的东西了. 一直以来,都希望用最浅显易懂的语言,把我对3D的一些了解记录下来,作为一个系列的科普文章,供大家消遣时看看. 大约十年以前, ...

  3. 麒麟子Cocos Creator 3D研究笔记七:骨骼动画上的挂接点

    注意手中的大棒 每个人心中有一个属于自己的游戏世界,麒麟子也不例外.拿到Cocos Creator 3D第一时间,就想撸点人物角色相关的.像换装.角色控制.血条.武器挂接之类的. 然而当我按照套路把角 ...

  4. 3D游戏(7)——模型与动画

    文章目录 1.智能巡逻兵 游戏设计要求 程序设计要求 友善提示1:生成 3~5个边的凸多边型 友善提示2:参考以前博客,给出自己新玩法 游戏程序设计 1.智能巡逻兵 游戏设计要求 创建一个地图和若干巡 ...

  5. 3D游戏设计——模型与动画

    HW7 1. 智能巡逻兵 游戏设计要求: 创建一个地图和若干巡逻兵(使用动画): 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址.即每次确定下一个目标位置,用自己当前位置为原点计算: 巡逻兵 ...

  6. 3D游戏设计-模型与动画

    Unity 第七次作业 智能巡逻兵 运行截图 视频网址 具体模型 发布订阅模式 源代码 player_movement.cs UI.cs MonsterMove.cs Judge.cs 智能巡逻兵 提 ...

  7. Android 3D游戏基础介绍

    首先开始介绍OpenGL的术语. 顶点Vertex 顶点是3D空间中的一个点,也是许多对象的基础元素.在OpenGL中你可以生命少至二维坐标(X,Y),多至四维(X,Y,Z,W). w轴是可选的,默认 ...

  8. 游戏引擎的动画系统及骨骼动画原理

    一.<游戏引擎架构>动画系统 动画的几种分类 <游戏引擎架构>中简单介绍了几种动画种类.用途以及优劣,在<计算机动画算法与技术>中详细介绍了各种动画的算法原理: 精 ...

  9. 如何学好3D游戏引擎编程《转自3D游戏引擎网》

    此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才能攀登到游戏技术的最高峰         --阿哲VS自己 QQ79134054多希望大家一起交流与 ...

最新文章

  1. android中常见的内存泄漏和解决的方法
  2. Linux内核之于红黑树and AVL树
  3. iPhone开发之 ARC是什么
  4. bs4爬取的时候有两个标签相同_4.4 爬虫中的bs4数据爬取步骤
  5. java文件批量重命名6,批量重命名文件DOS脚本
  6. python程序如何封装成接口_python接口自动化如何封装获取常量的类
  7. Android的debug.keystore拒绝访问导致的生成异常及解决方案
  8. 安装redis出现cc adlist.o /bin/sh:1:cc:not found
  9. 多对一(一对多)的双向关联
  10. 通过JS原型定义字符串格式化方法
  11. C#综合揭秘——细说多线程(下)
  12. ESP32开发实例(七),WebServer使用
  13. excel选中行变色
  14. VUE提示Gradient has outdated direction syntax
  15. 如何有效的避免图片侵权(100%避免网站图片侵权)
  16. memset函数()详解
  17. 【Spring】Bean生命周期
  18. 新任学校领导的国家简报
  19. Tikhonov 正则化模型用于图片去噪_matlab
  20. Error response from daemon: Container xxx is not running的解决方法

热门文章

  1. python基础学习的书籍
  2. matlab学习——线性规划
  3. PS - 蓝色发光字
  4. UE4材质 制作UV贴图
  5. SkeyeVSS实现监控摄像头进行网页WEB和微信、手机无插件直播点播解决方案
  6. element el-upload 一次上传单张/多张图片(多选)
  7. 【STM32F407】第5章 RTX5操作系统移植(MDK AC6)
  8. Mac苹果电脑怎样安装Python
  9. java描述空间直线_java实验作业类的定义与描述
  10. C语言 实现长整数的相加