目前,我正在编写代码,指示三维场景中家具项目的坐标。
据我所知,每件家具都有它自己的坐标,这是基于家具件的父母。不管父母是级别还是团体等等..。
如果父母恰好是“水平”,家具件的坐标直接意味着家具件居住在3d场景中。
然而,如果家具件碰巧有一个非水平的父母,则家具件的坐标是基于父母的。
基本上,在我的代码中,我正在编写一个递归函数,它接受一个家具节点并获取它的坐标。
当递归函数迭代时,它会爬升父函数的级别,并根据当前函数中节点的坐标递增原始坐标。
如果当前函数中的节点类是"io3d-level“,则递归函数将停止并返回递增的坐标。这是因为具有“io3d级别”类的节点必须具有{0,0,0}的坐标对象。
同样,递归函数将从家具节点的级别迭代,并将父节点的结构抓取并将其坐标添加到家具节点的原始坐标上,直到函数中的节点的当前类为该级别,此时函数停止并返回坐标。
在几乎所有情况下,这个递归函数似乎都会产生原始的结果。
然而,这个函数并不返回通过它发送的少数家具节点的原始精确坐标。
这种递归函数的假设是,通过获取所有家具节点的父节点的坐标并对其进行求和,可以获得家具节点相对于水平的真实坐标。显然,考虑到x坐标与x坐标相加,z坐标与z坐标相加。
这个假设是假的吗?
我是不是误解了掩盖3d.io场景的坐标系统?
发布于 2018-06-19 22:10:15
使用three.js句柄可以直接做到这一点,而不会有不准确的地方。
let worldCoordinates = obj.data3dView.threeParent.getWorldPosition();发布于 2018-06-04 09:06:52
我想你的代码出了点问题
所以最好是分享你的代码,这样我们就不用猜测了。
下面是一个小片段,它在处理场景结构时将元素的父位置应用于元素
// 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
}https://stackoverflow.com/questions/50650982
复制相似问题