UE4中程序驱动的LookAt动画

很多游戏中都有, 就是角色转头+眼镜转动盯着一个目标看, 通常是盯着镜头看用的比较多

UE4里实现这个功能很容易, 直接在AnimGraph里使用LookAt结点就可以了

4个LookAt分别控制脖子, 头, 左眼, 右眼的朝向, 脖子和头的角度比眼睛小, 转动速度也比眼睛慢.



实际项目中用的时候, 有个需求是NPC播放一段动画师做的全身动画后, 再盯住玩家, 然后再播, 再盯, 如此循环. 这种情况下, UE4内置的LookAt功能就出问题了.

在播放完动画突然开启LookAt后, NPC会先看向上一次LookAt结束的位置, 然后再转向目标点, 而不是从当前动画的骨骼朝向转过去. 这样就造成了动画的抖动, 很不和谐.

经过分析FAnimNode_LookAt发现, 这个节点是需要一直开着的, 如果出现运行时的开关(Alpha=0), 会导致节点停止Update. 所以这个节点是没考虑当前骨骼的状态的, 每次都是从上一次的LookAt位置开始进行插值.

本着不直接修改引擎代码的考虑, 怎么解决这个问题呢?

1. 首先, 把FAnimNode_LookAt和相应的UAnimGraphNode_LookAt拷贝一份到工程里, 改个名, 这样就可以对其进行修改了

2. 如果需要从当前骨骼的Transform开始进行插值, 那么就需要在Alpha=0(EvaluateBoneTransform停止执行)时对PreviousTargetLocation进行更新, 而EvaluateBoneTransform是不能override的, 已经被父类声明成了final.

3. 在PreUpdate里取出当前动画的Bone Transform, 计算出一个TargetLocation, 这样在刚开始更新时开始进行插值的初始位置就是骨骼朝向的位置了, 也就没有了看向不相干位置的问题

4. 刚切换时还缺个FadeIn/FadeOut的插值动画, 这个我打log看明明是计算了的, 还需要跟进一下看看看为什么骨骼朝向会直接跳到目标点

时间: 2024-10-11 10:29:39

UE4中程序驱动的LookAt动画的相关文章

文顶顶 iOS开发UI篇—iOS开发中三种简单的动画设置

iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所

iOS开发UI篇—iOS开发中三种简单的动画设置

iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所

UE4中使用数据表(Data Table)

本文依据官方文档数据驱动游戏性元素整理而来. 做过游戏的应该都清楚,如果游戏稍微有点规模,那么使用数据驱动来做游戏一般是必不可少的一步,一般也就是策划通过本表的方式来解决.下面我们来简单说一下UE4中如何使用DataTable来实现数据驱动开发. 顾名思义,数据表就是以有意义且有用的方式将各种相关的数据归类的表格, 其中,数据字段可以是任何有效的 UObject 属性,包括资产引用.在设计师将 CSV 文件导入数据表前,程序员必须创建行容器以指示引擎如何解释数据. 这些数据表包含了列名,这些列名

iOS开发中三种简单的动画设置

iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所有动画提交并生成动

UE4中集成Wiimote

Wiimote 最早在玩Wii的模拟器游戏时候, 就发现其中有关于Wiimote的一些设置, 了解到其实Wii的控制器可以连接到PC上使用. 去年做了Kinect的体感游戏后, 也想了解下Wii的, 所以就淘宝买了Wiimote Plus. 完整的Wiimote有三部分: - Wii手柄(这个集成了motion plus) - Nunchunk(外号"鸡腿") - IR感应条 跟PC通过蓝牙(驱动比较折腾, 我用Toshiba的BlueStack成功), 连接即可, Nunchunk和

深入windows的关机消息截获-从XP到Win7的变化(在XP中程序可以阻止关机,但是在Win7中程序无法阻止关机,可Block的时间从1秒调到了5秒) good

之前写了一个软件用于实验室的打卡提醒,其中一个重要的功能是在关机之前提醒当天晚上是否已经打卡.之前我是在WM_ENDSESSION中弹出一个模态对话框来提醒,在XP中基本工作正常,在Win7中大多数时候工作正常,但是有时候会出现不提醒现象.我想这中间是不是有什么玄机,Windows的关机方案从XP到Win7到底发生了什么变化,如何进行有效的截获Windows关机消息.对此,我搜寻了MSDN和网上论坛结合自己的测评给出一个完善的描述和解决方案,如果你有类似的需求,可以参考这篇文章. 在MSDN中对

教你实现类似于格瓦拉启动页中的放大转场动画(OC&Swift)

教你实现类似于格瓦拉启动页中的放大转场动画(OC&Swift) 一.前言 用过格瓦拉电影,或者其他app可能都知道,一种点击按钮用放大效果实现转场的动画现在很流行,效果大致如下 在iOS中,在同一个导航控制器你可以自定义转场动画实现两个viewController之间的过渡.实际上在iOS7之后,通过实现UIViewControllerAnimatedTransitioning或者UIViewControllerContextTransitioning协议,就可以简单的自定义转场动画,比如一个N

Struts2中属性驱动与模型驱动

属性驱动: LoginAction.java: public class LoginAction extends ActionSupport implements ModelDriven<User>{ private User mdoel = new User(); @Override public User getModel() { // TODO Auto-generated method stub return this.mdoel; } public String login(){ S

Linux 添加程序驱动

发现想要每天都写博客真不容易,每天都要写技术就意味着每天都要学新知识,没什么新知识,还真不好意思瞎写. 1. Linux 加载设备驱动 #insmod 设备驱动路径             如insmod /fpga.ko #mknod /dev/fpga8k c 248 0      创建/proc/dev/fpga8k 设备节点:其中 c 代表字符设备:248 主设备号:0 从设备号 主设备号---用来区分不同的硬件设备:从设备号,用来区分相同的硬件设备. #cat /proc/device