Unity 3D 人形角色动画(Avatar)||Unity 3D 导航系统||Unity 3D 障碍物

2023-11-10

Unity 3D 人形角色动画(Avatar)

Mecanim 动画系统适合人形角色动画的制作,人形骨架是在游戏中普遍采用的一种骨架结构。。

由于人形骨架在骨骼结构上的相似性,用户可以将动画效果从一个人形骨架映射到另一个人形骨架,从而实现动画重定向功能。

除了极少数情况之外,人物模型均具有相同的基本结构,即头部、躯干、四肢等。

Mecanim 动画系统正是利用这一点来简化骨架绑定和动画控制过程。

创建模型动画的一个基本步骤就是建立一个从 Mecanim 动画系统的简化人形骨架到用户实际提供的骨架的映射,这种映射关系称为 Avatar

创建Avatar

在导入一个角色动画模型之后,可以在 Import Settings 面板中的 Rig 选项下指定角色动画模型的动画类型,包括 LegacyGeneric 以及 Humanoid 3 种模式。

  1. Legacy 与 Generic

Unity 3D 的 Mecanim 动画系统为非人形动画提供了两个选项:Legacy(旧版动画类型)和 Generic(一般动画类型)

旧版动画使用 Unity 4.0 版本文前推出的动画系统。一般动画仍可由 Mecanim 系统导入,但无法使用人形动画的专有功能。

非人形动画的使用方法是:

  • 在 Assets 文件夹中选中模型文件。

  • 在 Inspector 视图中的 Import Settings 属性面板中选择 Rig 标签页

  • 单击 Animation Type 选项右侧的列表框,选择 Generic 或 Legacy 动画类型即可。

  1. Humanoid

要使用 Humanoid(人形动画),单击 Animation Type 右侧的下拉列表,选择 Humanoid,然后单击 Apply 按钮Mecanim 动画系统会自动将用户所提供的骨架结构与系统内部自带的简易骨架进行匹配。

如果匹配成功,Avatar Definition 下的 Configure 复选框会被选中,同时在 Assets 文件夹中,一个 Avatar 子资源会被添加到模型资源中。

配置Avatar

Unity 3D 中的 Avatar 是 Mecanim 动画系统中极为重要的模块,正确地设置 Avatar 非常重要。

不管 Avatar 的自动创建过程是否成功,用户都需要到 Configure Avatar 界面中确认 Avatar 的有效性,即确认用户提供的骨骼结构与 Mecanim 预定义的骨骼结构已经正确地匹配起来,并已经处于 T 形姿态

单击 Configure 按钮后,编辑器会要求保存当前场景,因为在 Configure 模式下,可以看到 Scene 视图(而不是 Game 视图)中显示出当前选中模型的骨骼、肌肉、动画信息以及相关参数。

在这个视图中,实线圆圈表示的是 Avatar 必须匹配的,而虚线圆圈表示的是可选匹配的。

人形动画重定向

在 Mecanim 动画系统中,人形动画的重定向功能是非常强大的,因为这意味着用户只要通过很简单的操作就可以将一组动画应用到各种各样的人形角色上。

由于动画重定向功能只能应用到人形模型上,所以为了保证应用后的动画效果,必须正确地配置Avatar

Unity 3D 导航系统 

过去,游戏开发者必须自己打造寻路系统,特别是在基于节点的寻路系统中,必须手动地在 AI 使用的点之间进行导航,因此基于节点系统的寻路非常烦琐。

Unity 3D 不仅具有导航功能,还使用了导航网格(navigation meshes),这比手动放置节点更有效率而且更流畅。

更重要的是,还可以一键重新计算整个导航网格,彻底摆脱了手动修改导航节点的复杂方法。

1) 设置 NavMesh

NavMesh 的设置方法很简单,在 Hierarchy 视图中选中场景中除了目标和主角以外的游戏对象,在 Inspector 视图中单击 Static 下拉列表,在其中勾选 Navigation Static 即可

2) 烘焙

执行菜单 Window→Navation 命令,打开导航窗口,单击右下角的 Bake(烘焙)按钮即可,烘焙后的场景接下来详细看看 Navigation 面板,它有 Object、Bake、Areas 这 3 个标签页。

其中,Object 标签页如下图所示,该标签页可以设置游戏对象的参数,如下表所示。当选取游戏对象后,可以在此标签页中设置导航相关参数。

参 数 功 能
Navigation Static 勾选后表示该对象参与导航网格的烘焙
Generate OffMeshLinks 勾选后可在导航网格中跳跃(Jump)和下落(Drop)
Navigation Area 导航区域

Bake 标签页如下图所示,是 Navigation 面板最重要的标签页,在该标签页下可以设置导航代理相关参数以及烘焙相关参数,参数说明如下表所示。

参 数 功 能
Agent Radius 设置具有代表性的物体半径,半径越小,生成的网格面积越大
Agent Height 设置具有代表性的物体的高度
Max Slope 设置斜坡的坡度
Step Height 设置台阶高度
Drop Height 设置允许最大的下落距离
Jump Distance 设置允许最大的跳跃距离
Manual Voxel Size 设置是否手动调整烘焙尺寸
Voxel Size 设置烘焙的单元尺寸,控制烘焙的精度
Min Region Area 设置最小区域
Height Mesh 设置当地形有落差时是否生成精确而不是近似的烘焙效果

3) 设置导航代理

导航代理(Navigation Agent)可以理解为去寻路的主体。

在导航网格生成之后,给游戏对象添加了一个 Nav Mesh Agent 组件,如下图所示。

Nav Mesh Agent 面板中各导航代理参数含义如下表所示。

属性分区 参 数 功 能
Agent Size Radius 设置导航代理的半径
Height 设置导航代理的高度
Base Offset 设置圆柱体相对于本地坐标的偏移
Steering Speed 设置最大移动速度
Angular Speed 设置最大角速度
Acceleration 设置最大加速度
Stopping Distance 设置离目标距离还有多远时停止
Auto Braking 激活时,到达目标位置前将减速
Obstacle Avoidance Quality 设置躲避障碍物的质量,如果设置为0则不躲避其他导航 代理
Priority 设置自身的导航优先级,范围是0〜99,值越小,优先级 越大
Path Finding Auto Traverse Off Mesh Link 设置是否采用默认方式经过链接路径
Auto Repath 设置当现有的路径变为无效时是否尝试获取一个新的路径
Area Mask 设置此导航代理可以行走哪些区域类型

实践案例:自动寻路

案例构思

使用 Unity 3D 开发游戏,自动寻路可以有很多种实现方式。A 星寻路是一种比较传统的人工智能算法,在游戏开发中比较常用。

另外,Unity 3D 官方内置的寻路插件 Navmesh 也可以实现自动寻路功能。

本案例旨在通过一个简单的三维场景漫游实现 Navmesh 自动寻路插件的使用。

案例设计

本案例在 Unity 3D 内创建一个简单的三维场景,场景内有各种障碍,通过 Navmesh 插件可以自动寻找到目标位置。

案例实施

步骤 1):新建三维场景,将其命名为 Navigation。其中,胶囊体作为动态移动的对象,球体作为导航的目标

步骤 2):选中场景中所有除了 sphere、cylinder 摄像机以及直线光以外的所有物体,单击 Inspector 面板中右上角的 Navigation Static,使这些物体成为静态物体,并设置成 Navigation Static 类型,如下图所示。 

步骤 3):执行菜单栏中的 Window→Navigation 命令,Navigation 面板

步骤 4):单击该面板右下角的 Bake 按钮,即可生成导航网格

步骤 5):下面就可以让一个胶囊体根据一个导航网格运动到目标 Sphere 位置。执行 Component→Navigation→Nav Mesh Agent 为该胶囊体挂载一个 Nav Mesh Agent

步骤 6):最后写一个脚本就可以实现自动寻路了。创建 C# 脚本,将其命名为 DemoNavigation,脚本如下: 纯文本复制

 
  1. using UnityEngine;
  2. using System.Collections;
  3. public class DemoNavigation:MonoBehaviour{
  4. public Transform target;
  5. void Start(){
  6. if(target!=null){
  7. this.gameObject.GetComponent<NavMeshAgent>().destination=target.position;
  8. }
  9. }
  10. }

步骤 7):脚本新建完成后挂载到胶囊体上,然后将 Sphere 赋予胶囊体的 Navigation 脚本,运行场景,如下图所示,胶囊体会运动到 Sphere 的位置。

Unity 3D 障碍物

Nav Mesh Obstacle) 一般来说,不可攀爬的 Nav Mesh 都被视为障碍物(Nav Mesh Obstacle),也可以直接将物体设为障碍物,即可以为游戏对象添加 Nav Mesh Obstacle 组件。

有别于普通的 Nav Mesh,Nav Mesh Obstacle 是一种不需要烘焙的障碍物,形状可以选择为立方体或胶囊体。

实践案例:障碍物绕行

案例构思

在自动寻路过程中,往往会遇到障碍物,在寻路过程中遇到障碍物要怎样解决呢?

Unity 官方内置的寻路插件 Navmesh 完美地解决了这个问题。

本案例通过一个简单的有障碍的场景,实现自动寻路中障碍物绕行功能。

案例设计

本案例在 Unity 3D 内创建一个有障碍的场景,场景内有一个 Cube 用来充当障碍物,通过 Navmesh 插件实现主角遇到障碍物时自动绕行效果。 案例实施 步骤 1):执行 File→Save Scene as 命令,将 Navigation 场景另存为 Obstacle 场景,如下图所示。

 步骤 2):执行 GameObject→3D Object→Cube 命令新建一个障碍物,将其放置在主角的前方,并赋予黑色材质,如下图所示。

步骤 3):执行 Component→Navigation→Nav Mesh Obstacle 命令添加 Nav Mesh Obstacle 组件,如下图所示。

步骤 4):单击 Play 按钮进行测试,可以发现主角会绕过黑色立方体并到达终点,效果如下图所示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity 3D 人形角色动画(Avatar)||Unity 3D 导航系统||Unity 3D 障碍物 的相关文章

  • 如何让Three.js全屏显示?

    我想用 Three js 制作游戏 但如何使其全屏显示 我看见本文 http learningthreejs com blog 2011 11 17 lets make a 3d game make it fullscreen 并且我在代码
  • 使用四元数进行 OpenGL 旋转[重复]

    这个问题在这里已经有答案了 因此 我正在编写一个程序 其中对象以 spacesim 方式移动 以便学习如何在 3D 空间中平滑地移动对象 在对欧拉角进行了一番研究之后 它们似乎并不真正适合任意方向上的自由形式 3D 运动 因此我决定继续使用
  • 如何旋转 3D 散点图

    下面的代码使用 scatterplot3d 函数来运行高度 重量和体积的 3D 散点图 其中点是 1 6 之间的类值 角度目前为 45 度 我知道我可以通过改变角度来倾斜绘图 我应该使用什么代码将绘图向左或向右旋转 以便我可以提供绘图的多个
  • 使用 glFrustum 进行离轴投影

    我正在尝试使用 OpenGL 对场景进行离轴投影 并且我阅读了该文档罗伯特 库伊马的离轴投影 http csc lsu edu kooima pdfs gen perspective pdf现在对实际需要做什么有了更好的了解 但仍然有一些部
  • 将点云转换为深度/多通道图像

    我有一个通过使用立体相机扫描平面生成的点云 我已经生成了法线 fpfh 等特征 并使用这些信息我想对点云中的区域进行分类 为了能够使用更传统的 CNN 方法 我想将此点云转换为 opencv 中的多通道图像 我将点云折叠到 XY 平面 并与
  • 如何计算逆运动学[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想知道如何使用逆运动学计算旋转角度 我计划将其用于实时 3D 动画 有人知道一些详细介绍具体解决方案的好文献吗 以下资源调查了逆运动学问题的一些流行
  • 将球体上的 3d 点转换为 UV 坐标

    我在球体上有一个 3d 点 想要将其转换为球体纹理上的 UV 点 有人可以指出正确的方向吗 我可以采用纯数学解决方案 Edit 我目前有这个 它不会返回正确的 UV 坐标 p 是球体上的 3d 点 mesh position 是球体的位置
  • 给定 3D 空间中的一条线,如何找到从它到一点的角度?

    我在 3D 空间中有两组点 我想画一条穿过两组点的中心的线 然后找到从该线到每个点的角度 从那里开始 我将根据两个角度的接近程度来确定两组中的匹配点 我知道如何找到每组点的中心 只需将它们平均在一起 并且我知道如何将它们匹配 甚至考虑到它们
  • 如何在plotly 3D曲面图中标记区域?

    我使用plotly从xyz数据创建3D高程剖面图 它与以下代码配合得很好 import plotly graph objects as go import pandas as pd import numpy as np Read data
  • 3D 空间:使用鼠标指针沿着对象指向的方向

    给定相机面向的方向的 3D 向量以及 3D 空间中 3D 对象的方位 方向向量 如何计算鼠标指针在屏幕上必须遵循的 2 维斜率 以便在视觉上沿着所述物体的方向移动 基本上 我希望能够单击箭头并通过拖动它来使其前后移动 但前提是鼠标指针沿着箭
  • 在 Three.js 中将贝塞尔曲线转换为平面道路

    我试图根据之前计算得到的一些贝塞尔曲线在 Three js 中绘制一条弯曲的道路 问题是我找不到转换曲线序列的方法 一条从上一条曲线的末尾开始 到一个曲面 我有一个 3D 场景 其中有一些汽车 一条用飞机创建的道路 并且绘制了即将到来的道路
  • 光线追踪三角形

    我正在用java编写一个光线追踪器 并且我能够追踪球体 但我相信我追踪三角形的方式有问题 据我了解 这是基本算法 首先确定射线是否与plane三角形已打开 剪裁所有点 使它们与三角形位于同一平面上 因此xy以平面为例 根据沿着新平面向任意方
  • 判断一个点是否在多面体内部

    我试图确定某个特定点是否位于多面体内部 在我当前的实现中 我正在研究的方法采用我们正在寻找多面体面的数组 在本例中为三角形 但稍后可能是其他多边形 的点 我一直在尝试根据这里找到的信息进行工作 http softsurfer com Arc
  • 自动适合衣服的算法?

    想象一下 客户要求您设计一款软件 以满足一些相当粗略的规格 如下所示 1 它将面向时尚行业营销 2 用户将是 设计衣服和东西 的人 可能有一个特定的术语 但我没有想到 3 由于各种原因 能够快速制作原型设计并查看它们在模型上的外观会很有用
  • 3D 数学:根据“向上”和“向上”正交向量计算倾斜(滚动)角度

    我希望这是提出这个问题的正确位置和这个一样 https stackoverflow com questions 3035590 bank angle from up vector and look at vector 但表示为纯数学而不是图
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • 在球体边缘绘制点

    因此 来自 Flash 背景的我对一些简单的 2D 三角函数有很好的理解 在带有 I 圆的二维中 我知道使用给定角度和半径将项目放置在边缘上的数学 x cos a r y sin a r 现在 如果我在 3d 空间中有一个点 我知道球体的半
  • 简单模式7公式/例子?

    我最近发现了利用 SNES 模式 7 的伪 3D 效果 并想尝试在 Godot 引擎中复制它 我尝试在网上查找 但所有内容要么以我无法理解的方式解释 要么以我不知道的编程语言解释 我还需要学习如何旋转该区域 并将精灵作为角色或敌人放入 但我
  • XNA中窗口系统的渲染策略(RenderTarget性能)

    我目前正在从头开始为 XNA 游戏创建一个窗口系统 我主要针对 Windows 进行开发 但谁知道我将来可能支持哪些平台 如果您知道本机 Direct3D 的这一点 请随意回答 因为性能语义应该类似 如果可能 请考虑如果目标平台是 X Bo
  • 如何在不使用 Kinect SDK 函数的情况下将深度空间中的点转换为 Kinect 中的颜色空间?

    我正在做一个增强现实应用程序 将 3D 对象叠加在用户的彩色视频之上 使用 Kinect 1 7 版本 虚拟对象的渲染在 OpenGL 中完成 我已经成功地在深度视频上叠加了 3D 对象 只需使用 NuiSensor h 标头中深度相机的固

随机推荐

  • java鼠标钩子实现

    java本身是没有提供直接访问系统的API方法 查了下资料 要实现鼠标钩子有3种方法 1 使用JNI方法 需要自己写C实现 比较复杂 2 使用swt extension 直接提供了鼠标钩子的实现 但是用它调用其它windows api 没有
  • 用c语言编写出三底模型

    以下是一个用C语言实现三底模型的示例代码 这个程序通过循环遍历输入的股票数据 判断是否出现三底形态 如果是 则输出买入信号 否则输出卖出信号 c语言 include
  • Matlab绘图保存为.fig格式以使用,及.fig文件的加载与数据读取

    1 使用背景 fig文件作为Matlab中的图形文件 其实原始数据是会存储在figure对象中的 其不仅仅只是一张图片 论文写作时 直接将plot运行的结果进行截图粘贴时 图片的分辨率不够导致曲线及图片上的文字模糊 plot运行得到的坐标轴
  • wireshark实战之局域网抓包分析

    Wireshark 它是一款本地监听数据的大杀器 弊端是只能监听本地的数据 有什么办法可以让局域网中的流量都从本机走呢 第一ARP嗅探 劫持网关 再本地抓包 第二交换机镜像端口 在路由或者交换机处设置 复制一份数据到指定机子端口 第三Ap一
  • mysql 设置男女约束

    参考 MySQL数据库创建sex字段设置男女约束 这样写好像会因为汉字而报错 Invalid default value for sex CREATE TABLE t user id INT 11 NOT NULL AUTO INCREME
  • js上传视频获取第一帧截图

    1 获取视频的url 如果是file文件 先转成url file转url方法 function getFileURL file var url null if window createObjectURL undefined basic u
  • Harbor2.1私服的搭建

    Harbor2 1私服的搭建 基础环境的搭建 替换国内yum源 curl o etc yum repos d CentOS Base repo http mirrors aliyun com repo Centos 7 repo yum m
  • CTF-Web小白入门篇超详细——了解CTF-Web基本题型及其解题方法 总结——包含例题的详细题解

    很久之前经过一次比赛的打击 决定不能只是一直盲目的刷基础题 应该加快进度 从各种基本题型开始下手 每种题型都应该去找题目刷一刷 并做好总结 于是我去搜了一些总结的文章 便找到了一篇很好的 觉得看完后有点豁然开朗的感觉 所以本文是在该文章的基
  • Th4.6:模板全特化、偏特化(局部特化)详述

    本小节回顾的知识点分别是模板全特化 偏特化 局部特化 今天总结的知识分为以下4个大点 1 特化与泛化 2 类模板特化 2 1 类模板全特化 a 常规全特化 b 特化模板类的成员函数而不是类模板本身 2 2 类模板偏特化 局部特化 a 从模板
  • IP175G参考资料和引脚图

    特性 5端口嵌入式10 100PHY开关控制器 支持5100BaseTX IP175G 或4100BaseTX 85nm 技术 只需要3 3V单通道 1FX IP175GH 支持1KMAC地址表项 448K位包缓冲存储器 100MPHY支持
  • 【Vue】— nextTick原理

    文章目录 前言 发现问题 异步更新 nextTick源码分析 总结 补充 MutationObserver 前言 在做项目的时候 我们经常会用到nextTick 简单的理解就是它就是一个setTimeout函数 将函数放到异步后去处理 将它
  • 1.4软件测试原则与策略

    一 软件测试原则 1 尽早进行 最好在需求阶段就开始介入 因为最严重的错误不外乎是系统满足不了用户的需求 2 开发人员应该避免检查自己的程序 软件测试应该由第三方人员 测试人员 来负责 3 设计测试用例时应该考虑到合法和不合法的输入 例如
  • WIN10超级终端下载链接及使用教程

    地址见文末 1 直接运行 随便命名 2选择连接的COM口 3 选择对应的波特率 我的是115200 数据流控制选择无 4点击应用 给开发板上电即可 链接一 https pan baidu com s 1iDf16H8BsZ53lOVqmQO
  • Java将svg转化成png_java – 如何将SVG转换成PNG

    我尝试将svg转换成PNG svg文档来自作为输入流的服务器 首先 我将svg流转换成字节数组 byte streamBytes IOUtils toByteArray svgStream 然后使用以下代码将字节转换为OutputStrea
  • Phaser.js教程

    从零到一 用Phaser js写意地开发小游戏 https segmentfault com a 1190000009212221
  • python列表排序方法-python list排序的两种方法及实例讲解

    对List进行排序 Python提供了两个方法 方法1 用List的内建函数list sort进行排序 list sort func None key None reverse False Python实例 1 2 3 4 5 6 gt g
  • 移动网络运营商显示无服务器,无线路由器忽然拨不上号,显示网络运营商远端无响应怎么处理...

    如果是有猫的环境 1 就从猫的哪个接口连接网线到路由WAN口 1 如果不需要拨号就可以上网 看下电脑平时不接路由器是连在猫的哪个接口上网 4 10M选择10M全双工 点击系统工具 重启路由器 超易安装界面的路由器1 祝您工作顺利 如果还是网
  • 人工智能革命:超级智能之路(上)

    这篇文章翻译于Tim Urban大神的 The AI Revolution 的系列文章 下面让我们一起领略一下Tim Urban大神理解的人工智能革命是怎样的吧 文章目录 遥远的未来 即将到来 超级智能之路 人工智能 我们目前在哪里 一个在
  • Echarts重绘报错 The image argument is a canvas element with a width or height of 0

    Echarts重绘报错 原因在于绘制时 未正确获取到画布的宽高 在容器内写入行内样式 即可解决
  • Unity 3D 人形角色动画(Avatar)||Unity 3D 导航系统||Unity 3D 障碍物

    Unity 3D 人形角色动画 Avatar Mecanim 动画系统适合人形角色动画的制作 人形骨架是在游戏中普遍采用的一种骨架结构 由于人形骨架在骨骼结构上的相似性 用户可以将动画效果从一个人形骨架映射到另一个人形骨架 从而实现动画重定