Unity 3D之实现鱼竿模拟
填坑
背景
之前在刷知乎的时候刷到了一篇问题:如何模拟一根鱼竿
高赞回答只说了通过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之实现鱼竿模拟相关推荐
- Unity三维游戏开发C#编程大师班 Masterclass In C# Programing Unity 3D Game Development FPS
本课程采用现代游戏开发(Unity 2021)的最新内容和最新技术 学习任何东西的最好方法是以一种真正有趣的方式去做,这就是这门课程的来源.如果你想了解你看到的这些不可思议的游戏是如何制作的,没有比这 ...
- 物联网技术周报第 143 期: Unity 3D 和 Arduino 打造虚拟现实飞行器
新闻 \\ \\t <西门子.阿里云签约助力中国工业物联网发展>德国工业集团西门子和中国阿里巴巴集团旗下的云计算公司阿里云9日在柏林签署备忘录,共同推进中国工业物联网发展.根据备忘录内容, ...
- Unity 3D游戏编程自学#3——Unity 3D初步
1.开始 在创建的项目文件夹中,各个子文件夹的作用: Assets:保存游戏所需资源. Library:保存当前项目运行所需要的库. ProjectSettings:保存项目设置信息. Temp:保存 ...
- Unity 3D模型展示框架篇之自由观察(Cinemachine)
本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 在U ...
- 【Unity 3D 从入门到实战】Unity 3D 组件总结
目录 一,前言 二,常用组件 1,Transform 组件 2,Mesh Filter 组件 3,Box Collider 组件 4,Rigidbody 组件 5,脚本组件 三,总结 一,前言 组件是 ...
- Unity 3D 博客汇总
附录 X4.作业优秀博客汇总 目录 文章目录 附录 X4.作业优秀博客汇总 1.最有价值个人博客(Valuable Person Blogs) 2.博客表达技巧与游戏创新 2.1 写读者欢迎的游戏博客 ...
- unity 3d开发的大型网络游戏 1
unity 3d开发的大型网络游戏 一.总结 1.unity的官网上面应该有游戏列表 2.unity3D是很好的3d游戏引擎,也支持2d,也能做很多画面精良的3A级游戏 3.范围:电脑游戏,手机游戏, ...
- Unity 3D 中的专业“术语表”。
这是unity手册中的内容.具体可以参考此链接:Unity 用户手册 (2019.4 LTS) - Unity 手册 目录 2D 术语 2D 物理术语 AI 术语 Analytics 术语 动画术语 ...
- Unity 3D中的内存管理与优化游戏运行性能的经验
Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备的游戏开发,动辄内存占用飙上一两百兆,导致内存资源耗尽,从而被系统强退造成极差的体验.类似这种情况并不少见,但是绝大部分都是可以避免的.虽 ...
最新文章
- python 参数解析器_Python参数解析器,在h之前引发异常
- mysql事件计划自动_逐步讲解MySQL中定时事件计划的创建
- javaScript学习笔记之break 和 continue 语句对比
- python--gevent协程及协程概念
- Selenium中文手册
- Linq = MyMetal = SqlMetal Include 自定义(Linq to sql )生成
- 牛客(3)从尾到头打印链表
- android 打开下载管理器,Android OkHttp 下载管理器
- 【数据分享】学生受欢迎程度评价数据集
- Hive窗口函数应用:级联累加求和场景
- vue中 jsbarcode的使用技巧
- 【财富空间】UpHonest Capital:美国人工智能投资分析报告(精华版)
- 微信小程序之 收藏功能
- winform使用CefSharp嵌入浏览器
- Android Bmob
- 玩游戏电脑IP被封了,怎么修改电脑IP
- python语言编程函数_Python编程语言的函数功能
- speedoffice(Word)文字内容怎么添加删除线
- python复杂美观的图形界面_Python图形界面美化的方法论
- 魔域单机版怎么提示服务器维护,指导魔域单机版数据库服务名无效咋办 | 手游网游页游攻略大全...