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

XR-Frame 实现 始终朝向屏幕(相机)的面片与模型

 

wxml,xr-frame中plane平面默认是趴在场景中的,需要先绕x轴渲染90度,

// 面片    
    <xr-node id="l" position="-3.0 0 0.0">
      <xr-mesh rotation="90 0 0" geometry="plane" uniforms="u_baseColorFactor:0.2 0.2 0.4 1, u_metallicRoughnessValues: 0 0.6" states="cullOn: false"></xr-mesh>
    </xr-node>

// 模型
    <xr-node id="b" position="0 0 -3.0">
      <xr-gltf rotation="0 -90 0" scale="0.01 0.01 0.01" model="door"></xr-gltf>
    </xr-node>

在场景的ready事件中获取相机,模型,并注册tick请求动画帧事件

   handleReady({detail}) {
      const xrScene = this.scene = detail.value;
      const xrSystem = wx.getXrFrameSystem();

      this.mat = new (xrSystem.Matrix4)();
      const { width, height } = this.scene


      this.cameraTrs = this.scene.getElementById('camera').getComponent(xrSystem.Transform);
      
      this.leftTRS = this.scene.getElementById('l').getComponent(xrSystem.Transform);
      this.backTRS = this.scene.getElementById('b').getComponent(xrSystem.Transform);

      this.FACING = xrSystem.Vector3.createFromNumber(0, 0, 0);
      this.UP = xrSystem.Vector3.createFromNumber(0, 1, 0);


      xrScene.event.add('tick', this.handleTick.bind(this));
    },

 请求动画帧中,计算旋转四元数,更新模型朝向

    handleTick: function () {
      const xrSystem = wx.getXrFrameSystem();

      if (this.leftTRS) {
        const quaternion = this.leftTRS.quaternion;
        // 算出从物体到相机的向量
        this.FACING.set(this.cameraTrs.position).sub(this.leftTRS.position, this.FACING);
        xrSystem.Quaternion.lookRotation(this.FACING, this.UP, quaternion);
      }

      if (this.backTRS) {
        const quaternion = this.backTRS.quaternion;
        // 算出从物体到相机的向量
        this.FACING.set(this.cameraTrs.position).sub(this.backTRS.position, this.FACING);
        xrSystem.Quaternion.lookRotation(this.FACING, this.UP, quaternion);
      }
    }


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

相关文章:

  • 运行springBlade项目历程
  • Chromium 中sqlite数据库操作演示c++
  • LLM时代下Embedding模型如何重塑检索、增强生成
  • MySQL 中的索引下推功能
  • [vulnhub] DarkHole: 1
  • 【C++】 C++游戏设计---五子棋小游戏
  • vue路由Router设置父路由默认选中第一个子路由,切换子路由让父路由激活高亮效果不会消失
  • 因 Mysql root 密码过于简单导致 Mysql 连接失败的解决方法
  • C++学习笔记(4)
  • 集成电路学习:什么是MMU存储管理单元
  • Get full article in Google Sheet using Openai
  • Python知识点:如何使用Mock库进行单元测试中的依赖模拟
  • Linux查看系统用户
  • 海康二次开发笔记10-独立Group导入、导出及执行
  • HTTP代理支持UDP协议吗?
  • ROS imu传感器节点
  • 第十二章节 xxjob, seata, zk, minio,activeMQ进行 helm化
  • 【boost库概述+应用场景】
  • vue 的diff算法原理
  • superMap mapboxgl初始化地图时,地图旋转api与设置地图中心api,同时进行无法完成实现效果
  • 【Unity案例】搭建射击系统与UI
  • C#预处理器指令
  • 1.Docker初探 —— 走进集装箱的世界
  • upload-labs通关详解
  • C#指针(内存地址)IntPtr
  • Windows中Git对文件名大小写不敏感的问题解决方法