Unity高自由度轨道旋转

87 篇文章 269 订阅
8 篇文章 1 订阅

一个物体围绕另一个物体旋转,仿天体公转的效果,可以动态的自由调节公转轨道及公转半径。

 

动态效果图:

 

 

 

 

可调节参数:

 

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);
    }

 

 

 

 

 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神码编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值