给定一个名为的实体EntityA
,我想定义一个局部坐标空间,其中的位置EntityA
是原点,其航向矢量是X轴,航向矢量的法线是Y轴:
给定它们的全局坐标,我如何找到另一个实体在EntityA
本地空间中的位置?
例如:EntityA
的全局位置是(50,50),而的全局位置EntityB
是(80,90)。那么EntityB
在EntityA
的本地空间中的位置是什么?
编辑:请轻松进行数学运算。
给定一个名为的实体EntityA
,我想定义一个局部坐标空间,其中的位置EntityA
是原点,其航向矢量是X轴,航向矢量的法线是Y轴:
给定它们的全局坐标,我如何找到另一个实体在EntityA
本地空间中的位置?
例如:EntityA
的全局位置是(50,50),而的全局位置EntityB
是(80,90)。那么EntityB
在EntityA
的本地空间中的位置是什么?
编辑:请轻松进行数学运算。
Answers:
好的,假设您知道该对象A的世界转换矩阵是什么,您只需要构造该矩阵的逆矩阵,便会拥有所需的东西。
假设用于将其到达全局空间的对象A的旋转,缩放和平移矩阵分别为R,S和T。您将像这样将它们相乘
S * R * T = W
现在,取W并以某种方式找到其逆W ^ -1。矩阵的逆是恰好相反的那个矩阵。矩阵与其逆的乘积始终是单位矩阵。
W * W ^ -1 = 我
因此W ^ -1 = I / W ;
现在,将此逆矩阵作为世界变换应用于场景,每个对象将位于所需的坐标中。
这是另一个页面,该页面为您提供制作W所需的矩阵。
在上述问题中,应将x轴的平移设为50,将y轴的平移设为50,两个轴均不缩放,并且未指定旋转角度。
我过去使用三角函数而不是矩阵来完成此操作(我是矩阵菜鸟)。Ashes999的答案在一半处,获得相对矢量,然后将其旋转为EntityA的角度的倒数。
relativeX = B.x - A.x
relativeY = B.y - A.y
rotatedX = Cos(-Angle) * relativeX - Sin(-Angle) * relativeY
rotatedY = Cos(-Angle) * relativeY + Sin(-Angle) * relativeX
让我尝试为您提供介于The Light Spark的答案和Elliot的答案之间的某个内容,因为从我的阅读中,您实际上是在寻找一种可以遵循的算法,而不仅仅是数学向您扔去。
问题陈述:假设您有一个位置A (50, 50)
和一个标题(由于您没有提供位置和标题,所以我将其断言为y = 2 * x + 25
),然后找到B (80, 90)
相对于A
标题的位置。
您实际上想要做的很简单。1)A
移至系统的原点。这仅表示局部A
值将是全局位置值减去的全局位置值A
。A
变(0, 0)
和B
变(30, 40)
。
1.1)标题也需要移动。这实际上很容易做到,因为局部的y截距A
始终为0,并且斜率不会改变,因此我们将其y = 2 * x
作为标题。
2)现在,我们需要将先前的标题与X轴对齐。那么,我们该怎么做呢?从概念上讲,最简单的方法是将x,y坐标转换为极坐标系统。极坐标系统包括R
,到位置的距离和phi
与x轴的旋转角度。R
被定义为,sqrt(x^2 + y^2)
并且phi
被定义为atan(y / x)
。如今,大多数计算机语言都在继续定义一个atan2(y, x)
函数,该函数执行atan(y/x)
与之完全相同的操作,但其功能往往使输出趋向于从-180度到180度而不是从0度到360度,但是两者都起作用。
B
因此变为R = sqrt(30^2 + 40^2) = sqrt(2500) = 50
,并phi = atan2(40, 30) = 53.13
以度为单位。
同样,标题现在更改。解释起来有点棘手,但这是因为按照定义,标题始终通过我们的原点A
,因此我们不必担心该R
组件。标题总是以phi = C
where C
是常数的形式出现。在这种情况下,phi = atan(2 * x / x) = atan(2) = 63.435
度数。
现在,我们可以旋转系统以将航向移动到本地A
系统的X轴。就像当我们移至A
系统的原点时,我们要做的就是phi
从phi
系统中的所有值中减去航向。因此,phi
of B
变为53.13 - 63.435 = -10.305
度。
最后,我们必须将极坐标转换回x,y坐标。进行转换的公式是X = R * cos(phi)
和 Y = R * sin(phi)
。对于B
因此,我们得到X = 50 * cos(-10.305) = 49.2
和Y = 50 * sin(-10.305) = 8.9
,所以B
在本地TO- A
坐标接近(49,9)
。
希望对您有所帮助,并且对数学的了解足够浅,您可以照做。
您需要知道实体A在全局空间(x1,y1,θ)中的姿势,其中θ是相对于x轴的方向。
要将EntityB位置从全局坐标(x2,y2)转换为局部坐标(x2',y2'):
全球到本地
x2' = (x2-x1)cosθ + (y2-y1)sinθ
y2' = -(x2-x1)sinθ + (y2-y1)cosθ
本地到全球
x2 = x2'cosθ - y2'sinθ + x1
y2 = x2'sinθ + y2'cosθ + y1
使用矩阵:
R = [cosθ -sinθ
sinθ cosθ]
A = [x1
y1]
B_global = [x2
y2]
B_local = [x2'
y2']
全球到本地
B_local = inv(R) x (B_global - A)
本地到全球
B_global = R x B_local + A