1

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

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

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

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

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

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

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

同样,递归函数将从家具节点的级别开始迭代,并爬上父节点的结构,抓取并将其坐标添加到家具节点的原始坐标上,直到函数内节点的当前类是级别,在该级别point 函数停止并返回坐标。

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

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

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

这个假设是错误的吗?

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

4

2 回答 2

1

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

let worldCoordinates = obj.data3dView.threeParent.getWorldPosition();
于 2018-06-19T22:10:15.947 回答
0

我认为你的代码出了点问题

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

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

// 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
}
于 2018-06-04T09:06:52.420 回答