在两个坐标空间之间转换对象

时间:2009-01-31 22:33:57

标签: c++ math 3d vector matrix

所以我正在阅读“图形和游戏开发的3D数学入门”一书,来自几乎非数学背景,我终于开始掌握向量/矩阵数学 - 这是一种解脱。

但是,是的,总有一个但是,我无法理解一个物体从一个坐标空间到另一个坐标空间的转换。在这本书中,作者以gun shooting at a car (image)为例,在“世界空间”中将其转为20度(简单来说就是2D空间)。所以我们有三个空间:世界空间,枪对象空间和汽车对象空间 - 对吗?然后这本书说明了这一点:

  

“在这张图中,我们推出了一种可以在汽车上发射子弹的步枪。正如   在左边的坐标空间,我们通常首先要知道枪和轨迹   世界空间中的子弹。现在,想象一下将坐标空间转换为符合   汽车的物体空间,同时保持汽车,枪和子弹的轨迹仍然存在。现在我们   知道枪的位置和子弹在汽车物体空间的轨迹,我们   可以进行相交测试,以查看子弹是否会撞到汽车的位置。“

我遵循这个解释,当我事先知道汽车在世界空间旋转了20度时,这不是问题 - 但是如果我在拍摄游戏中有射手的情况怎么说呢?从山上下来别人?我不知道一切都在那里转移的角度?

哪个物体空间在这里旋转?世界还是枪支空间?是的,你可以看到我有点困惑。

我认为理想的反应是使用汽车和枪支示例,使用任意变量作为位置,角度等。

5 个答案:

答案 0 :(得分:3)

你应该阅读如何change basis并在 vector 中思考,而不是数组而是数学:P

答案 1 :(得分:2)

我曾经是一名游戏程序员,我一次又一次地这么做。最终,我离开了使用角度。对于每个物体,我都有一个前向矢量和一个向上矢量。然后,您可以从交叉产品中获得面向右侧的向量。空间之间的所有转换都成为点积。

答案 2 :(得分:0)

您是否了解如何协调空间和变换如何在2D中工作?我发现在尝试移动到3D之前,坐标空间和变换在2D中更容易可视化。这样你就可以在纸上制作“假设”场景,并帮助你理解主要概念。

在您发布的图片中,我认为解释是汽车本身的内部坐标系没有改变,但是它的系统已经相对于世界系统进行了旋转。

你必须明白汽车有自己的局部坐标系。汽车的几何形状根据其局部坐标系来定义。因此,无论其在世界中的方向如何,汽车的长度始终沿着其本地系统中的x轴延伸。可以通过改变其局部坐标系来定向汽车。

坐标系统总是相对于另一个系统定义,除了根,在本例中为世界。因此枪有自己的系统,汽车有自己的系统,它们都嵌入到世界系统中。如果我相对于世界旋转或移动汽车的系统,那么即使几何图形不变,汽车也会旋转。

如果没有能够绘制视觉场景,这是很难解释的,而且我的谷歌未能找到对基础知识的良好描述。

答案 3 :(得分:0)

正如之前的回复所示,保持向上,向前和向右矢量是定义(欧几里得)坐标空间的好方法。如果你添加一个原点,它会更好,因为你可以代表更广泛的空间。

假设我们有两个空间A和B,分别在A,up,forward和right分别为(0,1,0),(0,0,1)和(1,0,0),以及原点如果为零,则为A提供通常的左手xyz坐标。对于B,我们有u =(ux,uy,uz),f =(fx,fy,fz)和r =(rx,ry,rz)起源o =(ox,oy,oz)。那么对于B中p =(x,y,z)处的点,我们得到A(x * rx + y * ux + z * fx + ox,x * ry + y * uy + z * fy + oy,x * rz + y * uz + z * fz + oz)。

这可以通过检查得出。注意,由于B的右,向上和向前矢量在A的每个轴上都有分量,B中某些坐标的分量必须对A中坐标的所有三个分量起作用,即从(0,1,0)到B等于(ux,uy,uz),然后(x,y,z)= y * u +(其他一些东西)。如果我们为每个坐标执行此操作,则我们得到(x,y,z)= x * r + y * u + z * f +(其他一些东西)。如果我们观察到原点这些术语除了(其他一些东西)之外就消失了,那么我们就会发现(其他一些东西)实际上必须是o,它给出A中的坐标为x * r + y * u + z * f + o,即(x * rx + y * ux + z * fx + ox,x * ry + y * uy + z * fy + oy,x * rz + y * uz + z * fz + oz )一旦矢量操作被扩展。

此操作也可以反转,我们只需在A中设置坐标并求解方程式以在B中找到它们。 A中的(1,1,1)等于B中的x * r + y * u + z * f + o。这给出了三个未知数的三个方程,并且可以通过联立方程的方法求解。我不打算在这里解释一下......但如果你遇到困难,这里有一个链接:link

所有这些与你原来的子弹和汽车的例子有什么关系?好吧,如果您使用汽车旋转一组向上/向右/向前矢量,并在汽车翻译时更新原点,您可以从世界空间移动到汽车的本地空间并使一些测试更容易。例如,您可以将子弹转换为“汽车本地”空间并使用本地坐标,而不是转换碰撞模型的顶点。如果您要转换汽车的顶点以便在GPU上渲染,这很方便,但是不想让读取该信息的开销用于CPU上的物理计算。

在其他用途​​中,它可以通过变换三个点并执行这些操作来节省您转换x点,这样您就可以在大量点上组合x变换,而不会在相同数量的单个变换上产生显着的性能损失。分。

答案 4 :(得分:0)

在游戏情况下,你通常不会知道汽车本身旋转了20度;相反,您的汽车定位信息将隐含地包含该知识。因此,在这个二维示例中,您将知道汽车中心的x,y坐标以及汽车指向的x,y矢量(世界空间中的两条信息) - 否则您将无法画它。这两条信息是您在世界空间和汽车物体空间之间进行转换所需的矩阵。 (然后一个人可以在这个例子中查看那个矩阵并说,哦,看,旋转20度 - 但这不是你通常在游戏中担心的一条信息。)

枪和汽车的问题可以在三个空间中的任何一个中解决。所以问题是,哪个最简单?据推测,枪的空间设置成使子弹沿X轴向下发射。所以很容易将其转换为其他任何一个空格。 2D汽车可能会在其自己的对象空间中表示 - 可能是一组2D线段或2D像素或其他东西。你当然可以将它们转化为世界空间或枪的物体空间,但如果你解决了汽车物体空间中的问题,你根本不需要翻译它们,所以这是最容易解决这个问题的人。

它有点像相对论:从它自己的角度来看,没有一个空间是旋转的。然而,与相对论不同,我们将世界空间视为一种特权固定的参考框架。因此,对象的模型空间相对于世界空间进行旋转,镜像,缩放,翻译等。