信息提示面板

课程链接:www.bilibili.com/cheese/play...

代码链接:github.com/buglas/robo...

课程目标

  • 创建关节信息提示面板

1-信息提示面板的功能

当鼠标划入link 的时候,可以显示一个信息提示面板,告诉用户相应link 的名称,以及可以拖拽变换的关节信息。

2-信息提示逻辑

我们之前说旋转拖拽的时候说过,鼠标划入的对象肯定是一个link对象,而我们要拖拽变换的joint 是link 的父对象。

如果这个joint 的type 是fixed或其它不可变换的类型,我们需要再往其父级寻找可以变换的joint。

3-代码实现

1.在RobotVisual 类中,创建2个对应提示面板css样式和提示信息的属性。

  • src/robot/RobotVisual.ts
scala 复制代码
class RobotVisual extends EventDispatcher<any> {
  //...
  tipStyle = ref({
    display: "none",
    top: "0",
    left: "0",
  })
  tipMsg= ref({
    jointName: "",
    jointValue: "",
    linkName: "",
  });
  //...
}

2.在urdfDragControls对象的鼠标事件,设置上面的两个属性。

  • src/robot/RobotVisual.ts
ini 复制代码
class RobotVisual extends EventDispatcher<any> {
  //...
  tipStyle = ref({
    display: "none",
    top: "0",
    left: "0",
  })
  tipMsg= ref({
    jointName: "",
    jointValue: "",
    linkName: "",
  });
  //...
  // 监听事件
  listen() {
    const {
      tipStyle,
      tipMsg:{value:tipMsgValue},
      urdfDragControls,
    } = this;
    /* 
      协调orbitControls和 urdfDragControls 的有效性
      控制关节信息提示面板的相关数据 
    */
    urdfDragControls.addEventListener('beginDrag', () => {
      this.orbitControls.enabled = false;
      tipStyle.value.display = "none";
    });
    urdfDragControls.addEventListener("pointerMoveOnRobot", ({ x, y, joint,link }) => {
      tipStyle.value.display = "block";
      tipStyle.value.left = x + "px";
      tipStyle.value.top = y + "px";
      if(joint){
        tipMsgValue.jointName=joint.name
        tipMsgValue.jointValue=joint.userData.value.toFixed(4)
      }else{
        tipMsgValue.jointName='null'
        tipMsgValue.jointValue='null'
      }
      tipMsgValue.linkName = link.name;
    });
    urdfDragControls.addEventListener("pointerOutRobot", () => {
      tipStyle.value.display = "none";
    });
    //...
  }
  //...
}

3.在App.vue中创建信息提示面板。

xml 复制代码
<script setup lang="ts">
//...
const robotVisual = new RobotVisual(hdrURL);
const {tipStyle, tipMsg, urdfDragControls } = robotVisual;
//...
</script>
<template>
  <div id="robotVisual">
      <!-- ... -->
      <div id="cont">
          <!-- ... -->
          <div id="canvasWrapper" ref="canvasWrapperRef">
            <div id="robotTip" :style="tipStyle">
              <p>joint name:{{ tipMsg.jointName }}</p>
              <p>joint value:{{ tipMsg.jointValue }}</p>
              <p>link name:{{ tipMsg.linkName }}</p>
            </div>
          </div>
      </div>
  </div>
</template>     
<style scoped>
    /* ... */
    #robotTip {
      position: absolute;
      background-color: rgba(0, 0, 0, 0.65);
      color: #fff;
      padding: 6px 9px;
      transform: translate(18px, -100%);
      border-radius: 2px;
      box-shadow: rgba(0, 0, 0, 0.4) 0 3px 3px;
    }
    #robotTip p {
      margin: 0;
      font-size: 13px;
      line-height: 24px;
    }
</style>

效果如下:

总结

这一章我们创建了机器人的信息提示面板,其实现过程比较简单,大家以此原理可以在面板里写入更多的提示内容。

下一章我们会创建URDF模型的辅助对象。

相关推荐
GISer_Jing5 分钟前
一套H5跑通三端:App+小程序内嵌H5跨端适配全栈解决方案
前端·前端框架·ai编程
码云之上17 分钟前
项目团队从 5 人扩到 15 人,我写了个 CLI 让 IDE 共享 AI 规则
前端·人工智能·后端
用户2986985301425 分钟前
前端 Excel 处理进阶:React 中合并与取消合并单元格的实现
前端·javascript·react.js
Highcharts33 分钟前
@highcharts/react完整技术指南|新版Highcharts React使用、迁移、SSR、TS 优化全解
前端·javascript
c238561 小时前
HTTP 超文本传输协议全解:Web 世界的通信规则
前端·网络协议·http
gis开发之家1 小时前
vue3组合式函数(Composables)的艺术——将业务逻辑从UI组件中连根拔起
前端·javascript·vue.js·前端框架·vue3·前端工程化·前端架构
白白白飘1 小时前
【9】Langchain实战案例:构建一个聊天机器人
microsoft·langchain·机器人
uuai1 小时前
vue导出pdf
前端·vue.js·pdf
小爷毛毛_卓寿杰1 小时前
我和 TRAE AI聊了聊,它帮我为五迷老师们做了个城市漫游小程序!
前端·人工智能·后端
liuniansilence1 小时前
一次讲透 H5 唤起原生 App:Scheme 协议、平台限制与生产级封装
前端·javascript