Unity高自由度轨道旋转
来源:互联网 发布:网络连环夺宝 编辑:程序博客网 时间:2024/04/30 13:40
一个物体围绕另一个物体旋转,仿天体公转的效果,可以动态的自由调节公转轨道及公转半径。
动态效果图:
可调节参数:
RevolutionTarget:围绕旋转的目标
RevolutionSelf:围绕旋转的物体
XDeviation:轨道进行X轴偏移
YDeviation:轨道进行Y轴偏移
ZDeviation:轨道进行Z轴偏移
XRotateSpeed:X轴旋转半径(为负时反向转动)
YRotateSpeed:Y轴旋转半径
ZRotateSpeed:Z轴旋转半径
RevolutionSpeed:转动速度
ShowGizmos:是否在scene显示当前轨道
圆形轨道:(三个轴轨道半径相同时为圆形轨道)
椭圆轨道:(三个轴轨道半径不同时为椭圆轨道)
轨道偏移:(仿地球公转效果)
核心代码,主要就是三角函数计算,逻辑很简单:
_Angle += RevolutionSpeed * Time.deltaTime; if (_Angle > 360) _Angle -= 360; float x = RevolutionTarget.position.x + XDeviation + Mathf.Cos(_Angle * (Mathf.PI / 180)) * _radius * XRotateSpeed; float y = RevolutionTarget.position.y + YDeviation + Mathf.Sin(_Angle * (Mathf.PI / 180)) * _radius * YRotateSpeed; float z = RevolutionTarget.position.z + ZDeviation + Mathf.Sin(_Angle * (Mathf.PI / 180)) * _radius * ZRotateSpeed; RevolutionSelf.position = new Vector3(x, y, z);
编辑器中的轨道绘制:
private void OnDrawGizmos() { if (!ShowGizmos || RevolutionTarget == null || RevolutionSelf == null) return; //绘制目标线 Gizmos.color = Color.red; Gizmos.DrawLine(RevolutionTarget.position, RevolutionSelf.position); //绘制轨道 Gizmos.color = Color.blue; float sub = 0.1f; float i = 0; //轨道起点 float x = RevolutionTarget.position.x + XDeviation + _radius * Mathf.Cos(i) * XRotateSpeed; float y = RevolutionTarget.position.y + YDeviation + _radius * Mathf.Sin(i) * YRotateSpeed; float z = RevolutionTarget.position.z + ZDeviation + _radius * Mathf.Sin(i) * ZRotateSpeed; Vector3 sPoint = new Vector3(x, y, z); Vector3 ePoint = Vector3.zero; for (i += sub; i <= Mathf.PI * 2; i += sub) { x = RevolutionTarget.position.x + XDeviation + _radius * Mathf.Cos(i) * XRotateSpeed; y = RevolutionTarget.position.y + YDeviation + _radius * Mathf.Sin(i) * YRotateSpeed; z = RevolutionTarget.position.z + ZDeviation + _radius * Mathf.Sin(i) * ZRotateSpeed; ePoint = new Vector3(x, y, z); Gizmos.DrawLine(sPoint, ePoint); sPoint = ePoint; } //轨道终点 x = RevolutionTarget.position.x + XDeviation + _radius * Mathf.Cos(Mathf.PI * 2) * XRotateSpeed; y = RevolutionTarget.position.y + YDeviation + _radius * Mathf.Sin(Mathf.PI * 2) * YRotateSpeed; z = RevolutionTarget.position.z + ZDeviation + _radius * Mathf.Sin(Mathf.PI * 2) * ZRotateSpeed; ePoint = new Vector3(x, y, z); Gizmos.DrawLine(sPoint, ePoint); }
github源码链接:https://github.com/SaiTingHu/Revolution
1 0
- Unity高自由度轨道旋转
- animate实现单向轨道旋转
- 自由度很高的标签流布局
- [Unity]旋转
- opengl的3个自由度旋转和3个自由度移动
- 高自由度样式JQ图片滚动特效源码
- 一个通用高自由度技能系统的设计(一)
- 高自由度:c++八大排序算法实现代码和原理
- 高铁、地铁这些轨道列车的动力来源是什么?
- Unity 屏幕旋转
- unity 旋转函数
- Unity物体全方位旋转
- Unity的旋转问题
- unity旋转相关
- unity 刚体的旋转
- unity旋转 缩放摄像机
- Unity的旋转
- Unity 旋转角度计算
- linux下邮件服务器的搭建详解
- 矩阵快速幂-GCD-斐波那契-HZAU2017现场赛-D
- 本地电脑如何配置一个域名对应多个网址
- java类加载机制
- HDFS文件系统学习
- Unity高自由度轨道旋转
- react-native 完整实现登录功能
- tableview实现单个cell的展开和收起
- lianbiao
- Win10 清空回收站
- Given a binary tree, return the preorder traversal of its nodes' values.
- 以ssm+mvc框架来开发一个系统的基本流程
- .NET-File, XmlDocument, WebService读写文件APIs总结
- Android 开发框架 MVVM 小试