【目标】

带IK的Recoil

【思路】

1 继承于USkelControlLimb和UGameSkelCtrl_Recoil

2 效果对比

 以这个骨骼为例

Recoil

Limb


可见,Recoil只影响一根骨骼
如果两个结合就是,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 添加类实现

  1. IMPLEMENT_CLASS(USkelControlLimbRecoil)
  2. ...
  3. /*-----------------------------------------------------------------------------
  4. USkelControlLimbRecoil
  5. -----------------------------------------------------------------------------*/
  6. FVector2D USkelControlLimbRecoil::GetAim(USkeletalMeshComponent* InSkelComponent)
  7. {
  8. return Aim;
  9. }
  10. /** Is skeleton currently mirrored */
  11. UBOOL USkelControlLimbRecoil::IsMirrored(USkeletalMeshComponent* InSkelComponent)
  12. {
  13. return FALSE;
  14. }
  15. // USkelControlBase interface
  16. void USkelControlLimbRecoil::TickSkelControl(FLOAT DeltaSeconds, USkeletalMeshComponent* SkelComp)
  17. {
  18. bApplyControl = FALSE;
  19. if( ControlStrength > ZERO_ANIMWEIGHT_THRESH )
  20. {
  21. // if willing to play recoil, reset its state
  22. if( bPlayRecoil != bOldPlayRecoil )
  23. {
  24. bPlayRecoil = bOldPlayRecoil;
  25. Recoil.TimeToGo = Recoil.TimeDuration;
  26. // ERS_Random == Start at random position along sine wave,
  27. // ERS_Zero == Start at 0
  28. const FLOAT TWO_PI = 2.f * (FLOAT)PI;
  29. Recoil.RotSinOffset.X = Recoil.RotParams.X == ERS_Random ? appFrand() * TWO_PI : 0.f;
  30. Recoil.RotSinOffset.Y = Recoil.RotParams.Y == ERS_Random ? appFrand() * TWO_PI : 0.f;
  31. Recoil.RotSinOffset.Z = Recoil.RotParams.Z == ERS_Random ? appFrand() * TWO_PI : 0.f;
  32. Recoil.LocSinOffset.X = Recoil.LocParams.X == ERS_Random ? appFrand() * TWO_PI : 0.f;
  33. Recoil.LocSinOffset.Y = Recoil.LocParams.Y == ERS_Random ? appFrand() * TWO_PI : 0.f;
  34. Recoil.LocSinOffset.Z = Recoil.LocParams.Z == ERS_Random ? appFrand() * TWO_PI : 0.f;
  35. Recoil.RotOffset = FRotator(0,0,0);
  36. Recoil.LocOffset = FVector(0.f);
  37. }
  38. if( Recoil.TimeToGo > DeltaSeconds )
  39. {
  40. Recoil.TimeToGo -= DeltaSeconds;
  41. if( Recoil.TimeToGo > 0.f )
  42. {
  43. bApplyControl = TRUE;
  44. // Smooth fade out
  45. const FLOAT TimePct = Clamp<FLOAT>(Recoil.TimeToGo / Recoil.TimeDuration, 0.f, 1.f);
  46. const FLOAT Alpha = TimePct*TimePct*(3.f - 2.f*TimePct);
  47. const FLOAT AlphaTimesDelta = Alpha * DeltaSeconds;
  48. // Recoil Bone Rotation, compute sin wave value for each component
  49. if( !Recoil.RotAmplitude.IsZero() )
  50. {
  51. if( Recoil.RotAmplitude.X != 0.f )
  52. {
  53. Recoil.RotSinOffset.X += AlphaTimesDelta * Recoil.RotFrequency.X;
  54. Recoil.RotOffset.Pitch = appTrunc(Alpha * Recoil.RotAmplitude.X * appSin(Recoil.RotSinOffset.X));
  55. }
  56. if( Recoil.RotAmplitude.Y != 0.f )
  57. {
  58. Recoil.RotSinOffset.Y += AlphaTimesDelta * Recoil.RotFrequency.Y;
  59. Recoil.RotOffset.Yaw = appTrunc(Alpha * Recoil.RotAmplitude.Y * appSin(Recoil.RotSinOffset.Y));
  60. }
  61. if( Recoil.RotAmplitude.Z != 0.f )
  62. {
  63. Recoil.RotSinOffset.Z += AlphaTimesDelta * Recoil.RotFrequency.Z;
  64. Recoil.RotOffset.Roll = appTrunc(Alpha * Recoil.RotAmplitude.Z * appSin(Recoil.RotSinOffset.Z));
  65. }
  66. }
  67. // Recoil Bone Location, compute sin wave value for each component
  68. if( !Recoil.LocAmplitude.IsZero() )
  69. {
  70. if( Recoil.LocAmplitude.X != 0.f )
  71. {
  72. Recoil.LocSinOffset.X += AlphaTimesDelta * Recoil.LocFrequency.X;
  73. Recoil.LocOffset.X = Alpha * Recoil.LocAmplitude.X * appSin(Recoil.LocSinOffset.X);
  74. }
  75. if( Recoil.LocAmplitude.Y != 0.f )
  76. {
  77. Recoil.LocSinOffset.Y += AlphaTimesDelta * Recoil.LocFrequency.Y;
  78. Recoil.LocOffset.Y = Alpha * Recoil.LocAmplitude.Y * appSin(Recoil.LocSinOffset.Y);
  79. }
  80. if( Recoil.LocAmplitude.Z != 0.f )
  81. {
  82. Recoil.LocSinOffset.Z += AlphaTimesDelta * Recoil.LocFrequency.Z;
  83. Recoil.LocOffset.Z = Alpha * Recoil.LocAmplitude.Z * appSin(Recoil.LocSinOffset.Z);
  84. }
  85. }
  86. }
  87. }
  88. }
  89. Super::TickSkelControl(DeltaSeconds, SkelComp);
  90. }
  91. void USkelControlLimbRecoil::CalculateNewBoneTransforms(INT BoneIndex, USkeletalMeshComponent* SkelComp, TArray<FBoneAtom>& OutBoneTransforms)
  92. {
  93. Super::CalculateNewBoneTransforms(BoneIndex, SkelComp, OutBoneTransforms);
  94. }

现在需要将USkelControlLimb.EffectorLocation 设置为Recoil影响的骨骼的更新的位置

3

4



14072202(带IK的Recoil)的更多相关文章

  1. 带 IK 分词器的 Luke 和 搜索应用服务器solr

    首先在网上查了一下: Solr Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索 ...

  2. Unity给力插件之Final IK

    Final IK细节: 1.Aim IK:设定一个目标,关节末端始终朝向该目标,一般用来做头部的朝向. 步骤: a.在模型头节点处添加Aim空物体并reset b.给模型添加Aim IK组件,并填上A ...

  3. 在ElasticSearch中使用 IK 中文分词插件

    我这里集成好了一个自带IK的版本,下载即用, https://github.com/xlb378917466/elasticsearch5.2.include_IK 添加了IK插件意味着你可以使用ik ...

  4. humanoid ik unity 配件 animation的问题

    遇到这样一个问题 想给角色设置ik 以实现代码控制的 更为自然的 角色动作 比如角色头跟随点击转动 身体也有相应扭转 https://docs.unity3d.com/Manual/InverseKi ...

  5. 全文检索引擎sphinx 与 Elasticsearch 索引速度对比

    sphinx的特色之一是建立索引速度快,最近转投Elasticsearch后,一直想做个对比,网上资料常见说法是10倍的差距. 测试环境 硬件:单核,2G内存的E5-2630 虚拟机 操作系统:Cen ...

  6. Elasticsearch java api操作(一)(Java Low Level Rest Client)

    一.说明: 一.Elasticsearch提供了两个JAVA REST Client版本: 1.java low level rest client: 低级别的rest客户端,通过http与集群交互, ...

  7. [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一.

    在这里一下讲解着三个的安装和配置, 是因为solr需要使用tomcat和IK分词器, 这里会通过图文教程的形式来详解它们的安装和使用.注: 本文属于原创文章, 如若转载,请注明出处, 谢谢.关于设置I ...

  8. 安装elasticsearch及中文IK和近义词配置

    安装elasticsearch及中文IK和近义词配置 安装java环境 java环境是elasticsearch安装必须的 yum install java-1.8.0-openjdk 安装elast ...

  9. 使用 Elasticsearch ik分词实现同义词搜索(转)

    1.首先需要安装好Elasticsearch 和elasticsearch-analysis-ik分词器 2.配置ik同义词 Elasticsearch 自带一个名为 synonym 的同义词 fil ...

随机推荐

  1. .NET WebForm简介

    WebForm简介 微软开发的一款产品,它将用户的请求和响应都封装为控件.让开发者认为自己是在操作一个windows界面.极大地提高了开发效率. C/S(客户端) 主要是在本机执行(每一个客户端是独立 ...

  2. Python快速建站系列-Part.Two-结构化和布局

    |版权声明:本文为博主原创文章,未经博主允许不得转载. 首先明确我们要建一个什么样的站,作为教程(也算自己使用tornado的一个小总结),自然功能不能太多,但又满足一个普通网站需要的就行了. 目前想 ...

  3. Java语言中,类所拥有的“孩子”,他们的关系是怎样的

    学习了一本有关Java的书.初步了解了一些面向对象的内容. java是由一个个的类组成的,这些类组成了java程序.类之下有他的孩子,这四个孩子分别是: 成员变量:就相当于一个个的变量,他由stati ...

  4. Excel应该这么玩——3、命名表格:彻底改造公式

    上一篇介绍了通过命名列将公式中的地址引用去掉,让公式更容易理解.但是之前的命名列只是针对单个表格的,如何引用其他表格的列是本篇的主要内容. 1.创建命名表格 命名表格的前提的创建表格,这个操作上一篇已 ...

  5. 关于IP地址的一个细节问题

    使用ip2long()和long2ip()函数把IP地址转成整型存放进数据库而非字符型.这几乎能降低1/4的存储空间.同时可以很容易对地址进行排序和快速查找;

  6. Live writer

    使用起来还是蛮方便的,安装速度很快,配置也不麻烦.

  7. 使用Scala实现Java项目的单词计数:串行及Actor版本

    其实我想找一门“具有Python的简洁写法和融合Java平台的优势, 同时又足够有挑战性和灵活性”的编程语言. Scala 就是一个不错的选择. Scala 有很多语言特性, 建议先掌握基础常用的: ...

  8. tomcat部署https

    在server.xml配置文件中增加证书位置跟密码: <Connector port="443" protocol="org.apache.coyote.http1 ...

  9. wex5 教程 之 图文讲解 后台管理界面设计与技巧

    视频教程地址:http://v.youku.com/v_show/id_XMTgwOTAyMTkyMA==.html?from=s1.8-1-1.2&spm=a2h0k.8191407.0.0 ...

  10. log4j日志不输出MyBatis SQL脚本?

    日志输出级别调成debug,然并卵? 试试加下这个包. <dependency> <groupId>org.slf4j</groupId> <artifact ...