找回密码
 立即注册
查看: 308|回复: 1

unity 机械臂控制

[复制链接]
发表于 2022-4-16 15:07 | 显示全部楼层 |阅读模式
unity 机械臂控制

基本原理

机械臂的控制主要是通过控制父节点的旋转,带动子节点移动,子节点的旋转再带动自己的子节点移动以此类推。每个节点的旋转单一,通常是水平方向和垂直方向,即x轴旋转和y轴旋转,也有可能出现z轴旋转,这里可以控制模型的的轴方向实现统一。
实现的难点

可控的旋转是自身的相对旋转,但是实际结果却是其父节点旋转和位移的累加。
实现的方式

机械臂运动有两种方式,一种是父节点运动后子节点才运动;另一种是各节点同时运动。
第一种实现方式比较简单,不用考虑累加的结果;
第二种方式比较复杂,可能要用到傅里叶变换或者用结果反推过程。
第一种方式unity实现方法

节点控制
针对每个节点的控制
  1. using System;
  2. using UnityEngine;
  3. public class JxbPoint : MonoBehaviour
  4. {
  5.     public RotateType RotateType;//判断旋转的方式
  6.     public float Time;//运动的时间
  7.     float curAngle;//记录每个节点上一次的移动的角度
  8.     public void SetAngle(float angle, Action action)
  9.     {
  10.         if (curAngle== angle)
  11.         {
  12.             action();
  13.         }
  14.         else
  15.         {
  16.             if (RotateType == RotateType.Vertical)
  17.             {
  18.                 transform.RotateX(angle, Time, action);
  19.             }
  20.             else
  21.             {
  22.                 transform.RotateY(angle, Time, action);
  23.             }
  24.             curAngle = angle;
  25.         }
  26.     }
  27. }
复制代码
用来控制整体旋转
  1. using UnityEngine;
  2. public enum RotateType
  3. {
  4.     Vertical,
  5.     Horizontal
  6. }
  7. public class JxbControler : MonoBehaviour
  8. {
  9.     public  JxbPoint[] JxbPoints;
  10.     //旋转的数据
  11.     float[] place0 = { -60, -112,30, 10,0,3,180 };
  12.     float[] place1 = {-60,-186,82,10,0.5f,-7, 180};
  13.     float[] place2 = { -25, -186, 82, 10, 0.5f, -7, 180 };
  14.     void MoveJxb(float[] data,int i)
  15.     {
  16.         JxbPoints[i].SetAngle(data[i], () =>
  17.         {
  18.             i++;
  19.             if (i>=JxbPoints.Length)
  20.             {
  21.                 return;
  22.             }
  23.             MoveJxb(data, i); });
  24.     }
  25.     public void ControlerMove(int i)
  26.     {
  27.         switch (i)
  28.         {
  29.             case 0:
  30.                 MoveJxb(place0,0);
  31.                 break;
  32.             case 1:
  33.                 MoveJxb(place1,0);
  34.                 break;
  35.             case 2:
  36.                 MoveJxb(place2,0);
  37.                 break;
  38.             default:
  39.                 break;
  40.         }
  41.     }
  42. }
复制代码
Transform的方法扩展
  1. using UnityEngine;
  2. using DG.Tweening;
  3. using System;
  4. public static class TransformExtention
  5. {
  6.     public static void RotateX(this Transform transform, float x, float duration, Action action)
  7.     {
  8.         Vector3 my_EulerAngles = transform.eulerAngles;
  9.         transform.DOLocalRotate(new Vector3(x, 0, 0), duration).OnComplete(() => action());
  10.     }
  11.     public static void RotateY(this Transform transform, float y, float duration, Action action)
  12.     {
  13.         Vector3 my_EulerAngles = transform.eulerAngles;
  14.         transform.DOLocalRotate(new Vector3(0, y, 0), duration).OnComplete(() => action());
  15.     }
  16. }
复制代码


demo下载地址:下载

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-9-11 17:34 | 显示全部楼层
搂主  下载地址没有嘛?
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-3 12:31 , Processed in 0.094739 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表