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

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,
            });

相关文章:

  • SQL Server中账号权限
  • std::string不是直接的 DATETIME类型,因此在插入数据库时,通常可以直接将这个字符串传递给数据库,它会自动将其转换为 DATETIME类型
  • 自动化浏览器的测试框架playwright 支持多种浏览器Chromium、Firefox 和 WebKit
  • OpenManus和OWL如何选?
  • 刷题记录(LeetCode 994.腐烂的橘子)
  • 使用ProcessBuilder执行FFmpeg命令,进程一直处于阻塞状态,一直没有返回执行结果
  • Pytorch学习笔记(十二)Learning PyTorch - NLP from Scratch
  • Springboot读取nacos配置
  • 从tensorflow导入keras失败?
  • deepseek本地部署并搭建个人知识库
  • AIP-192 文档
  • ROS2软件架构全面解析-rmw软件框架
  • 使用系统自带的磁盘清理工具清理c盘空间 以及手动删除临时文件
  • leetcode141.环形链表
  • 数据分析中的基线校正算法全解析:原理、实现与应用
  • 什么是Giteki认证?认证流程详解
  • 盾牌图鉴(死亡细胞)
  • Go 语言常见错误——控制结构
  • 前端知识点 --- border-Radius的四个角(css)
  • MSYS2:Windows 开发环境的技术革新
  • 上海著名网站设计公司/b2b采购平台
  • 免费空间备案/seo实战密码在线阅读
  • 网站空间购买/济南网站seo
  • 工商银行门户网站是什么意思/外贸自建站的推广方式
  • wordpress棋牌插件/株洲seo优化首选
  • 做销售网站要多少钱/做关键词优化的公司