Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js 如何复制摄影机子a帧实体的位置和旋转以在场景实体中使用?_Three.js_Aframe - Fatal编程技术网

Three.js 如何复制摄影机子a帧实体的位置和旋转以在场景实体中使用?

Three.js 如何复制摄影机子a帧实体的位置和旋转以在场景实体中使用?,three.js,aframe,Three.js,Aframe,我想创建一个控制面板,当用户俯视时,它会出现在用户面前,但随后会将自身锁定到世界空间 我正在创建一个占位符控制面板,然后将实际控制面板移动到此位置并旋转,但实际控制面板没有移动到占位符位置,而是停留在位置0 但是,如果我在控制台中手动执行该过程,它就会工作 这就是我正在尝试的: <!DOCTYPE html> <html> <head> <script src="https://aframe.io/releases/0.4.0/aframe.min.

我想创建一个控制面板,当用户俯视时,它会出现在用户面前,但随后会将自身锁定到世界空间

我正在创建一个占位符控制面板,然后将实际控制面板移动到此位置并旋转,但实际控制面板没有移动到占位符位置,而是停留在位置0

但是,如果我在控制台中手动执行该过程,它就会工作

这就是我正在尝试的:

<!DOCTYPE html>
<html>
<head>
  <script src="https://aframe.io/releases/0.4.0/aframe.min.js"></script>
  <script>
    function createControlPanel() {

      var controlPanelPlaceHolder = document.createElement('a-plane');
      controlPanelPlaceHolder.setAttribute('id', 'control-panel-place-holder');
      document.querySelector('#me').appendChild(controlPanelPlaceHolder);
      document.querySelector('#control-panel-place-holder').setAttribute('width', '0.25');
      document.querySelector('#control-panel-place-holder').setAttribute('height', '0.15');
      document.querySelector('#control-panel-place-holder').setAttribute('position', '0.15 -0.05 -0.3');
      document.querySelector('#control-panel-place-holder').setAttribute('rotation', '-45 0 0');
      document.querySelector('#control-panel-place-holder').setAttribute('color', 'crimson');


      var controlPanel = document.createElement('a-plane');
      controlPanel.setAttribute('id', 'control-panel');
      controlPanel.setAttribute('width', '0.25');
      controlPanel.setAttribute('height', '0.15');
      controlPanel.setAttribute('color', 'teal');
      document.querySelector('a-scene').appendChild(controlPanel);

      document.querySelector('#control-panel-place-holder').object3D.updateMatrixWorld();

      document.querySelector('#control-panel').object3D.position.copy(
        new THREE.Vector3().setFromMatrixPosition(document.querySelector('#control-panel-place-holder').object3D.matrixWorld)
      )

      document.querySelector('#control-panel').object3D.quaternion.copy(
        document.querySelector('#control-panel-place-holder').object3D.getWorldQuaternion()
      )

      document.querySelector('#me').removeChild(document.querySelector('#control-panel-place-holder'));
    }

    document.addEventListener('DOMContentLoaded', function() {
      document.querySelector('a-scene').addEventListener('loaded', createControlPanel);
    });

  </script>
</head>
<body>
  <a-scene debug>
    <a-entity id='me' camera='userHeight: 1.6' position='10 0 10' rotation='0 45 0' look-controls></a-entity>
  </a-scene>
</body>
</html>
你有没有想过为什么这不起作用


谢谢。

根据@ngokevin的建议,我已经将代码转移到组件并进行了重构

以下解决方案在用户俯视时在用户面前创建一个控制面板和十字线。面板保持在原位,以便他们可以使用十字线从中进行选择。如果他们抬头看,面板就会消失

//helper.js const q=document.querySelector.binddocument 函数setComponentDefaultscomponent{ 对于component.data中的attr component.el.setAttributeattr,component.data[attr] } //control-panel-skeleton.js AFRAME.registerComponent'control-panel-skeleton'{ 模式:{ 宽度:{默认值:'0.25'}, 高度:{默认值:'0.15'} }, init:函数{ setComponentDefaultsthis } } //control-panel-place-holder.js A框架注册表组件“控制面板-定位器”{ 模式:{ id:{默认值:'控制面板占位符'}, 位置:{default:'0-0.05-0.3'}, 旋转:{默认值:'-45 0'}, 可见:{default:'false'} }, init:函数{ setComponentDefaultsthis } } //control-panel.js 一个框架注册表组件“控制面板”{ 模式:{ id:{default:'控制面板'}, 颜色:{default:'teal'} }, init:函数{ setComponentDefaultsthis 此.el.setAttribute'control-panel-skeleton', 常数cpHolder=q‘控制面板-定位支架’ 此.el.setAttribute'position',cpHolder.object3D.getWorldPosition this.el.object3D.SetRotationFromQuaternionSpholder.object3D.getWorldQuaternion q“十字线”。设置属性“可见”,为真 }, 移除:=>q‘十字线’.setAttribute‘可见’,false } //control-panel-trigger.js 一个框架寄存器组件“控制面板触发器”{ init:函数{ 常数cp==>q‘控制面板’ 函数createIfLookingDowndetail{ 如果detail.newData.x<-25&&!cp{ const cp=document.createElement'a-plane' cp.setAttribute“控制面板”, q‘a场景’。请点击这里 } } 函数removeIfLookingUpdetail{ 如果detail.newData.x>-20&&cp cp.parentNode.removeChildcp } this.el.addEventListener'componentchanged',evt=>{ 如果evt.detail.name==“旋转” createIfLookingDownevt.detail | | removeIfLookingUpevt.detail } } } //十字线 AFRAME.registerComponent“十字线”{ 模式:{ id:{default:'十字线'}, 颜色:{default:'brown'}, 游标:{default:'fuse:true'}, 位置:{default:'0-0.1'}, “内部半径”:{默认值:'0.003'}, “外部半径”:{默认值:'0.0037'}, 光线投射器:{default:'far:2'}, 比例:{默认值:'1.71.7'}, 可见:{default:'false'} }, init:函数{ setComponentDefaultsthis } }
您试图在尚未初始化的DOM元素上运行JavaScript。建议在组件中放置代码。好的,谢谢凯文。我来试一试。
Uncaught (in promise) TypeError: Cannot read property 'isPlaying' of null