分享
查看: 1749|回复: 0

[分享] 低代码判断两个模型当前是否发生碰撞

[复制链接]

低代码判断两个模型当前是否发生碰撞

发表于 2024-7-22 11:53:34 来自 分享 阅读模式 倒序浏览
zzv_icon1749 zzr_icon0 查看全部




  1. /** 说明:创建App,url为园区地址(可选)
  2. *       使用App创建打开的三维空间我们称之为“场景”(scene)。场景包含地球、园区、模型等。
  3. *       创建App时,传入的url就是园区的地址,不传url则创建一个空的场景。园区可在CampusBuilder
  4. *       中创建编辑,有两种方法可以将园区添加到线上资源面板,方法如下:
  5. *          1. 园区保存后,会自动同步到网页同一账号下
  6. *          2. 园区保存后,导出tjs文件,在园区资源面板上传
  7. *      上面两种方式生成的园区资源均可在资源面板中双击自动生成脚本
  8. *  难度:★☆☆☆☆
  9. **/

  10. // 加载场景代码
  11. var app = new THING.App({
  12.     url: 'https://www.thingjs.com/static/models/factory',  // 场景地址
  13.     background: '#000000',
  14.     env: 'Seaside',
  15. });
  16. app.on('load', function (ev) {
  17.     app.level.change(ev.campus)
  18.     let car01 = app.query('car01')[0]
  19.     let car02 = app.query('car02')[0]


  20.     car01.style.boundingBox = true
  21.     car02.style.boundingBox = true
  22.     // crash(car01, car02)
  23.     car02.draggable = true

  24. // 通过调用crashTest(物体对象1,物体对象2) 的返回值判断是否碰撞
  25.     // setInterval(function () {
  26.     // crashTest(car01, car02)
  27.     // }, 1000)
  28. })
  29. /**
  30. * 碰撞监测
  31. * 如何使用JavaScript实现包围盒检测,以判断两个梯形体是否相交。
  32. * 通过计算梯形体的包围盒,并检测包围盒在三个轴上的投影是否相交,从而判断梯形体是否相交。
  33. * return true:碰撞 false:不碰撞
  34. * */
  35. function crashTest(obj1, obj2) {
  36.     let points1 = obj1.getBoundingBox().points
  37.     let points2 = obj2.getBoundingBox().points

  38.     // 获取x轴方向上的坐标值
  39.     let xValues = [...new Set(points1.map(point => point[0].toFixed(3)))];

  40.     // 获取y轴方向上的坐标值
  41.     let yValues = [...new Set(points1.map(point => point[1].toFixed(3)))];

  42.     // 获取z轴方向上的坐标值
  43.     let zValues = [...new Set(points1.map(point => point[2].toFixed(3)))];

  44.     // 获取x轴方向上的坐标值
  45.     let xValues2 = [...new Set(points2.map(point => point[0].toFixed(3)))];

  46.     // 获取y轴方向上的坐标值
  47.     let yValues2 = [...new Set(points2.map(point => point[1].toFixed(3)))];

  48.     // 获取z轴方向上的坐标值
  49.     let zValues2 = [...new Set(points2.map(point => point[2].toFixed(3)))];


  50.     let box1 = getBoundingBox(xValues, yValues, zValues);
  51.     let box2 = getBoundingBox(xValues2, yValues2, zValues2);

  52.     // 检测两个梯形体是否相交
  53.     if (isBoundingBoxIntersect(box1, box2)) {
  54.         console.log("两个梯形体相交");
  55.         return true
  56.     } else {
  57.         console.log("两个梯形体不相交");
  58.         return false

  59.     }
  60. }
  61. // 定义梯形体的包围盒
  62. function getBoundingBox(xValues, yValues, zValues) {
  63.     // 根据梯形体的顶点坐标计算包围盒的最小和最大坐标
  64.     let minX = Math.min(xValues[0], xValues[1]);
  65.     let minY = Math.min(yValues[0], yValues[1]);
  66.     let minZ = Math.min(zValues[0], zValues[1]);
  67.     let maxX = Math.max(xValues[0], xValues[1]);
  68.     let maxY = Math.max(yValues[0], yValues[1]);
  69.     let maxZ = Math.max(zValues[0], zValues[1]);
  70.     return {
  71.         min: { x: minX, y: minY, z: minZ },
  72.         max: { x: maxX, y: maxY, z: maxZ }
  73.     };
  74. }

  75. // 检测两个包围盒是否相交
  76. function isBoundingBoxIntersect(box1, box2) {
  77.     // 判断两个包围盒在三个轴上的投影是否相交
  78.     if (box1.max.x < box2.min.x || box1.min.x > box2.max.x) return false;
  79.     if (box1.max.y < box2.min.y || box1.min.y > box2.max.y) return false;
  80.     if (box1.max.z < box2.min.z || box1.min.z > box2.max.z) return false;
  81.     return true;
  82. }




复制代码


avatar
游客~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

130700ppkpl8x3t7tt1b1t