2009-01-31 60 views
2

因此,我正在阅读“3D图形与游戏开发的数学入门”一书,它几乎来自非数学背景,我终于开始掌握矢量/矩阵数学 - 是一种解脱。在两个坐标空间之间转换一个对象

但是,是的,总是有一个但是,我很难理解一个对象从一个坐标空间到另一个坐标空间的转换。在本书中,作者以gun shooting at a car (image)为例,它在“世界空间”中旋转了20度(仅为简单的2D空间)。所以我们有三个空间:世界空间,枪物体空间和汽车物体空间 - 是否正确?然后书中指出这一点:

“在这个图中,我们已经介绍了在车上发射子弹步枪正如 左侧表示坐标空间,我们通常会由寂寂开始现在我们可以想象在保持汽车,枪和弹道轨迹的情况下,将坐标空间变换为符合 汽车的物体空间,现在我们 知道位置枪的位置以及子弹在汽车物体空间的轨迹,我们可以执行相交测试,以查看子弹是否会撞到汽车并在哪里撞上汽车。“

我按照这个解释,当我事先知道,该车旋转在世界空间20 *度,这不是一个问题 - 但这是如何转化成的情况说,当我有一个弓箭手在从山上向另一个人射击的游戏中?我不知道所有东西都在那里移动的角度?

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

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

回答

3

你应该阅读如何change basis,想矢量,不是数组,但数学的人:P

0

你明白如何概念如何协调空间和2D转换工作?我发现在尝试移动到3D之前,坐标空间和变换在2D中更易于可视化。通过这种方式,您可以在纸上创建“假设”情景,并帮助您理解主要概念。

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

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

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

这是非常难以解释的东西,因为我无法画出视觉场景,而且我的google-fu无法找到对基础知识的很好描述。

2

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

0

正如前面的回复所示,保持向上,向前和向右是定义(欧几里得)坐标空间的好方法。如果你添加一个原点,它会更好,因为你可以代表更广泛的空间。假设我们有两个空间A和B,A,上,前和右分别是(0,1,0),(0,0,1)和(1,0,0),并且原点为零,这给出了通常的左手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)in 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中找到它们。 (1,1,1)等于B中的x * r + y * u + z * f + o。这给出了三个未知数的三个方程,可以用联立方程的方法求解。我不会在这里解释这个......但是如果你卡住了,这里是一个链接:link

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

在其他用途​​中,它可以通过转换三个点并执行这些操作来节省转换x点的次数,这允许您在大量点上组合x个转换,而不会对整个相同编号中的单个转换造成显着的性能影响点。

0

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

问题的枪和车可以在三个空间中的任何一个中解决。所以问题是,哪一个最简单?大概枪的空间被设置,以便子弹沿着X轴发射。所以很容易把它翻译成其他空间。 2D汽车可能会在其自己的物体空间中表现出来 - 可能是一组2D线段或2D像素或其他物体。你当然可以把它们翻译成世界空间或枪的物体空间,但是如果你解决了汽车物体空间的问题,你根本不需要翻译它们,所以这是解决这个问题的最简单的方法。

它有点像相对论:从它自己的角度来看,没有一个空间是旋转的。尽管与相对论不同,我们把世界空间视为一个特权固定的参照系。因此,对象的模型空间相对于世界空间被旋转,镜像,缩放,翻译等。

相关问题