将相对于 obj1 的坐标转换为相对于 obj2 的坐标

我有一个对象 ( obj1 ) ,它创建了一个按钮。

self.createButton({ position={ 15.7, 0.1, -1.8 }, ...})

那个位置当然是相对于 obj1 的。

obj1 是一个袋子,而它创建的按钮在游戏板上,远离袋子 (你可以从 X 分量的幅度看出)。这不合适,而且它意味着袋子不能移动。我想让游戏板来创建按钮。

在从游戏板 ( obj2) 中调用 createButton 时如何确定要提供的坐标?

点赞
用户589924
用户589924

我发现可以使用以下方法将相对位置转换为绝对位置:

local rel_pos = Vector(15.7, 0.1, -1.8)
local abs_pos = Vector(-v[1], v[2], v[3])
abs_pos:scale( obj1.getScale() )
abs_pos:rotateOver('z', obj1.getRotation()['z'] )  -- 顺序很重要
abs_pos:rotateOver('x', obj1.getRotation()['x'] )
abs_pos:rotateOver('y', obj1.getRotation()['y'] )
abs_pos:add( obj1.getPosition() )

使用obj2反向处理可以得到用于obj2的向量。


但为什么X分量要被取反?直到我发现positionToWorld,一个旨在实现上述操作的函数,我才认为我可能漏掉了什么。结果发现我还需要取反X分量。

local rel_pos = Vector(15.7, 0.1, -1.8)
local abs_pos = obj1.positionToWorld(Vector(-v[1], v[2], v[3]))

我只能得出结论,createButton有一个错误,需要将其提供的position的X分量取反。


以下是完整的解决方案:

local v = Vector(15.7, 0.1, -1.8)
v:setAt(1, -v[1])             -- Bug-compensated loc rel to obj1 -> Loc rel to obj1
v = obj1.positionToWorld(v)   -- Loc rel to obj1 -> Absolute loc
v = obj2.positionToLocal(v)   -- Absolute loc -> Loc rel to obj2
v:setAt(1, -v[1])             -- Loc rel to obj2 -> Bug-compensated loc rel to obj2
print(logString(v))

最终结果是将

-- 在obj1中(包)
self.createButton({ position={ 15.7, 0.1, -1.8 }, ... })

用以下代码替换:

-- 在obj2中(游戏棋盘)
self.createButton({ position={ -7.745875, 13.7634, -1.006971 }, ... })
2020-08-16 04:04:04