【问题标题】:3d.io Scene Coordinate System3d.io场景坐标系
【发布时间】:2018-11-12 01:00:16
【问题描述】:

目前,我正在编写代码来提示 3d 场景中家具物品的坐标。

据我所知,每件家具都有自己的坐标,这些坐标基于家具的父级。 父级是级别还是组等...

如果父对象恰好是“关卡”,则家具的坐标直接包含家具在 3d 场景中的位置。

但是,如果一件家具碰巧有一个非关卡父级,则家具的坐标是基于父级的。

基本上,在我的代码中,我正在编写一个递归函数,它接收家具节点并获取其坐标。

随着递归函数的迭代,它会爬上父级的层级并根据 当前在函数中的节点的坐标。

如果当前在函数中的节点类是“io3d-level”的,递归函数将停止并返回递增的坐标。这是因为 具有“io3d-level”类的节点必须拥有 {0, 0, 0} 的坐标对象。

再次,递归函数将从家具节点的级别进行迭代,并爬上父节点的结构,抓取并添加它们的坐标 移到家具节点的原始坐标上,直到函数内节点的当前类是水平,此时函数停止 并返回坐标。

这个递归函数似乎在几乎所有情况下都能产生原始结果。

但是,此函数不会为通过它发送的少数家具节点返回原始准确的坐标。

这个递归函数背后的假设是,家具节点的真实坐标,相对于关卡,可以通过抓取坐标获得 所有家具节点的父节点并将它们相加。显然考虑到x坐标与x坐标和z坐标相加 与 z 坐标相加。

这个假设是错误的吗?

我可能误解了隐藏 3d.io 场景的坐标系吗?

【问题讨论】:

    标签: aframe archilogic 3d.io


    【解决方案1】:

    这可以使用 three.js 句柄直接完成,不会出现错误。

    let worldCoordinates = obj.data3dView.threeParent.getWorldPosition();
    

    【讨论】:

    • 这是解决这个问题的更好方法,谢谢!
    【解决方案2】:

    我认为你的代码有问题

    所以最好是分享你的代码,这样我们就不必猜测了。

    这是一个小sn-p,它在处理场景结构时为元素应用父位置

    // apply parent location
    function applyLocation(element, parent) {
      // Rotate element on the XZ plane around parent's center
      var angleY = -parent.ry * Math.PI / 180
      var rotatedX = element.x * Math.cos(angleY) - element.z * Math.sin(angleY)
      var rotatedZ = element.z * Math.cos(angleY) + element.x * Math.sin(angleY)
    
      // Get parent space coordinates for our element
      element.x = parent.x + rotatedX
      element.y += parent.y
      element.z = parent.z + rotatedZ
      element.ry += parent.ry
      return element
    }
    

    【讨论】:

    • 非常感谢 Frederic 的反馈。
    • 如果答案解决了您的问题,请点击绿色检查
    • 问候弗雷德里克,我会出去点击绿色检查。首先,我想分享一下我和我的一位同事是如何在 3d.io 的努力中达到我们想要的目标的。从基本意义上说,我和我的同事想要的只是获取每件家具的世界坐标。我们最初的方法是爬上家具节点的父结构,抓住它们的坐标,同时考虑到旋转等因素。我们发现我们可以简单地使用 let worldCoordinates = furniture.data3dView.threeParent.getWorldPosition();这正是我们想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多