unity-运动学-加速运动和简谐运动等

using UnityEngine;
using System.Collections;
using System;

/// <summary>
/// 运动控制类
/// </summary>
public class MoveAnimation : MonoBehaviour {
    /// <summary>
    /// 运动枚举类
    /// </summary>
    public enum MoveType
    { 
        None,
        Yuan,
        TuoYuan,
        HuanDong,
        JianXie,
        ZhengCibo,
        YuSu,
        JiaSu,
        MoCaLi,
        JiaoJiaSu,
        TanXing,
    }


    public Transform Ball;//运动物体
    public Transform Target;//目标物体

    public MoveType moveType = MoveType.None;//运动类型,默认不动
    public Vector3 center = Vector3.zero; //设置中心点
    public float dis = 3f;

    //设置x,y,z 旋转角度
    private float _px = 0f;
    private float _pz = 0f;
    private float _py = 0f;
    private float Angele = 0f;

    //振幅
    private float _ratio = 0.05f;
    private float _moveSpeed = 0.05f;
    private float _a = 0.001f;
    private float _ax = 0.001f;
    private float _az = 0.001f;
    //设置速度
    private float _moveSpeedx = 0.05f;
    private float _moveSpeedz = 0.01f;
   
    void Update () {
        //循环执行,属于哪种状态就执行什么样的运动方式
        if (Ball != null && Target != null)
        {
            if (moveType == MoveType.Yuan)
            {
                _yuanMove();
                _toBounds();
            }
            if (moveType == MoveType.TuoYuan)
            {
                _tuoYuanMove();
                _toBounds();
            }
            if (moveType == MoveType.JianXie)
            {
                _JianXieMove();
                _toBounds();
            }
            if (moveType == MoveType.ZhengCibo)
            {
                _ZhengCiBoMove();
                _toBounds();
            }
            if (moveType == MoveType.YuSu)
            {
                _YuSuMove();
                _toBounds();
            }
            if (moveType == MoveType.JiaSu)
            {
                _JiaSuMove();
                _toBounds();
            }
            if (moveType == MoveType.MoCaLi)
            {
                _MoCaLiMove();
                _toBounds();
            }
            if (moveType == MoveType.HuanDong)
            {
                _huanDongMove();
                _toBounds();
            }
            if (moveType == MoveType.TanXing)
            {
                _tanXinMove();
            }
           
            
        }
    
    }
    /// <summary>
    /// GUI显示
    /// </summary>
    void OnGUI()
    {
        if (GUILayout.Button("圆周运动"))
        {
            //这里是设置的每种运动状态的初始值
             Angele = 0f;
             _moveSpeed = .2f;
             Ball.localPosition = Vector3.zero;
             Target.localPosition = new Vector3(18f, 0f, 0f);
             moveType = MoveType.Yuan;
             Target.gameObject.SetActive(false);
        }
        if (GUILayout.Button("椭圆运动"))
        {
            //这里是设置的每种运动状态的初始值
            Angele = 0f;
            _moveSpeed = .2f;
            Ball.localPosition = Vector3.zero;
            Target.localPosition = new Vector3(18f, 0f, 0f);
            moveType = MoveType.TuoYuan;
            Target.gameObject.SetActive(false);
        }
        if (GUILayout.Button("简谐振动"))
        {
            //这里是设置的每种运动状态的初始值
            Angele = 0f;
            _moveSpeed = .2f;
            Ball.localPosition = Vector3.zero;
            Target.localPosition = new Vector3(18f, 0f, 0f);
            moveType = MoveType.JianXie;
            Target.gameObject.SetActive(false);
        }
        if (GUILayout.Button("正弦余弦运动"))
        {
            Angele = 0f;
            _moveSpeed = .25f;
            Ball.localPosition = new Vector3(-18f, 0f, 0f);
            Target.localPosition = new Vector3(18f, 0f, 0f);
            moveType = MoveType.ZhengCibo;
            Target.gameObject.SetActive(false);
        }
        if (GUILayout.Button("匀速运动"))
        {
            Angele = 0f;
            _moveSpeed = .2f;
            Ball.localPosition = new Vector3(-18f, 0f, 0f);
            Target.localPosition = new Vector3(18f, 0f, 0f);
            moveType = MoveType.YuSu;
            Target.gameObject.SetActive(true);
        }
        if (GUILayout.Button("加速运动"))
        {
            Angele = 0f;
            _moveSpeed = .5f;
            _a = 0.001f;
            Ball.localPosition = new Vector3(-18f, 0f, 0f);
            Target.localPosition = new Vector3(18f, 0f, 0f);
            moveType = MoveType.JiaSu;
            Target.gameObject.SetActive(true);
        }
        if (GUILayout.Button("摩擦力"))
        {
            Angele = 0f;
            _moveSpeed = 3f;
            Ball.localPosition = new Vector3(-18f, 0f, 0f);
            Target.localPosition = new Vector3(18f, 0f, 0f);
            moveType = MoveType.MoCaLi;
            Target.gameObject.SetActive(false);
        }

        if (GUILayout.Button("缓动"))
        {
            Angele = 0f;
            _moveSpeed = 2f;
            Ball.localPosition = new Vector3(-18f, 0f, 0f);
            Target.localPosition = new Vector3(18f, 0f, 0f);
            moveType = MoveType.HuanDong;
            Target.gameObject.SetActive(true);
        }
        if (GUILayout.Button("弹性移动"))
        {
            Angele = 0f;
            _moveSpeed = 2f;
            Ball.localPosition = new Vector3(-18f, 0f, 0f);
            Target.localPosition = Vector3.zero;
            moveType = MoveType.TanXing;
            Target.gameObject.SetActive(true);
        }
        
    }


    /// <summary>
    /// 圆型移动
    /// </summary>
    void _yuanMove()
    {

        Angele += 0.1f;
        _px = center.x + dis * (float)Math.Cos(Angele);
        _pz = center.z + dis * (float)Math.Sin(Angele);
        Ball.localPosition = new Vector3(_px, Ball.localPosition.y, _pz);
    }
    /// <summary>
    /// 椭圆移动
    /// </summary>
    void _tuoYuanMove()
    {

        Angele += 0.1f;
        _px = center.x + dis * (float)Math.Cos(Angele);
        _pz = center.z + dis * 0.5f * (float)Math.Sin(Angele);
        _py = 0f;
        Ball.localPosition = new Vector3(_px,_py, _pz);
    }
    /// <summary>
    /// 缓动
    /// </summary>
    void _huanDongMove()
    {
        float dis = Vector3.Distance(Ball.localPosition, Target.localPosition);

        float speed = dis * _ratio;

        _px = Ball.localPosition.x + speed;
        _py = 0f;
        _pz = 0f;
        Ball.localPosition = new Vector3(_px, _py, _pz);
    }

    /// <summary>
    /// 简谐振动
    /// </summary>
     void _JianXieMove()
    {
        Angele += 0.1f;
       // _px = center.x + dis * (float)Math.Cos(_angele);
        _pz = center.z + dis * (float)Math.Sin(Angele);
        _py = 0f;
        _px = 0f;
        Ball.localPosition = new Vector3(_px, _py, _pz);
    }
    /// <summary>
    /// 正弦运动  ,Math.Sin()
    /// </summary>
    void _ZhengCiBoMove()
    {
        Angele += 0.15f;
        _px = Ball.localPosition.x + _moveSpeed;
        _pz = center.z + dis * (float)Math.Sin(Angele);
        _py = 0f;
        Ball.localPosition = new Vector3(_px,_py, _pz);
    }
    /// <summary>
    /// 匀速运动,速度恒定
    /// </summary>
    void _YuSuMove()
    {
        float dis = Vector3.Distance(Ball.localPosition, Target.localPosition);
        if (dis > 0.5f)
        {
            _px =Ball.localPosition.x + _moveSpeed;
            _py = 0f;
            _pz = 0f;
            Ball.localPosition = new Vector3(_px, _py, _pz);
        }
    }
    /// <summary>
    /// 减速运动,距离越小,速度越慢
    /// </summary>
    void _JiaSuMove()
    {
       
        float dis = Vector3.Distance(Ball.localPosition, Target.localPosition);
        if (dis > 0.5f)
        {
            _moveSpeed += _a;
            _px = Ball.localPosition.x + _moveSpeed;
            _py = 0f;
            _pz = 0f;
            Ball.localPosition = new Vector3(_px, _py, _pz);
        }
        else
        {
          
        }

    }
    /// <summary>
    /// 摩擦运动,运动中受摩擦力减速
    /// </summary>
    void _MoCaLiMove()
    {
        if (_moveSpeed >= 0.001f)
            _moveSpeed *= 0.92f;
        else
            _moveSpeed = 0f;
        _px = Ball.localPosition.x + _moveSpeed;
        _py = 0f;
        _pz = 0f;
        Ball.localPosition = new Vector3(_px, _py, _pz);
    }
    /// <summary>
    /// 弹性移动
    /// </summary>
     void _tanXinMove()
    {
        float disx =  Target.localPosition.x - Ball.localPosition.x ;
        float disz = Target.localPosition.z - Ball.localPosition.z;
        _ax = disx * 0.1f;
        _az = disz * 0.1f;
        _moveSpeedx += _ax;
        _moveSpeedz += _az;
        _moveSpeedx *= 0.95f;
        _moveSpeedz *= 0.95f;
        _px = Ball.localPosition.x + _moveSpeedx;
        _py =0f; 
        _pz =Ball.localPosition.z + _moveSpeedz;
        Ball.localPosition = new Vector3(_px, _py, _pz);
        if (Math.Abs(_moveSpeedx) <= 0.0001f && Math.Abs(_moveSpeedz) <= 0.0001f)
        {
            Target.localPosition = new Vector3(UnityEngine.Random.Range(-18f, 18f), 0f,UnityEngine.Random.Range(-10f, 10f));
        }
    }
    
    void _toBounds()
    {
        if (Ball.localPosition.x > 25f)
        {
            Ball.localPosition = new Vector3(-25f,Ball.localPosition.y,Ball.localPosition.z);
        }
       else if (Ball.localPosition.x < -25f)
        {
            Ball.localPosition = new Vector3(25f, Ball.localPosition.y, Ball.localPosition.z);
        }
        if (Ball.localPosition.z >15f)
        {
            Ball.localPosition = new Vector3(Ball.localPosition.x, Ball.localPosition.y,-15f);
        }
       else  if (Ball.localPosition.z <-15f)
        {
            Ball.localPosition = new Vector3(Ball.localPosition.x, Ball.localPosition.y,15f);
        }
    }
}
 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中实现机械臂的逆运动学可以通过以下步骤完成: 1. 创建机械臂模型:在Unity中,首先需要创建机械臂的模型。可以使用Unity的3D建模工具或导入外部模型文件创建机械臂。 2. 定义机械臂关节:根据机械臂的结构,定义每个关节的类型和参数。例如,旋转关节可以使用`HingeJoint`组件来表示,平移关节可以使用`SliderJoint`组件。 3. 实现逆运动学算法:逆运动学算法用于计算机械臂关节的角度或位置以实现特定的目标位置或姿态。常见的逆运动学算法包括解析解法和数值解法。 - 解析解法:对于简单的机械臂结构,可以使用解析解法求解逆运动学问题。这涉及到数学计算和公式推导,可以根据机械臂的结构和要求手动推导出关节角度的表达式。 - 数值解法:对于复杂的机械臂结构或无法求得解析解的情况,可以使用数值解法求解逆运动学问题。这涉及到迭代计算和数值优化算法,通过不断调整关节角度来逼近目标位置或姿态。 4. 实现运动控制:在逆运动学算法的基础上,将计算得到的关节角度或位置应用到机械臂模型上,实现机械臂的运动控制。可以通过修改关节的旋转角度或位置来控制机械臂的姿态。 需要注意的是,机械臂的逆运动学是一个复杂的问题,涉及到数学和物理知识。具体的实现方式和算法选择会根据机械臂的结构和需求而有所不同。以上是一个简单的概述,具体的实现细节可能需要根据具体情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值