使用 gltf-part 在 Aframe 中导入的场景将对象原点重置为 0,0,0

Imported scene in Aframe with gltf-part resets object origins to 0,0,0

问题:与 gltf-part 一起使用的对象的起点是 0,0,0

codesandbox 示例:https://codesandbox.io/s/xenodochial-moore-4383f?file=/index.html

shows a log with the correct positions when displayed as a scene and one where I use gltf-part to show the cubes where all positions of the cubes are at 0,0,0

导出的场景来自blender,其中我将原点设置为每个立方体的中心,见右上立方体。

在Aframe中导入gltf文件后,用gltf-part显示立方体,每个立方体的原点都是0,0,0。

GLTF 是正确的,当我在搅拌机中再次导入它时,原点仍然在立方体的中心。

如果 Aframe 中每个立方体都位于位置 0,0,0,我如何获得正确的坐标?

这对我有用:

  window.addEventListener("model-loaded", (e) => {
    const sceneObj = document.querySelector("a-scene").object3D;
    let object;
    object = sceneObj.getObjectByProperty("name", "cube1");
    console.log(object.position);
    object = sceneObj.getObjectByProperty("name", "cube2");
    console.log(object.position);
  });

组件的行为符合预期,部分已被选中,但您仍将它们作为子元素加载到场景中,因此它们的相对位置保留在父元素的 0,0,0。

以下是如何更改此行为以满足您的需要的粗略概述:

  • 您需要将 gltf-part 组件编辑到 "reset" 它在加载时提取的 "part" 的位置。在此行中克隆网格后: mesh = part.getObjectByProperty('type', 'Mesh').clone(true); 那么您需要将该网格的位置复制到一个变量,然后在本地重置网格: mesh.position.set ( 0, 0, 0 );
  • 然后您需要将 A-Frame 实体设置到您刚刚保存在变量中的位置。

这里是修改了组件的示例代码:https://codesandbox.io/s/gltf-part-reset-qgovf 注意重命名的组件 gltf-part-reset 和新属性 resetPosition。默认值为 false 以保留现有的 gltf-part 行为,在此示例中设置为 true 以表现出所需的行为。