2

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

但是,是的,总是有一个但是,我很难理解一个对象从一个坐标空间到另一个坐标空间的转换。在书中,作者举了一个例子,在“世界空间”中用枪射击汽车(图像) ,该汽车旋转了 20 度(为简单起见,只是一个 2D 空间)。所以我们有三个空间:世界空间、枪对象空间和汽车对象空间——对吗?这本书接着说:

“在这个图中,我们引入了一种向汽车发射子弹的步枪。如左侧坐标空间所示,我们通常会从了解枪支和子弹在世界空间中的轨迹开始。现在,想象一下,在保持汽车、枪和子弹轨迹静止的情况下,将坐标空间变换为与汽车的物体空间一致。现在我们知道了枪的位置和子弹在汽车物体空间中的轨迹,我们可以进行交叉路口测试,看看子弹是否会击中汽车以及在何处击中汽车。”

我遵循这个解释,当我事先知道汽车在世界空间中旋转了 20* 度时,这不是问题——但是当我在游戏中有一个弓箭手从山上射击时,这如何转化为一种情况看不起别人?我不知道那里所有东西都移位的角度?

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

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

4

5 回答 5

3

您应该阅读如何更改基础并在向量中思考,而不是数组,而是数学:P

于 2009-02-01T14:47:08.807 回答
2

我曾经是一名游戏程序员,我一次又一次地这样做。最终,我不再使用角度。对于每个对象,我都有一个前向向量和一个向上向量。然后,您可以从叉积中获得向右的向量。并且所有空格之间的转换都变成了点积。

于 2009-01-31T23:17:49.620 回答
0

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

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

您必须了解汽车有自己的局部坐标系。汽车的几何形状是根据其局部坐标系定义的。所以无论它在世界中的方向如何,汽车的长度总是在它自己的本地系统中沿着 x 轴延伸。汽车可以通过变换其局部坐标系来定向。

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

如果无法绘制视觉场景,这是很难解释的,而且我的 google-fu 无法找到对基础知识的良好描述。

于 2009-01-31T23:05:28.723 回答
0

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

假设我们有两个空间 A 和 B,在 A 中,上、前和右分别是 (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) 等于 x*r + y*u + z*f + o在 B 中。这给出了三个未知数的三个方程,并且可以通过联立方程的方法求解。我不会在这里解释......但如果你遇到困难,这里有一个链接:link

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

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

于 2009-02-01T03:30:58.080 回答
0

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

枪和车的问题,在三个空间中的任何一个都可以解决。那么问题来了,哪个最容易?据推测,枪的空间设置为使子弹沿 X 轴发射。所以很容易将其转换为其他空间。2D 汽车可能会在它自己的对象空间中表示——可能是一组 2D 线段或 2D 像素或其他东西。您当然可以将它们转换为世界空间或枪的对象空间,但是如果您在汽车对象空间中解决问题,则根本不必转换它们,因此这是解决此问题的最简单方法。

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

于 2009-02-01T14:30:18.047 回答