14072202(带IK的Recoil)
【目标】
带IK的Recoil
【思路】
1 继承于USkelControlLimb和UGameSkelCtrl_Recoil
2 效果对比
以这个骨骼为例
Recoil
Limb
【步骤】
1 在\ue3\Development\Src\Engine\Classes中新建SkelControlLimbRecoil.uc
先复制\ue3\Development\Src\GameFramework\Classes\GameSkelCtrl_Recoil.uc的内容
make 后 编译代码会出现结构体 枚举 重命名
需要将\GameSkelCtrl_Recoil.uc的结构体 枚举注释掉
2 在UnSkelControl.cpp 添加类实现
IMPLEMENT_CLASS(USkelControlLimbRecoil)
...
/*-----------------------------------------------------------------------------
USkelControlLimbRecoil
-----------------------------------------------------------------------------*/
FVector2D USkelControlLimbRecoil::GetAim(USkeletalMeshComponent* InSkelComponent)
{
return Aim;
}
/** Is skeleton currently mirrored */
UBOOL USkelControlLimbRecoil::IsMirrored(USkeletalMeshComponent* InSkelComponent)
{
return FALSE;
}
// USkelControlBase interface
void USkelControlLimbRecoil::TickSkelControl(FLOAT DeltaSeconds, USkeletalMeshComponent* SkelComp)
{
bApplyControl = FALSE;
if( ControlStrength > ZERO_ANIMWEIGHT_THRESH )
{
// if willing to play recoil, reset its state
if( bPlayRecoil != bOldPlayRecoil )
{
bPlayRecoil = bOldPlayRecoil;
Recoil.TimeToGo = Recoil.TimeDuration;
// ERS_Random == Start at random position along sine wave,
// ERS_Zero == Start at 0
const FLOAT TWO_PI = 2.f * (FLOAT)PI;
Recoil.RotSinOffset.X = Recoil.RotParams.X == ERS_Random ? appFrand() * TWO_PI : 0.f;
Recoil.RotSinOffset.Y = Recoil.RotParams.Y == ERS_Random ? appFrand() * TWO_PI : 0.f;
Recoil.RotSinOffset.Z = Recoil.RotParams.Z == ERS_Random ? appFrand() * TWO_PI : 0.f;
Recoil.LocSinOffset.X = Recoil.LocParams.X == ERS_Random ? appFrand() * TWO_PI : 0.f;
Recoil.LocSinOffset.Y = Recoil.LocParams.Y == ERS_Random ? appFrand() * TWO_PI : 0.f;
Recoil.LocSinOffset.Z = Recoil.LocParams.Z == ERS_Random ? appFrand() * TWO_PI : 0.f;
Recoil.RotOffset = FRotator(0,0,0);
Recoil.LocOffset = FVector(0.f);
}
if( Recoil.TimeToGo > DeltaSeconds )
{
Recoil.TimeToGo -= DeltaSeconds;
if( Recoil.TimeToGo > 0.f )
{
bApplyControl = TRUE;
// Smooth fade out
const FLOAT TimePct = Clamp<FLOAT>(Recoil.TimeToGo / Recoil.TimeDuration, 0.f, 1.f);
const FLOAT Alpha = TimePct*TimePct*(3.f - 2.f*TimePct);
const FLOAT AlphaTimesDelta = Alpha * DeltaSeconds;
// Recoil Bone Rotation, compute sin wave value for each component
if( !Recoil.RotAmplitude.IsZero() )
{
if( Recoil.RotAmplitude.X != 0.f )
{
Recoil.RotSinOffset.X += AlphaTimesDelta * Recoil.RotFrequency.X;
Recoil.RotOffset.Pitch = appTrunc(Alpha * Recoil.RotAmplitude.X * appSin(Recoil.RotSinOffset.X));
}
if( Recoil.RotAmplitude.Y != 0.f )
{
Recoil.RotSinOffset.Y += AlphaTimesDelta * Recoil.RotFrequency.Y;
Recoil.RotOffset.Yaw = appTrunc(Alpha * Recoil.RotAmplitude.Y * appSin(Recoil.RotSinOffset.Y));
}
if( Recoil.RotAmplitude.Z != 0.f )
{
Recoil.RotSinOffset.Z += AlphaTimesDelta * Recoil.RotFrequency.Z;
Recoil.RotOffset.Roll = appTrunc(Alpha * Recoil.RotAmplitude.Z * appSin(Recoil.RotSinOffset.Z));
}
}
// Recoil Bone Location, compute sin wave value for each component
if( !Recoil.LocAmplitude.IsZero() )
{
if( Recoil.LocAmplitude.X != 0.f )
{
Recoil.LocSinOffset.X += AlphaTimesDelta * Recoil.LocFrequency.X;
Recoil.LocOffset.X = Alpha * Recoil.LocAmplitude.X * appSin(Recoil.LocSinOffset.X);
}
if( Recoil.LocAmplitude.Y != 0.f )
{
Recoil.LocSinOffset.Y += AlphaTimesDelta * Recoil.LocFrequency.Y;
Recoil.LocOffset.Y = Alpha * Recoil.LocAmplitude.Y * appSin(Recoil.LocSinOffset.Y);
}
if( Recoil.LocAmplitude.Z != 0.f )
{
Recoil.LocSinOffset.Z += AlphaTimesDelta * Recoil.LocFrequency.Z;
Recoil.LocOffset.Z = Alpha * Recoil.LocAmplitude.Z * appSin(Recoil.LocSinOffset.Z);
}
}
}
}
}
Super::TickSkelControl(DeltaSeconds, SkelComp);
}
void USkelControlLimbRecoil::CalculateNewBoneTransforms(INT BoneIndex, USkeletalMeshComponent* SkelComp, TArray<FBoneAtom>& OutBoneTransforms)
{
Super::CalculateNewBoneTransforms(BoneIndex, SkelComp, OutBoneTransforms);
}
现在需要将USkelControlLimb.EffectorLocation 设置为Recoil影响的骨骼的更新的位置
3
4
14072202(带IK的Recoil)的更多相关文章
- 带 IK 分词器的 Luke 和 搜索应用服务器solr
首先在网上查了一下: Solr Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索 ...
- Unity给力插件之Final IK
Final IK细节: 1.Aim IK:设定一个目标,关节末端始终朝向该目标,一般用来做头部的朝向. 步骤: a.在模型头节点处添加Aim空物体并reset b.给模型添加Aim IK组件,并填上A ...
- 在ElasticSearch中使用 IK 中文分词插件
我这里集成好了一个自带IK的版本,下载即用, https://github.com/xlb378917466/elasticsearch5.2.include_IK 添加了IK插件意味着你可以使用ik ...
- humanoid ik unity 配件 animation的问题
遇到这样一个问题 想给角色设置ik 以实现代码控制的 更为自然的 角色动作 比如角色头跟随点击转动 身体也有相应扭转 https://docs.unity3d.com/Manual/InverseKi ...
- 全文检索引擎sphinx 与 Elasticsearch 索引速度对比
sphinx的特色之一是建立索引速度快,最近转投Elasticsearch后,一直想做个对比,网上资料常见说法是10倍的差距. 测试环境 硬件:单核,2G内存的E5-2630 虚拟机 操作系统:Cen ...
- Elasticsearch java api操作(一)(Java Low Level Rest Client)
一.说明: 一.Elasticsearch提供了两个JAVA REST Client版本: 1.java low level rest client: 低级别的rest客户端,通过http与集群交互, ...
- [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一.
在这里一下讲解着三个的安装和配置, 是因为solr需要使用tomcat和IK分词器, 这里会通过图文教程的形式来详解它们的安装和使用.注: 本文属于原创文章, 如若转载,请注明出处, 谢谢.关于设置I ...
- 安装elasticsearch及中文IK和近义词配置
安装elasticsearch及中文IK和近义词配置 安装java环境 java环境是elasticsearch安装必须的 yum install java-1.8.0-openjdk 安装elast ...
- 使用 Elasticsearch ik分词实现同义词搜索(转)
1.首先需要安装好Elasticsearch 和elasticsearch-analysis-ik分词器 2.配置ik同义词 Elasticsearch 自带一个名为 synonym 的同义词 fil ...
随机推荐
- 借助Glances Monitor,密切关注你的系统
两种方法安装 glances 通常可以有两种方法安装 glances.第一种是通过编译源代码的方式,这种方法比较复杂另外可能会遇到软件包依赖性问题.还有一种是使用特定的软件包管理工具来安装 glanc ...
- Java使用占位符拼接字符串
大家知道,在C#编程中,可以用占位符来拼接字符串,用起来非常的方便. 特别是需要进行大量的参数拼接的时候,比如: Console.WriteLine(String.Format("该域名{0 ...
- 我去,徒弟半夜来电让写一个PHP短信验证(和群发)
感觉很纳闷啊,,..好几天几乎通宵了,今晚本来以为有个早觉睡,居然2点多才打电话来让帮忙... 记得前段时间还有博友问过同类的问题.... 名字我就隐藏掉了,呵呵,, 我在网上随便找了一个提供相应接口 ...
- PAT乙级 1032. 挖掘机技术哪家强(20)
1032. 挖掘机技术哪家强(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 为了用事实说明挖掘机技术到底 ...
- 新建Java文件的 文档注释
/** * <br> * ============================================= * * @author : Liuyc * @company : 版权 ...
- Turtlebot入门篇
0.什么是TurtleBot? 我自己的理解就是:TurtleBot是一款移动机器人,就是主要研究让机器人自主决定应该想那个方向走,怎么绕过障碍物,最终到达目的地.与之对应还有很多机器人,比如goog ...
- Unix/Linux编程实践教程(三:代码、测试)
测试logfilec.c的时候,有个sendto(sock,msg,strlen(msg),0,&addr,addrlen),编译时提示: logfilec.c:30: warning: pa ...
- quick Cocos2dx lua 接anysdk
quick3.3 的quick\samples\anysdk中有例子,具体用法可以参考官方文档,将的非常详细. 1.框架接口设计 系统介绍 必接入流程简要描述 消息通知 可扩展性 测试模式 添加测试账 ...
- C# 4.0中dynamic的作用
internal sealed class Coffee { public string GetName() { return "You selected Maxwell coffee.&q ...
- oracle物化视图
物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询. 这样对整 ...