Unity铰链四杆机构设计和运动仿真

本文详细介绍了如何在Unity中利用铰链四杆机构的原理,设定参数后自动生成模型,通过计算角度和距离确定各部件位置,提供关键代码实现,以及机械原理的运动分析公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、效果图

设定好各边长度和转速后,点击【设置并启动】,自动生成一个机构模型,并按照原理进行运转
请添加图片描述

二、铰链四杆机构介绍

机架:A和D是固定位置,叫做机架。
曲柄:B点绕A点旋转,构成曲柄。
连杆:C点和B点相连,构成连杆。
摇杆:C点绕着D点转动,构成摇杆。

在这里插入图片描述
请添加图片描述

三、运动原理

1、机构示意图
在这里插入图片描述

第一步:计算Φ1(∠BAD)

曲柄转动了多少度

第二步:计算BD的长度

已知B点和D点位置,计算BD的长度,可用机械公式计算,或者直接使用Vector3.Distance计算。
在这里插入图片描述

第三步:计算∠ΦDB(∠BDA’)

  • (1)用机械原理公式计算的依据:
    在这里插入图片描述

  • (2)直接用Unity向量距离api计算:

Vector3.Distance(A, D);//示例代码

第四步:计算计算∠Φ3的值

只能用机械原理的公式计算:
在这里插入图片描述

第五步:根据∠Φ3计算C点位置

∠Φ3已知的时候,在射线DC上取C点

四、关键代码实现

代码为计算部分的代码,仅供交流学习之用。

    /// <summary>
    /// 计算曲柄和摇杆位置
    /// </summary>
    /// <returns></returns>
    bool JiSuanWeiZhi()
    {
        //设定B的位置  AB = a
        var posB = A.transform.position + (B.transform.position - A.transform.position).normalized * (float)a_AB;
        B.transform.position = posB;
      
        //计算Φ1(∠BAD)
        double phi1 = Vector3.Angle(B.transform.position - A.transform.position, D.transform.position - A.transform.position);
        //象限判断
        if (B.transform.position.y < A.transform.position.y)
        {
            phi1 = 360 - phi1;
        }
        
        //公式计算lenDB的值
        var lDB2 = math.sqrt(a_AB * a_AB + d_DA * d_DA - 2 * a_AB * d_DA * Cos(phi1.ToRadians()));
        
        //计算ΦDB(∠BDA')
        double phiDB = Vector3.Angle(B.transform.position - D.transform.position, D.transform.position - A.transform.position);
        //象限处理
        if (B.transform.position.y < A.transform.position.y)
        {
            phiDB = 360 - phiDB;
        }
        
        //计算Φ3的值
        var phi3 = phiDB - Acos((c_CD*c_CD + lDB2 * lDB2 - b_BC * b_BC)/(2 * c_CD * lDB2)).ToDegrees();
        
        //摆放C点
        if (double.IsNaN(phi3))
        {
            Debug.Log($"无法计算Φ3的值  {(c_CD*c_CD + lDB2 * lDB2 - b_BC * b_BC)/(2 * c_CD * lDB2)}");
            return false;
        }
        else
        {
            Quaternion q = Quaternion.AngleAxis((float)phi3, new Vector3(0,0,1));
            var dir  = q * (D.transform.position - A.transform.position);
            C.transform.position = D.transform.position + dir.normalized * (float)c_CD;
        }
        return (true);
    }

五、机械原理附录:

1、平面示意图

2、运动分析公式——位置计算

在这里插入图片描述

3、运动分析公式——速度计算

在这里插入图片描述

4、运动分析公式——加速度计算

在这里插入图片描述

org.mockito.exceptions.base.MockitoException是一个Mockito框架的异常,它表示在使用Mockito进行单元测试时出现了问题。根据引用\[1\]引用\[2\],这个异常可能是由于使用了不支持创建静态模拟对象的MockMaker或者在当前线程中已经注册了静态模拟对象引起的。而根据引用\[3\],这个异常也可能是由于无法模拟或者监视final类引起的。 要解决这个异常,可以尝试以下几种方法: 1. 检查使用的MockMaker是否支持创建静态模拟对象。如果不支持,可以尝试使用其他支持静态模拟对象的MockMaker。 2. 检查当前线程是否已经注册了静态模拟对象。如果是,可以尝试在使用之前取消注册或者在新的线程中进行测试。 3. 如果异常是由于无法模拟或者监视final类引起的,可以尝试使用PowerMock等其他工具来处理final类的模拟或者监视。 需要根据具体情况来选择适合的解决方法。 #### 引用[.reference_title] - *1* *2* [Mockito -- 如何Mock Util类中的static 方法?](https://blog.csdn.net/qq_41055045/article/details/126977753)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Mockito与PowerMock使用问题:Argument should be a mock, but is: class java.lang.Class](https://blog.csdn.net/qq_36059826/article/details/109319531)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值