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

问题描述

我有一个创建按钮的对象(Microsoft.Bot.Builder.Luis.Models.LuisResult)。

obj1

该位置当然是相对于self.createButton({ position={ 15.7,0.1,-1.8 },...}) 的。

obj1一个袋子,它创建的按钮在游戏板上,离袋子很远(可以通过X分量的大小看出来)。这不合适,这意味着袋子不能移动。我想让游戏面板来创建按钮。

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

解决方法

我得出结论,可以使用以下方法将相对位置转换为绝对位置:

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'] )  -- The order is important
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,-1.8)
local abs_pos = obj1.positionToWorld(Vector(-v[1],v[3]))

我只能得出结论,createButton的错误需要一个人来否定所提供的position的X分量。


以下是完整的解决方案:

local v = Vector(15.7,-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))

最终结果是替换

-- In obj1 (the bag)
self.createButton({ position={ 15.7,-1.8 },... })

使用

-- In obj2 (the game board)
self.createButton({ position={ -7.745875,13.7634,-1.006971 },... })