我导入了一个房屋模型作为.gltf。我想从这所房子中检索地板对象并将其转换为自己的 a 框架实体,以便以后可以引用它。我需要引用它以告诉 aframe-teleport-controls 组件它应该使用地板作为collisionEntity。
这是我到目前为止所拥有的:
AFRAME.registerComponent('floor-test', {
schema: {
floorname: {type: 'string', default: "floor"},
},
init: function () {
this.el.addEventListener("model-loaded", (e) => {
let child = this.el.object3D.getObjectByName(this.data.floorname, true);
let floor = document.createElement("a-entity");
floor.setObject3D("Object3D", child)
floor.setAttribute("id", "floor")
this.el.appendChild(floor)
})
}
});
这是帧传送控制实体:
<a-mixin id="teleport" teleport-controls="type: parabolic; cameraRig: #cameraRig; collisionEntities: #floor "></a-mixin>
正在创建对象(尚未处于正确的位置),但传送控件无法将其识别为碰撞实体。
如何将 3D 模型中的地板设置为碰撞实体?
编辑
查宁floor.setObject3D("Object3D", child)
floor.setObject3D("mesh", child)
修复了传送碰撞实体的问题。
但是正在创建的地板对象没有正确的旋转。
我在 a 框架文档中尝试了entityEl.object3D.getWorldRotation();
的函数,但它返回"0 0 0"而不是"0 180 0"。
我也尝试使用THREE.SceneUtils.detach(child, parent, scene);
但子对象没有出现在场景中。
这是当前代码
AFRAME.registerComponent('floor-test', {
schema: {
floorname: {type: 'string', default: "floor"},
},
init: function () {
this.el.addEventListener("model-loaded", (e)=> {
let parent = this.el.object3D;
let child = parent.getObjectByName(this.data.floorname, true);
let floor = document.createElement("a-entity");
floor.setObject3D("mesh", child)
floor.setAttribute("id", "floor")
floor.setAttribute("rotation", child.getWorldRotation())
this.el.appendChild(floor)
})
}
});
我认为时间有问题。当teleport-controls
连接到teleport
混音时,#floor
不存在。由于我在文档中没有看到任何"刷新"方法,因此我可以想到两种处理此问题的方法:
1)如果世界是非程序性的,请在地板应该在的地方添加一个看不见的盒子,并使其成为你的#floor
。
2)更合法一点,尝试在模型加载完成后添加teleport-controls
:
this.el.addEventListener("model-loaded", (e) => {
let child = this.el.object3D.getObjectByName(this.data.floorname, true);
let floor = document.createElement("a-entity");
floor.setObject3D("Object3D", child)
floor.setAttribute("id", "floor")
this.el.appendChild(floor)
let teleportEntity = document.querySelector("#teleport");
teleportEntity.setAtrribute("type", "parabolic");
teleportEntity.setAttribute("cameraRig", "#cameraRig");
teleportEntity.setAttribute("collisionEntities", "#floor");
})
<a-mixin id="teleport"></a-mixin>