基于Unity3d的虚拟装配中的机械运动仿真

  • 前言
  • 1.创建缸体相关的物体和对象
  • 2.鼠标随意拖动和旋转物体的脚本
  • 3.利用标记点进行虚拟装配
  • 4.缸体的旋转

前言

在研究基于unity3d的虚拟装配的过程中,查阅了很多资料,本人对其中的机械运动模拟比较感兴趣。其中我认为比较厉害的是Mogoson的机械机构关节绑定和传动插件(链接:link)但是由于没有文档说明,而且泛用性不是很好,我一直没有用自己的模型尝试成功。所以自己写了一个项目,来模拟其中缸的运动。该文章只是抛砖引玉,希望各位大佬能多多指教。

最终效果图:

1.创建缸体相关的物体和对象


先创建两个圆柱,错位摆放,一个短(y的缩放值为1),一个长(y的缩放值为2),在两个圆柱上做标记(创建空的子物体),mark1是Cylinder(1)的子物体的坐标为(0,-1,0),mark和markRotate是Cylinder的子物体,坐标分别为(0,1,0)和(0,-1,0)。其中mark和mark1是用于虚拟装配的标记点,markRotate是用来模拟缸底铰链的,可以使缸绕该点旋转。


2.鼠标随意拖动和旋转物体的脚本

下面这段代码是鼠标随意拖动和旋转物体的脚本,脚本提供了一个接口moveTarget,使用时将该脚本添加在相应物体上,在把需要移动的物体拖到moveTarget处。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class move : MonoBehaviour
{//旋转速度public float xSpeed = 250.0f;public float ySpeed = 120.0f;//旋转角度private float x = 0.0f;private float y = 0.0f;public Transform moveTarget;//移动的对象//偏移值Vector3 m_Offset;//当前物体对应的屏幕坐标Vector3 m_TargetScreenVec;void Start (){}//物体移动private IEnumerator OnMouseDown(){//当前物体对应的屏幕坐标m_TargetScreenVec = Camera.main.WorldToScreenPoint(transform.position);//偏移值=物体的世界坐标,减去转化之后的鼠标世界坐标(z轴的值为物体屏幕坐标的z值)m_Offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, m_TargetScreenVec.z));//当鼠标左键点击while (Input.GetMouseButton(0)){//当前坐标等于转化鼠标为世界坐标(z轴的值为物体屏幕坐标的z值)+ 偏移量transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y, m_TargetScreenVec.z)) + m_Offset;//等待固定更新yield return new WaitForFixedUpdate();}}void Update(){//物体旋转RaycastHit hit;Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);if (Physics.Raycast(ray, out hit) && Input.GetMouseButton(1)&&hit.collider.tag==moveTarget.tag)//旋转的判断条件为射线接触到物体,且接触物体的标签是该脚本绑定物体的标签,且按下了鼠标右键{//Input.GetAxis("MouseX")获取鼠标移动的X轴的距离x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;//欧拉角转化为四元数Quaternion rotation = Quaternion.Euler(y, x, 0);transform.rotation = rotation;}//物体缩放if (Input.GetAxis("Mouse ScrollWheel") != 0){//鼠标滚动滑轮 值就会变化if (Input.GetAxis("Mouse ScrollWheel") < 0){//范围值限定if (Camera.main.fieldOfView <= 100)Camera.main.fieldOfView += 2;if (Camera.main.orthographicSize <= 20)Camera.main.orthographicSize += 0.5F;}//Zoom in  if (Input.GetAxis("Mouse ScrollWheel") > 0){//范围值限定if (Camera.main.fieldOfView > 2)Camera.main.fieldOfView -= 2;if (Camera.main.orthographicSize >= 1)Camera.main.orthographicSize -= 0.5F;}}}

该move脚本是受到了这些文章(射线检测link)(unity使用鼠标控制移动、缩放、旋转link)的影响,自己改进了一些,达到了鼠标指在那个物体,那个物体就动的效果。当然还可以添加高亮组件link。

3.利用标记点进行虚拟装配

该案例使用的是同轴约束装配。利用两个标记点计算出它们之间的欧拉角和位置向量,再利用算出的欧拉角和位置向量来修正两个物体之间的位置和旋转角,以达到两个标记点在一定条件下重合的效果。同时可以通过移动标记点mark,实现缸柱塞的伸缩运动。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Assembly2 : MonoBehaviour
{public Transform thisObject;//本身的接口public Transform targetObject;//装配目标的接口private float d;//两个物体之间的距离public Transform mark;//本身的标记public Transform targetMark;//装配目标的标记// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){d = Vector3.Distance(targetObject.position, thisObject.position);//算出两物体之间的距离向量Vector3 moveVector = mark.transform.position - targetMark.transform.position;//算出两标记之间的距离向量Vector3 RotateAixX = Vector3.Cross(targetObject.transform.up, thisObject.transform.up);//算出两物体y方向向量的叉乘float angleX = Vector3.Angle(targetObject.transform.up, thisObject.transform.up);//算出两物体y方向向量的角度if(d <= 5)//当两物体的距离小于5m时,开始标记重合{targetObject.transform.Rotate(RotateAixX, angleX, Space.World);targetMark.transform.parent.transform.Translate(moveVector, Space.World);}if (Input.GetKey(KeyCode.W) && d <= 4)//按下W,进行缸体柱塞的伸出移动{mark.transform.Translate(Vector3.up * Time.deltaTime);}if (Input.GetKey(KeyCode.W) && d > 4)//限位{mark.transform.Translate(Vector3.down * 10*Time.deltaTime);}if (Input.GetKey(KeyCode.S) && d <= 4)//按下W,进行缸体柱塞的缩回移动{mark.transform.Translate(Vector3.down * Time.deltaTime);}if (Input.GetKey(KeyCode.S) && d > 4)//限位{mark.transform.Translate(Vector3.up * 10 * Time.deltaTime);}}
}

该脚本被我加载在Cylinder上,按照提示将相应的组件拖入

参考文章:使用unity进行零件装配link。

4.缸体的旋转

以markRotate标记为中心,绕x轴旋转,模拟铰链的旋转。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Rotate1 : MonoBehaviour
{public Transform rotateMark;//旋转标记public Transform rotateObject;//旋转目标public float rotateSpeed = 1.0f;//旋转速度private float x = 0.0f;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){Vector3 rotateAxis = rotateMark.transform.right;//将x轴记录在rotateAxis中if (Input.GetKey(KeyCode.A))//正转{x = rotateSpeed * Time.deltaTime;rotateObject.RotateAround(rotateMark.position, rotateAxis, x);//以rotateMark的位置为中心,绕x轴,旋转x角度。}if(Input.GetKey(KeyCode.D))//反转{x = -(rotateSpeed * Time.deltaTime);rotateObject.RotateAround(rotateMark.position, rotateAxis, x);}}
}

做完这些,就可以达到最终效果啦!

请各位大佬多多指教,希望大家可以分享一些优秀的虚拟装配相关文章给我。

基于Unity3d的虚拟装配中的机械运动仿真相关推荐

  1. unity3d 模拟电脑实现_基于Unity3D的机器人仿真实验系统

    龙源期刊网 http://www.qikan.com.cn 基于 Unity3D 的机器人仿真实验系统 作者:庄严 卢阿丽 杨庆 来源:<电子技术与软件工程> 2018 年第 03 期 摘 ...

  2. matlab中基于cdma的锁相环,答辩-基于MATLAB的CDMA通信系统设计与仿真.ppt

    基于MATLAB的CDMA通信系统设计与仿真 目录 研究背景 研究方法 CDMA各部分仿真 CDMA系统仿真总图 结果分析 致谢 * 研究背景 20世纪60年代以来,随着民用通信事业的发展,频带拥挤问 ...

  3. matlab端到端仿真中基站功率,基于matlab的cdma通信系统分析及仿真

    基于matlab的cdma通信系统分析及仿真 毕业设计 I 摘 要 利用 MATLAB 平台的 SIMULINK 可视化仿真功能,结合 CDMA 的实际通 信情况,利用 MATLAB 组建出完整的 C ...

  4. MATLAB多径衰落信道仿真程序,基于Matlab的移动通信中多径衰落信道的仿真

    移动通信中多径衰落信道的仿真 文章编号:1007-3558(2004)05-0078-04 基于Matlab的移动通信中多径衰落信道的仿真 陈岚,,万国春,,冯志彪2 (1.江西科技师范学院,江西南昌 ...

  5. 弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

    弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩 IP核:知识产权核,指某一方提供的.形式为逻辑单元的可重用模块.IP核通常已经通过了设计验证,设计人员以IP核为基础进行设计,可以 ...

  6. 基于Matlab模拟、检测和跟踪飞机着陆进场中异常的仿真(附源码)

    目录 一.介绍 二.生成和标记轨迹 三.定义方案 四.运行方案并检测异常轨道 五.将跟踪异常报告与事实进行比较 六.总结 七.程序 该示例显示了如何自动检测最终接近机场跑道的飞机的偏差和异常.在此示例 ...

  7. 基于paddledetection在ROS中搭建红绿灯检测控制车模运动(3)—— 使用训练结果在ros中仿真红绿灯控制小车运动

    前言 第一节: 基于paddledetection在ROS中搭建红绿灯检测控制车模运动(1)-- 环境搭建准备以及软件安装 第二节: 基于paddledetection在ROS中搭建红绿灯检测控制车模 ...

  8. 弯曲圆波导matlab_基于MATLAB编程的圆形波导中能流密度分布图仿真

    基于 MATLAB 编程的圆形波导中能流密度分布图仿真 王永龙 ; 夏昌龙 ; 刘朋 [期刊名称] <临沂大学学报> [年 ( 卷 ), 期] 2008(030)003 [摘要] 基于 M ...

  9. unity 陶瓷质感_一种基于Unity3D的虚拟陶瓷设计方法与流程

    本发明涉及虚拟现实领域,特别涉及一种基于Unity3D的虚拟陶瓷设计方法. 背景技术: 陶艺工艺制作环境要求严格:不仅在拉坯成型需要利用旋转机器,在烧制过程则需要窑炉锻造,如何将陶瓷制作工艺与虚拟现实 ...

最新文章

  1. 故事营销:一个具有争议的成功营销案例
  2. 许昌电气学校电话计算机,许昌电气职业学院
  3. Placing a Method with Eval parameter into a DataList
  4. oracle可以在liux上装_【Oracle】手把手教你做之Linux上安装Oracle11g
  5. Matlab实现二进制矩阵转换为十进制
  6. CSS3 box-sizing(content-box:width指内容 border-box:width指border+padding+content)
  7. 07.用户故事与敏捷方法——优秀用户故事准则笔记
  8. 标贝科技语音论文入选全球顶级语音学术大会INTERSPEECH2019
  9. 【转载】VC遍历文件夹下所有文件和文件夹
  10. Fiddler4抓包工具使用教程
  11. 汉王考勤管理软件mysql数据库配置_汉王人脸通考勤管理软件
  12. 学习了pr后的收获_学习后的感想和收获
  13. MyBatis_查询缓存01
  14. java对象的内存分配流程
  15. NodeJS 创建静态资源服务器
  16. C/C++在线餐馆预订管理系统
  17. SVG排版公众号图文『实时计算日期差』模板代码
  18. Hyper_端对端LPR_DNN_源码解析
  19. CSAPP第二章家庭作业参考答案
  20. Azure Blob 存储

热门文章

  1. ADF4350调试记录及频点锁定
  2. 用拼音输入希腊字母的方法
  3. python实现的电影票房数据可视化
  4. 解决简历模板无法生成下一页
  5. android 很多牛群叉界面库github地址
  6. OSPF/2/NBRCHG:The status of the non-virtual neighbor changes.
  7. CoordinatorLayout + AppBarLayout + CollapsingToolbarLayout
  8. 西南交通大学计算机考研资料汇总
  9. Chrome 66之后禁止网页声音自动播放问题解决
  10. android自定义相机打开闪光灯,Android 照相机(闪光灯,切换摄像头)