当前位置: 首页 > news >正文

uniapp中加载.urdf后缀的3D模型(three.js+urdf-loader)

安装包

{"dependencies": {"sass": "^1.90.0","three": "^0.179.1","urdf-loader": "^0.12.6"}
}

1、准备好.urdf模型放在uniapp目录中的/static/model目录下面

在这里插入图片描述

2.查看urdf文件里面filename加载的路径(兼容于uniapp)

例如:

 <mesh filename="package://piper_description/meshes/dae/base_link.dae" />

如果urdf文件里面有这种package://开头的路径,则需要替换成:

<mesh filename="meshes/dae/base_link.dae" />

这里需要注意das文件需要放在/static/model/meshes/dae目录下面,如上图目录所示
原因:

  • package://的依赖性
    package://是ROS特有的路径解析协议,依赖ROS环境(如roslaunch或rosrun)动态解析包路径。
    如果直接在非ROS环境(如纯Gazebo、Web应用或静态文件服务器)中使用URDF,系统无法识别package://,导致模型加载失败。
  • 静态部署的兼容性
    当URDF文件需要部署到不支持ROS的场景(如通过HTTP服务器加载模型),必须使用相对路径或绝对路径,确保文件能被正确解析。

3、代码中编写

这里需要格外注意一下js中的urdf路径是否正确,请查看我标记的【重点】字眼

<template><view class="robot-model-container"><!-- three.js 渲染容器 --><view ref="container" class="canvas-container"></view></view>
</template>
	import {ref,onMounted,onBeforeUnmount} from 'vue'import * as THREE from 'three'import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls.js'import URDFLoader from 'urdf-loader'const {windowWidth,windowHeight} = uni.getSystemInfoSync()const container = ref(null)let renderer, scene, camera, controls, robot;onMounted(() => {// 创建场景scene = new THREE.Scene()scene.background = new THREE.Color(0xeeeeee) //设置背景颜色// 相机camera = new THREE.PerspectiveCamera(45, 1, 0.1, 1000)camera.position.set(0.7, 0.7, 0.7) //视觉大小// 渲染器renderer = new THREE.WebGLRenderer({antialias: true})renderer.setSize(windowWidth, windowHeight) // 固定大小,避免 uniapp 没有 windowcontainer.value.$el.appendChild(renderer.domElement)// 光源const light = new THREE.DirectionalLight(0xffffff, 1)light.position.set(10, 10, 10)scene.add(light)scene.add(new THREE.AmbientLight(0x404040))// 控制器controls = new OrbitControls(camera, renderer.domElement)// 加载 URDF 模型const loader = new URDFLoader()loader.packages = {piper_description: '/model' // 对应public目录下的资源路径【重点】}loader.load('/static/model/xxxxxx.urdf', (urdf) => { //路径【重点】robot = urdfrobotControl.value = urdfrobot.rotation.x = -Math.PI / 2scene.add(robot)console.log('控制列表==========', robot.joints);animate()})})onBeforeUnmount(() => {if (renderer) {renderer.dispose()}})// 动画循环function animate() {requestAnimationFrame(animate)controls.update()renderer.render(scene, camera)}

4、控制3D模型可以控制器

在上面代码中我们可以获取到控制器列表robot.joints
下面是一段进行控制器的代码

function rebackFun() {//这里需要自己去打印看一下robot.joints有哪些控制器名称,还有它的取值范围是多少robot.joints.joint1.setJointValue(0)
}
http://www.dtcms.com/a/350009.html

相关文章:

  • 灰狼算法+四模型对比!GWO-CNN-BiLSTM-Attention系列四模型多变量时序预测
  • day62 Floyd 算法 A * 算法
  • 【GPT入门】第58课 感性认识Imdeploy介绍与实践
  • GPT-5评测
  • .prettierrc有什么作用,怎么书写
  • 考研复习-操作系统-第三章-内存管理
  • LRU实现
  • 【YOLOv5部署至RK3588】模型训练→转换RKNN→开发板部署
  • 冯·诺依曼架构:现代计算机的基石与瓶颈
  • 创新BIM技术在大型冶金综合管网项目中的应用
  • redis知识点
  • MyBatis-Plus 快速入门 -常用注解
  • response.json()与 json.loads(json_string)有何区别
  • 2025年5月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(一)
  • 【Java】 Spring Security 赋能 OAuth 2.0:构建安全高效的现代认证体系
  • spring boot开发:一些基础知识
  • 5分钟了解单元测试
  • 大数据量的ArrayList怎么获取n个元素
  • Ansible 环境配置(基于 RHEL 9)
  • 文件权限详解
  • Allegro-过孔篇(普通VIA,盲埋孔)
  • SOME/IP-SD报文中 Entry Format(条目格式)-理解笔记1
  • 新的 macOS 安装程序声称能够快速窃取数据,并在暗网上销售
  • 第四章:大模型(LLM)】07.Prompt工程-(12)评估prompt的有效性
  • 【LIN】2.LIN总线通信机制深度解析:主从架构、五种帧类型与动态调度策略
  • maven-default-http-blocker (http://0.0.0.0/)
  • Gemini CLI 与 MCP 服务器:释放本地工具的强大潜力
  • Swiper属性全解析:快速掌握滑块视图核心配置!(2.3补充细节,详细文档在uniapp官网)
  • 飞牛影视桌面客户端(fntv-electron)使用教程
  • 无人机航拍数据集|第20期 无人机公路损伤目标检测YOLO数据集3771张yolov11/yolov8/yolov5可训练