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

xr-frame 用cube代替线段实现两点间的连线

前置数据

     // 方向向量
      const forward = xr.Vector3.createFromNumber(0,0,0);
     // 上方向
      const up =  xr.Vector3.createFromNumber(0, 1, 0);
     // 方向四元数
      const useQuaternion = xr.Quaternion.createFromNumber(0, 0, 0, 0);
     // standard材质
      const effectStandard = scene.assets.getAsset('effect', 'standard');
     // cube资源
      const geometryLine = scene.assets.getAsset('geometry', 'cube');

获取两点的世界坐标

const preCubeTrs = this.scene.getElementById('pre').getComponent('transform')    
const cubeTrs= this.scene.getElementById('cur').getComponent('transform')                  
const preWorldPosition = preCubeTrs.worldPosition;
const worldPosition = cubeTrs.worldPosition;

算两点间中点的位置

            // 算中点
            const posX = (preWorldPosition.x + worldPosition.x) / 2
            const posY = (preWorldPosition.y + worldPosition.y) / 2
            const posZ = (preWorldPosition.z + worldPosition.z) / 2

计算方向向量

            // forwad 向量
            preWorldPosition.sub(worldPosition, forward);

方向应用到四元数(由forward方向生成四元数)

            // 方向四元数
            xr.Quaternion.lookRotation(forward, up, useQuaternion);
            console.log(useQuaternion.x, useQuaternion.y, useQuaternion.z, useQuaternion.w)

计算向量的模,即两点间的距离

            // 向量的模
            const module = preWorldPosition.distanceTo(worldPosition);

绘制线,在中点位置放置一个cube,其xy长度自定义,z取模长,再应用到方向四元数,就可以成功的把cube连接到两个点

            const lineSize = 0.02;
            // line
            const lineEle = scene.createElement(xr.XRNode, {
              position: `${posX} ${posY} ${posZ}`,
              scale: `${lineSize} ${lineSize} ${module}`
            });
            // 加到场上
            root.addChild(lineEle);
            const lineTrs = lineEle.getComponent(xr.Transform);
            lineTrs.quaternion.x = useQuaternion.x;
            lineTrs.quaternion.y = useQuaternion.y;
            lineTrs.quaternion.z = useQuaternion.z;
            lineTrs.quaternion.w = useQuaternion.w;

            const matLine = scene.createMaterial(effectStandard);
            const color2 = colorPattern2[Math.floor(Math.random() * colorPattern2.length)];

            matLine.setVector('u_baseColorFactor', xr.Vector4.createFromNumber(color2[0], color2[1], color2[2], 1.0));
            matLine.setRenderState('cullFace', xr.ECullMode.FRONT);
            const meshLine = lineEle.addComponent(xr.Mesh, {
              geometry: geometryLine,
              material: matLine,
            });


http://www.kler.cn/a/611890.html

相关文章:

  • 蓝桥杯练习题--一年中的第几天
  • 【AVRCP】AVRCP核心术语解析
  • 第4章 IP网络扫描(网络安全评估)
  • 音乐极客指南:Melody高音质私有云音乐平台本地部署方案
  • 【Ubuntu设备端口绑定】
  • 深入理解指针(4)(C语言版)
  • 视频格式转换:畅享多平台无缝视频体验
  • 4.用 Excel 录入数据
  • AI大模型使用记录
  • 【2025全网最新最全】前端Vue3框架的搭建及工程目录详解
  • 泛目录程序,无极泛目录是如何搭建强大站群的?
  • SQL Server 动态构建 SQL 语句学习指南
  • 5500字,从零开始入门OpenCV的超基础操作~
  • 前端自动化测试(一):揭秘自动化测试秘诀
  • WHAT - 程序员英语之美式发音学习系列(三)
  • hive相关面试题以及答案
  • SAP 基础入门指南
  • Node.js 监听 GET 和 POST 请求并处理参数
  • ai-api-union项目,适配各AI厂商api
  • Vue 使用 xlsx 插件导出 excel 文件