目前,我正在编写的代码可以提示3d场景中家具物品的坐标。
从我收集的内容来看,每件家具都拥有自己的坐标,这些坐标基于父母的家具。 无论父母是级别还是小组等......
如果父母恰好是"等级"家具件'坐标直接指示家具在3D场景中的位置。
但是,如果家具件碰巧有一个非等级的父母,则家具的坐标是基于父母的。
基本上,在我的代码中,我正在编写一个递归函数,它接收一个家具节点并抓住它的坐标。
当递归函数迭代时,它会爬上父级的级别并按照原样增加原始坐标 当前在函数中的节点的坐标。
如果当前函数中的节点类是" io3d-level"递归函数将停止并返回递增的坐标。这是因为 具有" io3d-level"类的节点必须拥有{0,0,0}的坐标对象。
同样,递归函数将从家具节点的级别迭代并爬上父级抓取的结构并添加它们的坐标 到家具节点的原始坐标上,直到函数内当前节点的类别为级别,此时函数停止 并返回坐标。
这种递归函数几乎在所有情况下都会产生原始结果。
但是,此功能不会返回通过它发送的少数家具节点的原始精确坐标。
这种递归函数背后的假设是家具节点'通过抓取坐标可以获得相对于水平的真实坐标 所有的家具节点'父母并总结他们。显然考虑到x坐标与x坐标和z坐标相加 用z坐标求和。
这个假设是假的吗?
我是否可能误解了掩盖3d.io场景的坐标系?
答案 0 :(得分:1)
使用three.js句柄可以直接完成此操作而不会造成错误。
let worldCoordinates = obj.data3dView.threeParent.getWorldPosition();
答案 1 :(得分: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
}