机器人与机电一体化3D数字孪生机器-Day7

一、课程回顾

  • 课程衔接: 上一节课已完成传送带模型的导入。
  • 本次操作: 对传送带预制体执行完全解包操作。
    • 选择完全解包而非部分解包,以便获得全部组件的编辑权限。
二、本节目标
  • 核心任务: 为传送带添加动画效果,使其产生真实的物理交互。
  • 实现方式: 通过为材质和旋转部分添加多个脚本来实现。
  • 效果追求: 尽可能让传送带的运动效果看起来真实。
三、创建地面
  • 创建原因: 避免物体悬空漂浮,需要搭建地面支撑。
  • 操作步骤:
    • 创建一个空对象,命名为"地板"。
    • 再创建一个立方体,命名为"地板一"。
  • 调整说明: 对初始立方体的外观不满意,后续会继续调整其作为地面的形态。
四、创建立方体作为地面
1. 调整地板形状
  • 初始状态: 场景中默认的立方体(Cube)被用作地板,但尺寸和比例并不合适。
  • 调整思路: 通过修改缩放(Scale)值来改变立方体的形状,使其成为扁平的地板。
    • 首先解除缩放限制,方便自由调整各轴比例。
    • 将立方体在水平方向(X轴和Z轴)上扩大,使其覆盖面积更大。
    • 在垂直方向(Y轴)上压缩,使其变薄,形成地板的外观。
    • 操作细节: 在 Inspector 面板中修改 Transform 组件的 Scale 属性。
      • 水平方向(X轴和Z轴)数值增大,如 X: 142.75,Z: 227.7。
      • 垂直方向(Y轴)数值减小,如 Y: 0.88,使其变薄。
2. 调整地板位置
  • 位置调整: 将地板移动到场景中合适的位置,使其位于视野中央。
    • 通过拖拽或修改 Position 属性,将地板向下移动(Y轴负方向),使其贴合地面。
  • 视角检查: 按住 Shift 键并点击鼠标左键进行旋转,从不同角度观察地板效果。
    • 若发现地板尺寸仍不够大,可继续调整 Scale 数值,直到满意为止。
  • 完成效果: 经过缩放和位置调整后,地板已准备就绪,可以继续后续的材质和场景搭建工作。
五、创建材质
1. 创建并命名材质
  • 创建材质: 在 Project 窗口中右键选择 Create → Material,创建一个新的材质资源。
  • 命名材质: 为材质命名,便于后续识别和管理。
2. 设置材质颜色
  • 修改颜色: 选中材质后,在 Inspector 面板中点击 Albedo 属性旁边的颜色框,打开颜色选择器。
  • 颜色选择: 将颜色调整为蓝色或紫色调,使地板具有独特的视觉效果。
  • 应用材质: 将创建好的材质拖拽到场景中的地板对象上,完成材质赋予。
3. 后续规划
  • 光照调整: 当前场景中光线过强,后续需要调整光照强度或角度。
  • 添加墙壁: 计划在场景中添加墙壁,丰富场景结构。
六、创建墙
1. 场景搭建与材质创建
  • 场景搭建方式:在场景中创建一个立方体,并沿各个方向(包括向上)进行扩展,以搭建基础环境。
  • 阴影效果:扩展立方体后,场景中开始出现阴影,视觉表现有所改善。
  • 创建立方体:在场景中新建一个立方体对象,作为搭建环境的基础元素。
  • 扩展操作:将立方体沿所需方向(包括向上)进行拉伸或缩放,以适配场景需求。
  • 阴影效果:完成立方体扩展后,场景中出现了阴影,整体视觉效果有所提升。
1)创建新材质
  • 新建材质:在项目中新建一个材质资源,用于后续调整物体表面颜色。
  • 颜色选择:为新材质挑选更深的颜色,以改善物体的视觉表现。
  • 应用材质:将新创建的材质应用到立方体上,使其呈现所选颜色。
  • 模拟准备:完成材质设置后,即可开始进行模拟操作。
七、创建旋转轴
1. 创建第一个旋转轴
  • 旋转轴的作用:为所有需要转动和旋转的物体提供一个统一的旋转中心。
  • 创建原因:直接旋转物体时,物体会围绕自身中心旋转,导致"漂浮"和"飞行",无法实现预期的旋转效果。
  • 创建方法:使用圆柱体(Cylinder)创建旋转轴,因为需要的是一个延伸的轴。
  • 旋转轴参数设置:
    • 将圆柱体旋转90度,使其水平放置。
    • 调整缩放比例,使轴变细变长,例如将X和Z轴缩放值同时设为0.05。
    • 易错点:X和Z轴必须同时减小,否则圆柱体会被"压扁"变形。
  • 居中调整:切换到顶视图和前视图,手动调整位置,使其尽量居中。
  • 命名:将第一个旋转轴命名为"驱动轴"(Drive Pivot),因为它位于靠近电机的驱动区域。
2. 创建第二个旋转轴
  • 创建方法:复制第一个旋转轴,命名为"后置轴"(Back Pivot)。
  • 位置调整:将后置轴移动到合适的位置,并尝试居中。
  • 隐藏旋转轴:旋转轴本身不需要在场景中显示,可以通过禁用网格渲染器(Mesh Renderer)来隐藏它们。
3. 扩展皮带
  • 下一步任务:扩展平带(Flat Belt),并将所有需要旋转的部件添加到对应的旋转轴上。
4. 添加所有涉及旋转的部件
  • 添加原则:将所有涉及旋转的部件,如轴、轴承、皮带轮等,添加到对应的旋转轴下,成为其子物体。
  • 驱动轴部件:将轴、轴承、皮带轮插头等部件依次拖入驱动轴层级中。
  • 旋转轴参数调整:
    • 在添加部件前,需要先设置旋转轴的旋转参数。
    • 将Z轴设为90,Y轴设为90,X轴保持0。
    • 这样设置后,旋转X轴即可实现正确的旋转效果。
  • 易错点:如果旋转轴参数设置不正确,旋转时会发现物体旋转方向错误。
  • 验证方法:旋转X轴,观察所有部件是否都围绕旋转轴正确旋转。
1)添加轴承和滑轮
  • 后置轴参数设置:使用与驱动轴相同的参数,将Z轴和Y轴都设为90。
  • 添加部件:将轴、轴承、皮带轮等部件依次添加到后置轴下。
  • 验证方法:旋转后置轴,确认所有部件都正确旋转。
  • 整理层级:将旋转轴折叠起来,所有运动部件都存放在对应的旋转轴下,方便管理。
2)用一个启动按钮同时旋转它们
  • 需求分析:传送带有两个旋转点,需要用一个启动按钮同时控制它们旋转。
  • 实现方法:
    • 创建一个名为"Scripts"的新文件夹。
    • 添加一个C#脚本,命名为"ConveyorBelt"之类的名称。
    • 在脚本中编写控制两个旋转轴旋转的逻辑。
八、编写ConveyorPulleys脚本
1. Update方法讲解
  • 脚本简化思路:移除Start方法,仅保留一个速度参数即可实现旋转功能。
    • 速度参数类型为float,初始值设为50.0f。
    • 不需要Start方法,只需在Update中编写旋转逻辑。
  • 旋转实现:使用 transform.Rotate 方法,传入 Vector3.up 作为旋转轴。
    • 旋转角度为 speed * Time.deltaTime,确保旋转速度与帧率无关。
    • 使用Time.deltaTime的原因:将速度从"每帧旋转量"转换为"每秒旋转量",保证不同帧率下旋转速度一致。
  • 旋转轴选择:使用 Vector3.up(即Y轴向上方向)作为旋转轴。
    • 方向问题:旋转点的方向是90度,因此需要明确指定旋转轴。
    • 坐标轴关系:当Y和Z固定时,X轴是正在旋转的那个轴。
  • 旋转轴理解:Vector3.up 表示Y轴正方向,即物体绕Y轴旋转。
    • 当Y和Z坐标固定时,X轴方向发生变化,实现旋转效果。
  • 扩展思路:如果场景中有多个旋转点,可以将它们都传递给脚本,并同时旋转它们。
    • 这样可以实现多个物体同步旋转的效果。
九、传递游戏对象
1. 问题:为每个多边形单独添加脚本
  • 原始方法的局限:如果场景中有多个需要旋转的物体,为每个物体单独添加旋转脚本非常繁琐。
    • 需要为每个多边形单独添加一个脚本。
    • 还需要在每个多边形上添加一个启动按钮。
    • 这种做法既烦人又没有意义。
  • 改进思路:按下开始时,希望所有物体一起开始旋转,而不是逐个操作。
2. 声明公共游戏对象
  • 核心方法:在脚本中声明公共游戏对象(public GameObject),用于传递需要旋转的物体引用。
    • 声明 public GameObject frontPoly:用于传递前驱动滑轮。
    • 声明 public GameObject backPoly:用于传递后滑轮。
  • 旋转逻辑:在Update方法中,通过 frontPoly.transform.Rotate(...) 和 backPoly.transform.Rotate(...) 分别旋转两个滑轮。
    • 这样就不需要为每个滑轮单独附加脚本,只需在Inspector面板中将对应的滑轮对象拖入即可。
3. 添加启动按钮
  • 声明公共布尔变量:public bool start = false; 用于控制是否开始旋转。
    • 初始值为 false,表示默认不旋转。
  • 条件判断:在Update方法中,使用 if (start) { ... } 包裹旋转代码。
    • 只有按下启动按钮(将start设为true)时,滑轮才会开始旋转。
  • 易错点:注意 Rotate 方法首字母大写,是 transform.Rotate(...) 而不是 transform.rotate(...)。
4. 测试运行
  • 测试步骤:将脚本挂载到旋转点对象上,在Inspector中将前驱动滑轮和后滑轮分别拖入对应的公共变量槽位。
  • 运行结果:按下开始按钮后,两个滑轮同时开始旋转。
    • 增加速度值后,滑轮旋转更快,移动距离更远。
    • 轴承的旋转也验证了传动效果。
十、添加集中控制的开始按钮
1. 创建开始按钮脚本
  • 核心思路:创建一个独立的"开始按钮"脚本,作为集中控制的开关,供其他脚本读取状态。
  • 创建步骤:
    • 新建一个C#脚本,命名为 StartButton。
    • 在脚本中声明一个 public bool start 变量,并设置初始值为 false。
    • 脚本中无需编写其他逻辑,保持原样即可。
  • 脚本挂载:由于脚本必须挂载到场景中的物体上才能生效,可以创建一个名为"Start"的空物体(Empty Object),将 StartButton 脚本挂载到该空物体上。
2. 修改ConveyorPulleys和BeltAnimation脚本
  • 脚本间传递:在需要控制的其他脚本(如 ConveyorPulleys 和 BeltAnimation)中,声明一个 public StartButton script; 类型的变量,即可引用 StartButton 脚本。
  • 移除内部开关:删除 ConveyorPulleys 脚本中原本的 public bool start = false; 变量,不再使用内部开关。
  • 判断开始状态:在 Update() 方法中,通过 if (script.start) 判断 StartButton 脚本中的 start 变量是否为 true,从而控制动画是否运行。
  • 同步修改:对 BeltAnimation 脚本执行同样的操作:
    • 添加 public StartButton script; 变量。
    • 在 Update() 方法中添加相同的 if (script.start) 判断语句。
  • 保存脚本:修改完成后,记得保存所有脚本,确保更改生效。
十一、传送带物理仿真交互
1. 传送带脚本设置
  • 脚本关联逻辑:每个对象都关联着对应的脚本,形成完整的驱动链。
    • 传送带滑轮(Pulley)脚本:负责旋转滑轮,挂载在枢轴(Pivot)对象上。
    • 传送带(Belt)脚本:负责为皮带添加动画,挂载在皮带(Belt)对象上。
    • 开始(Start)脚本:作为统一的启动控制,等待被传递给各个需要启动的组件。
  • 开始脚本的传递方式:传送带和滑轮都在等待开始脚本,只需将开始按钮拖放到对应位置即可完成传递。
  • 空对象的作用:当某个脚本没有明确的对象可以挂载时,可以将其挂载到一个空对象(Empty Object)上,按需灵活处理。
2. 连接开始按钮的问题
  • 问题现象:按下开始按钮后,滑轮正常旋转,但皮带没有动画效果。
  • 问题原因:皮带脚本没有连接到任何开始按钮,导致它没有收到启动信号。
  • 解决方法:将皮带脚本与开始按钮建立连接,问题即可解决
  • 速度调整:连接后运行正常,但速度过快,可将速度值调低(如减到1)。
  • 速度控制扩展:可以为传送带动画和滑轮动画分别添加速度控制参数,便于后续独立调节。
3. 速度分开的问题
  • 问题描述:当前滑轮(枢轴)的旋转速度与传送带的运行速度是分开设置的。
  • 操作痛点:调整速度时,需要在滑轮对象和传送带对象之间来回切换,操作繁琐且效率低。
  • 改进方向:后续可以考虑将两者的速度统一到一个控制脚本中,避免频繁切换调整。
十二、知识小结

|-----------|------------------|---------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------|------|
| 知识点 | 核心内容 | 操作要点 | 易混淆点 | 难度系数 |
| 环境搭建 | 创建地板与墙壁 | 创建空对象命名为"地板",添加立方体并调整缩放(扩展XZ轴、压缩Y轴);创建材质并设置颜色(蓝色/紫色),添加墙壁改善阴影效果 | 立方体缩放时需先解除限制再调整,否则比例失真 | ⭐⭐ |
| 旋转轴(铰链)创建 | 为传送带部件建立正确的旋转中心 | 创建空对象作为旋转轴,使用圆柱体作为轴体(缩放XZ为0.05),旋转90度(X轴),命名为"驱动轴"和"后置轴";禁用网格渲染器隐藏轴体 | 圆柱体缩放时X和Z轴必须同时调整,否则会被压扁 | ⭐⭐⭐ |
| 旋转轴参数设置 | 解决旋转偏移问题 | 旋转轴初始旋转参数需设为Z=90、Y=90,此时X轴为实际旋转轴;否则物体会围绕错误轴心旋转 | 必须先设置好旋转参数,再添加子物体,否则需重新调整 | ⭐⭐⭐⭐ |
| 部件挂载与层级管理 | 将所有旋转部件归类到对应旋转轴下 | 驱动轴:轴、轴承、滑轮插件×2;后置轴:轴、轴承×2、皮带轮;通过拖拽将部件设为旋转轴的子物体 | 注意区分轴承与皮带轮,避免挂载错误 | ⭐⭐⭐ |
| 传送带旋转脚本 | 使用C#脚本控制双轴同步旋转 | 创建ConveyorPulley脚本,声明frontPulley和backPulley两个GameObject变量;使用transform.Rotate(Vector3.up * speed * Time.deltaTime);通过public bool start控制启停 | Rotate方法需大写R;旋转方向由Vector3.up决定 | ⭐⭐⭐ |
| 皮带动画脚本 | 实现传送带表面纹理移动 | 创建ConveyorAnimation脚本,使用material.mainTextureOffset控制UV偏移;需调整X轴偏移量(正负值决定方向),速度设为1以匹配滑轮转速 | X轴与Y轴偏移方向易混淆;需与滑轮速度匹配 | ⭐⭐⭐ |
| 集中控制机制 | 通过单一按钮同时控制所有动画 | 创建StartButton脚本(仅含public bool start变量);挂载到空对象;在ConveyorPulley和ConveyorAnimation中声明public StartButton script变量,通过if(script.start)控制运行 | 必须将StartButton脚本拖拽赋值给两个控制脚本,否则无法触发 | ⭐⭐⭐⭐ |
| 速度匹配与方向校正 | 确保皮带与滑轮运动同步 | 皮带偏移速度设为1,滑轮旋转速度设为50;若方向相反,将皮带偏移量改为负值 | 皮带与滑轮速度不匹配会导致视觉不同步 | ⭐⭐⭐ |

相关推荐
8486981191 小时前
RAGFlow v1.0 企业级 RAG 落地实录:从零部署到 RAGAS 评估闭环(全踩坑记录)
人工智能·大模型·rag·ragflow·ragas
yangmu32031 小时前
万字长文拆解:AI视频生成(SVD/Sora类)的底层技术原理与实现路径
人工智能·音视频
Sunday_ding1 小时前
四种AI知识管理架构全面对比与务实选型
人工智能·ai·rag·llamaindex·pageindex
Jsundoku1 小时前
第九章 机器学习 -- 模型评估与调优
人工智能·机器学习·模型评估与调优
李航19831 小时前
DeepSeek AI建模(二)让AI建第一个模型
人工智能·python·计算机视觉·ai·ai编程
二宝哥1 小时前
03.Spring AI Embedding 实战:从向量化原理到项目落地
人工智能·spring boot·向量·spring ai
涛声依旧-底层原理研究所1 小时前
Agent 沙箱实现原理:拆解 DeepSeek Harness 的三层沙箱架构与三平台后端
人工智能·架构
推送者1 小时前
大将怪兽桌宠教程:从一张正脸照到本地透明桌宠的工程化路线
人工智能·大将怪兽桌宠教程
shennv8881 小时前
2026年国内如何开通ChatGPT Plus和Pro?订阅方式、Codex额度及常见问题整理
人工智能·chatgpt