index.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. Component({
  2. behaviors: [require('../../common/share-behavior').default],
  3. data: {
  4. loaded: false,
  5. arReady: false,
  6. },
  7. methods: {
  8. handleReady({detail}) {
  9. const xrScene = this.scene = detail.value;
  10. xrScene.event.add('tick', this.handleTick.bind(this));
  11. console.log('xr-scene', xrScene);
  12. },
  13. handleAssetsProgress: function ({detail}) {
  14. console.log('assets progress', detail.value);
  15. },
  16. handleAssetsLoaded: function ({detail}) {
  17. console.log('assets loaded', detail.value);
  18. this.setData({loaded: true});
  19. // 延时保证场上存在脸模
  20. setTimeout(()=>{
  21. const xrSystem = wx.getXrFrameSystem();
  22. // 替换状态
  23. const faceElm = this.scene.getElementById('face');
  24. const faceGLTF = faceElm.getComponent(xrSystem.GLTF);
  25. for(const mesh of faceGLTF.meshes) {
  26. // 通过alphaMode 的 Setter 设置,或者写入renderState,但需要手动控制宏
  27. mesh.material.alphaMode = "BLEND";
  28. mesh.material.setVector('u_baseColorFactor', xrSystem.Vector4.createFromNumber(1, 1, 1, 0.0));
  29. }
  30. }, 33);
  31. },
  32. handleARReady: function ({detail}) {
  33. console.log('arReady');
  34. this.setData({arReady: true});
  35. },
  36. handleTick: function () {
  37. const xrSystem = wx.getXrFrameSystem();
  38. const trackerEl = this.scene.getElementById('tracker');
  39. if (!trackerEl) {
  40. return;
  41. }
  42. const tracker = trackerEl.getComponent(xrSystem.ARTracker);
  43. if (!tracker.arActive) {
  44. return
  45. }
  46. // 这里只是例子,实际上用的是`ARTracker`的`autoSync`属性。
  47. // 但也是一个更高自由度的选项。
  48. // 视情况需要自己同步`tracker`的`scale`和`rotation`特定节点。
  49. // 第一个参数是特征点编好,第二个是可选的复用结果,第三个是可选的是否相对于`ARTracker`。
  50. // 为`false`为世界空间的位置,需要配合`scale`自己使用
  51. const position = tracker.getPosition(98, new xrSystem.Vector3(), false);
  52. }
  53. }
  54. })