填坑

背景

之前在刷知乎的时候刷到了一篇问题:如何模拟一根鱼竿
高赞回答只说了通过UE4和蓝图的一种实现。于是就想着自己通过Unity实现一版。


前言

木杆的弯曲,可以通过力学里的Cantilever beams(悬臂梁) algorithm算法进行模拟。

x2×(3l−x)2l2\frac{x^{2}\times \left ( 3l-x \right )}{2l^{2}} 2l2x2×(3l−x)​
这个算法其实比较好理解,越靠近顶端权重逼近越快,越靠近起点权重变化越慢。这就很符合鱼竿的特征:顶端比较软,而手柄比较硬,整体表现比较软


实现


对于悬臂梁算法的实现还是比较简单的

x:距离起点的距离
Input(x)
{return pow(x,2) * (3 * l - x) / 2 * pow(l , 2);
}

在Unity中去这样方法还是比较简单的:

    public static float GetWidth(float x,float l){return Mathf.Pow(x, 2) * (3 * l - x) / (2 * Mathf.Pow(l, 3));}

效果如下:

可以看到还是比较像的,这个可以模拟甩杆的效果。


More


那么只有这个模拟还是不够满意,我们希望实现更多的交互,比如收回来的时候回弹动画。这里就需要在Unity中实现一个Spring动画,如下面一样。

那么这个回弹动画该怎么实现?


回弹动画


首先,我们需要知道怎么做回弹效果。
回弹效果其实自需要对于每个顶点做一个回弹动画,让顶点去插值逼近原来的位置就行。
为什么是插值?
插值分为内插和外插,内插就是在0−10-10−1的范围内,而外插就是在这个范围外,至于回弹出现的反弹出去的效果,可以通过外插实现。
这里给出一个springback的算法:
2−10xsin(x−0.14∗2πfaction)+12^{-10x}sin\left ( \frac{\frac{x-0.1}{4} *2\pi }{faction} \right ) + 1 2−10xsin(faction4x−0.1​∗2π​)+1
这个算法在图形上表示为:

可以从图上看到这个函数在y轴上会有一段曲线超出1的范围。这符合我们对于回弹的理解。而且根据调节不同的影响因子,回弹的效果会不同,也就可以模拟不同材质回弹结果
在Unity中进行实现:

    public static float interpolationFaction = 0.3f;public static float getInterpolation(float x){return (Mathf.Pow(2, -10 * x) * Mathf.Sin((x - 0.1f / 4f) * (2f * Mathf.PI) / interpolationFaction) + 1f);}

输入参数是当前回弹的进度,而输出是回弹当前进度的插值权重。


其他


在开发的时候也会遇到其他问题,这里做一个总结。
在Unity中,

Vector3D.lerp

函数没有外插值,范围会进行折叠到[0−1][0-1][0−1]。因此我们需要自己实现一个Vector3D的线性插值版本:

    public static Vector3 mylerp(Vector3 or, Vector3 tar, float input){return tar * input + or * (1.0f - input);}

测试通过,可以使用。

你可以通过一下链接找到测试工程:
https://github.com/ThisskyMain/UnityTestProject

Unity 3D之实现鱼竿模拟相关推荐

  1. Unity三维游戏开发C#编程大师班 Masterclass In C# Programing Unity 3D Game Development FPS

    本课程采用现代游戏开发(Unity 2021)的最新内容和最新技术 学习任何东西的最好方法是以一种真正有趣的方式去做,这就是这门课程的来源.如果你想了解你看到的这些不可思议的游戏是如何制作的,没有比这 ...

  2. 物联网技术周报第 143 期: Unity 3D 和 Arduino 打造虚拟现实飞行器

    新闻 \\ \\t <西门子.阿里云签约助力中国工业物联网发展>德国工业集团西门子和中国阿里巴巴集团旗下的云计算公司阿里云9日在柏林签署备忘录,共同推进中国工业物联网发展.根据备忘录内容, ...

  3. Unity 3D游戏编程自学#3——Unity 3D初步

    1.开始 在创建的项目文件夹中,各个子文件夹的作用: Assets:保存游戏所需资源. Library:保存当前项目运行所需要的库. ProjectSettings:保存项目设置信息. Temp:保存 ...

  4. Unity 3D模型展示框架篇之自由观察(Cinemachine)

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 在U ...

  5. 【Unity 3D 从入门到实战】Unity 3D 组件总结

    目录 一,前言 二,常用组件 1,Transform 组件 2,Mesh Filter 组件 3,Box Collider 组件 4,Rigidbody 组件 5,脚本组件 三,总结 一,前言 组件是 ...

  6. Unity 3D 博客汇总

    附录 X4.作业优秀博客汇总 目录 文章目录 附录 X4.作业优秀博客汇总 1.最有价值个人博客(Valuable Person Blogs) 2.博客表达技巧与游戏创新 2.1 写读者欢迎的游戏博客 ...

  7. unity 3d开发的大型网络游戏 1

    unity 3d开发的大型网络游戏 一.总结 1.unity的官网上面应该有游戏列表 2.unity3D是很好的3d游戏引擎,也支持2d,也能做很多画面精良的3A级游戏 3.范围:电脑游戏,手机游戏, ...

  8. Unity 3D 中的专业“术语表”。

    这是unity手册中的内容.具体可以参考此链接:Unity 用户手册 (2019.4 LTS) - Unity 手册 目录 2D 术语 2D 物理术语 AI 术语 Analytics 术语 动画术语 ...

  9. Unity 3D中的内存管理与优化游戏运行性能的经验

    Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备的游戏开发,动辄内存占用飙上一两百兆,导致内存资源耗尽,从而被系统强退造成极差的体验.类似这种情况并不少见,但是绝大部分都是可以避免的.虽 ...

最新文章

  1. python 参数解析器_Python参数解析器,在h之前引发异常
  2. mysql事件计划自动_逐步讲解MySQL中定时事件计划的创建
  3. javaScript学习笔记之break 和 continue 语句对比
  4. python--gevent协程及协程概念
  5. Selenium中文手册
  6. Linq = MyMetal = SqlMetal Include 自定义(Linq to sql )生成
  7. 牛客(3)从尾到头打印链表
  8. android 打开下载管理器,Android OkHttp 下载管理器
  9. 【数据分享】学生受欢迎程度评价数据集
  10. Hive窗口函数应用:级联累加求和场景
  11. vue中 jsbarcode的使用技巧
  12. 【财富空间】UpHonest Capital:美国人工智能投资分析报告(精华版)
  13. 微信小程序之 收藏功能
  14. winform使用CefSharp嵌入浏览器
  15. Android Bmob
  16. 玩游戏电脑IP被封了,怎么修改电脑IP
  17. python语言编程函数_Python编程语言的函数功能
  18. speedoffice(Word)文字内容怎么添加删除线
  19. python复杂美观的图形界面_Python图形界面美化的方法论
  20. 魔域单机版怎么提示服务器维护,指导魔域单机版数据库服务名无效咋办 | 手游网游页游攻略大全...

热门文章

  1. java 反射为何耗性能_Java反射的性能成本
  2. PHP的realpath(...)
  3. pstack无法使用的问题
  4. ESD/EMI防护设计
  5. 从vue项目简单了解什么是SSR
  6. 邮件中CC和BCC的含义
  7. java面试题选择题题库
  8. instruction-tuning
  9. [论文阅读笔记69]医学术语标准化-CODER
  10. unixtime时间转换mysql_MySQL中from_unixtime()时间转换