- 用户指南
- 资源商店 (Asset Store)
- 资源服务器 (Asset Server)(仅限团队许可证)
- 缓存服务器(仅限团队许可证)
- 幕后场景
- 创建游戏
- 运行时实例化预设 (Prefabs)
- 变换 (Transforms)
- 物理
- 添加随机的游戏元素
- 粒子系统(Particle Systems)
- Mecanim 动画系统
- 旧动画系统
- 导航网格 (Navmesh) 和寻路 (Pathfinding)(仅限专业版 (Pro))
- Sound (音频侦听器)
- 游戏界面元素
- 多玩家联网游戏
- iOS 开发入门
- Android 开发入门
- Blackberry 10 开发入门
- Metro:入门指南
- 本地客户端开发入门
- FAQ
- Advanced
- Vector Cookbook
- 资源包(仅限专业版)
- Graphics Features
- 资源数据库 (AssetDatabase)
- 构建播放器管道
- 分析器(仅限专业版)
- 光照贴图快速入门
- 遮挡剔除(仅限专业版)
- 相机使用技巧
- 运行时加载资源
- 通过脚本修改源资源
- 用程序生成网格几何体
- 富文本
- 在 Unity 工程 (Project) 中使用 Mono DLL
- 事件函数的执行顺序
- 移动优化实用指南
- Unity XCode 工程结构
- 优化图形性能
- 减少文件大小
- 理解自动内存管理
- 平台依赖编译
- 泛型函数
- 调试
- 插件(专业版/移动版特有功能)
- 文本场景文件格式(仅限专业版)
- 流媒体资源
- 启动时运行编辑器脚本代码
- 网络模拟
- VisualStudio C 集成
- 分析
- 检查更新
- 安装多版本 Unity
- 故障排除
- Unity 中的阴影
- Unity 中的 IME
- 对集成显卡进行优化
- 网络播放器 (Web Player) 部署
- 使用网络播放器中的信任链系统
反向动力学 (Inverse Kinematics)(仅限专业版 (Pro))
大多数动画通过旋转调整骨架中关节的角度为预定值来制作。子关节的位置根据其父关节的旋转而改变,因此,关节链的端点由其所包含的单个关节的角度和相对位置决定。这种构成骨架的方法称为正向动力学。
因此,从相反的角度查看构成关节的任务通常十分有用 – 在空间中给出一个选择的位置,逆向操作,找到一种定向关节的有效方式,这样端点就落在该位置。想要角色在用户选择的某一点触摸一个物体或者将角色双脚稳稳地固定在不平坦的表面上时,这种方式非常有效。这种方式称为反向动力学 (Inverse Kinematics) (IK),支持 Mecanim,可用于任何含有正确配置的 Avatar 的类人角色。
要为角色设置IK,通常需要拥有与角色互动的场景四周的物体,然后通过脚本设置 IK,特别是通过此类动画器 (Animator) 功能: SetIKPositionWeight、 SetIKRotationWeight、 SetIKPosition、 SetIKRotation、 SetLookAtPosition、 bodyPosition、 bodyRotation
在上图中,我们展示了一个角色正抓住一个圆柱形物体。我们如何才能做到这一点?
我们先从一个拥有有效 Avatar 的角色入手,然后向该角色附加一个实际上处理 IK 的脚本(我们就称它为 IKCtrl):
using UnityEngine; using System; using System.Collections; [RequireComponent(typeof(Animator))] public class IKCtrl :MonoBehaviour { protected Animator animator; public bool ikActive = false; public Transform rightHandObj = null; void Start () { animator = GetComponent<Animator>(); } //a callback for calculating IK void OnAnimatorIK() { if(animator) { //if the IK is active, set the position and rotation directly to the goal. if(ikActive) { //weight = 1.0 for the right hand means position and rotation will be at the IK goal (the place the character wants to grab) animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1.0f); animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1.0f); //set the position and the rotation of the right hand where the external object is if(rightHandObj != null) { animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position); animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation); } } //if the IK is not active, set the position and rotation of the hand back to the original position else { animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0); animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0); } } } }
由于我们不打算让角色用手抓住整个物体,我们在圆柱体上放置了一个手抓的球体,并相应转动该球体。
该球体然后被列为 IKCtrl 脚本的“右手对象 (Right Hand Obj)” 属性
点击 IKActive 复选框,观察角色抓取、松开物体的过程
(返回 Mecanim 简介)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论