如何从全局坐标空间转换为局部空间?


13

给定一个名为的实体EntityA,我想定义一个局部坐标空间,其中的位置EntityA是原点,其航向矢量是X轴,航向矢量的法线是Y轴:

相同的图片描述

给定它们的全局坐标,我如何找到另一个实体在EntityA本地空间中的位置?

例如:EntityA的全局位置是(50,50),而的全局位置EntityB是(80,90)。那么EntityBEntityA的本地空间中的位置是什么?

编辑:请轻松进行数学运算。

Answers:


21

好的,假设您知道该对象A的世界转换矩阵是什么,您只需要构造该矩阵的逆矩阵,便会拥有所需的东西。

假设用于将其到达全局空间的对象A的旋转,缩放和平移矩阵分别为RST。您将像这样将它们相乘

S * R * T = W

现在,取W并以某种方式找到其逆W ^ -1。矩阵的逆是恰好相反的那个矩阵。矩阵与其逆的乘积始终是单位矩阵。

W * W ^ -1 =

因此W ^ -1 = I / W ;

现在,将此逆矩阵作为世界变换应用于场景,每个对象将位于所需的坐标中。

有关矩阵乘法,请参阅此页面。 有关身份矩阵,请参见此

这是另一个页面,该页面为您提供制作W所需的矩阵。

在上述问题中,应将x轴的平移设为50,将y轴的平移设为50,两个轴均不缩放,并且未指定旋转角度。


感谢您的回答,但实际上我对此并不了解。数学不是很好。与是矩阵?“旋转,缩放和平移矩阵”是什么意思?
Aviv Cohn 2014年

一个矩阵是表示一组相互关联的数字或对象的一个非常紧凑的方式。在计算机图形学中,它们被广泛用于进行计算。检查答案中的最后一个链接,以了解“旋转平移和缩放矩阵”的含义。是的,您必须阅读所有内容。否则,您可以使用ashes999的方法解决您的问题,但这不会考虑EntityA的旋转和缩放(如果存在)。
The Light Spark

9

我过去使用三角函数而不是矩阵来完成此操作(我是矩阵菜鸟)。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

2
+1比矩阵更直观,更易于使用三角函数。
Ramchandra Apte 2014年

那规模呢?什么时候使用?
Llamageddon 2015年

对不起,意味着轮换。
Llamageddon

6

让我尝试为您提供介于The Light Spark的答案和Elliot的答案之间的某个内容,因为从我的阅读中,您实际上是在寻找一种可以遵循的算法,而不仅仅是数学向您扔去。

问题陈述:假设您有一个位置A (50, 50)和一个标题(由于您没有提供位置和标题,所以我将其断言为y = 2 * x + 25),然后找到B (80, 90)相对于A标题的位置。

您实际上想要做的很简单。1)A移至系统的原点。这仅表示局部A值将是全局位置值减去的全局位置值AA(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 = Cwhere C是常数的形式出现。在这种情况下,phi = atan(2 * x / x) = atan(2) = 63.435度数。

现在,我们可以旋转系统以将航向移动到本地A系统的X轴。就像当我们移至A系统的原点时,我们要做的就是phiphi系统中的所有值中减去航向。因此,phiof B变为53.13 - 63.435 = -10.305度。

最后,我们必须将极坐标转换回x,y坐标。进行转换的公式是X = R * cos(phi)Y = R * sin(phi)。对于B因此,我们得到X = 50 * cos(-10.305) = 49.2Y = 50 * sin(-10.305) = 8.9,所以B在本地TO- A坐标接近(49,9)

希望对您有所帮助,并且对数学的了解足够浅,您可以照做。


1

您需要知道实体A在全局空间(x1,y1,θ)中的姿势,其中θ是相对于x轴的方向。

要将EntityB位置从全局坐标(x2,y2)转换为局部坐标(x2',y2'):


  1. 使用表达式

全球到本地

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

  1. 使用矩阵:

    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

-2

简单地说,实体B需要引用实体A。然后,您需要获取实体A的位置与实体B的位置之间的差。


3
我不明白这如何回答问题。
Anko 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.