A-Frame:无法成功设置场景子对象的世界位置

问题描述 投票:1回答:1

基本上在我的场景中,我有一个带有激光控制的实体和一个以下结构的raycaster:

   <a-scene>
        <a-entity laser-controls raycaster ...>
        <!--<a-entity id="inventory" ...> Could be inserted here-->
        </a-entity>
        <!--<a-entity id="inventory" ...> Could be inserted here-->
    </a-scene>

我的目标是在激光线的当前x,y位置召唤库存,我已经可以访问对应于激光线末端的点。我不希望库存再次从该位置移动。如果我将库存设置为raycaster的子库,它总是随着线移动。如果我将库存设置为场景的孩子,同时将其位置设置为它应该是的点的世界坐标,则它不起作用。

我尝试过但失败的方法:

  • 将库存作为raycaster子项启动并将父项更改为场景并应用raycaster的世界矩阵
  • 将库存保持为raycaster child,捕获它的初始世界矩阵并在每个tick上设置相同的世界矩阵

最后,我目前的方法(使用代码)仍然失败

1.将线端的局部坐标转换为世界坐标

2.库存到现场

3.将世界坐标从线端转换为场景的局部坐标

4.将仓位3应用于库存

let v = this.emptyVec
v.copy(this.raycaster.components.line.data.end)
this.raycaster.object3D.localToWorld(v);
this.el.appendChild(inventoryNode) //this.el is the scene
this.el.object3D.worldToLocal(v);
const {x,y} = v
inventoryNode.object3D.position.set(x,y,inventoryZDistance)

TLDR:如何将实体设置为raycaster line end的位置,并将其添加到场景中,并将其永久保留在该位置

three.js aframe coordinate-transformation webvr
1个回答
0
投票

结束找到解决方案。这是在控制器点击事件的事件监听器上运行(点是它不需要在每个tick上运行,它只运行一次)

  1. 创建了一个虚拟节点,它是raycaster的子节点,并将其位置设置为行末端的x,y坐标和我想要的任何z坐标
  2. 将适当的库存节点附加到场景中
  3. 使用setFromMatrixPosition()方法从虚拟节点的世界矩阵设置清单的位置 let dummyNode = document.createElement("a-entity") dummyNode.setAttribute("id", "dummyinventory") dummyNode.setAttribute("visible", false) //maybe unnecessary const {x,y} = this.raycaster.components.line.data.end dummyNode.object3D.position.set(x,y,inventoryZDistance) this.raycaster.appendChild(dummyNode) inventoryNode.setAttribute('look-at', "[camera]") //if you want inventory to face the camera this.el.appendChild(inventoryNode) setTimeout(()=>{ let newMatrix = dummyNode.object3D.matrixWorld inventoryNode.object3D.position.setFromMatrixPosition(newMatrix) },50) //give the world matrix of dummyNode some time to update, with no timeout sometimes fails

如果想要通过让虚拟节点成为相机的子节点而不是raycaster来生成用户正在查看的某个实体,则可以应用相同的思考过程。

© www.soinside.com 2019 - 2024. All rights reserved.