3d.io场景坐标系

3d.io Scene Coordinate System

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

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

如果 parent 恰好是 "level",则家具的坐标直接代表家具在 3d 场景中的位置。

但是,如果家具件恰好有 non-level parent,则家具件的坐标基于 parent(s)。

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

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

如果函数中当前节点的 class 是 "io3d-level" 的节点,则递归函数将停止并且 return 递增坐标。这是因为 class 为 "io3d-level" 的节点必须具有坐标 object {0, 0, 0}。

同样,递归函数将从家具节点的级别开始迭代,并爬上 parent 的结构,抓取并添加它们的坐标 到furniture节点的原始坐标,直到函数内节点的当前class为level,此时函数停止 和 returns 坐标。

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

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

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

这个假设是错误的吗?

我是否误解了掩盖 3d.io 场景的坐标系?

我假设你的代码出了问题

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

这是一个在处理场景结构时应用元素父位置的小片段

// 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
}

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

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