我应该使用笛卡尔(x和y)或极坐标(角度和幅度)坐标系来表示速度吗?

时间:2011-05-19 20:29:08

标签: math vector physics game-physics

我正在编写一个物理游戏。似乎我可以使用2个系统来存储角色的移动数据:
  A) x& y components (笛卡尔坐标)   B)速度和方向组件(极坐标)

似乎我需要最终决定这两个系统中的一个,因为:
  A)它们都代表有关矢量的相同信息   B)维护两者似乎多余且效率低下

我发现大多数游戏编程资源都使用笛卡尔。根据我的理解,所有变换如摩擦,旋转,加速等都通过乘法,除法等组合到每个矢量中。但对我来说,极感觉更模块化,因此更具延展性,因为每个矢量包含可以分解分为两个元素(方向和幅度)。如果我想独立修改其中一个,我可以设置其值,而无需将其解构为单独的部分。

我猜不同的模型适合不同类型的游戏。但是......
使用笛卡尔与极地的决定会产生什么影响?
什么时候一个模型变得笨重或冗长?

还是我离开了?

5 个答案:

答案 0 :(得分:3)

你的问题的前提有点奇怪。幅度加角度和2个基本分量的总和都是在2空间中指定矢量的方式。在任何一种情况下,您都会记录2个标量(即您没有单独的变量来表示x单位向量)。矩形与极坐标的选择不会改变从矢量到标量的某些特性,反之亦然。

但是,不同的表示肯定有其用途。正如您所提到的,分解为正交分量具有添加两个向量和其他操作的现成优势。此外,大多数显示器使用x-y坐标系,因此渲染更容易,因为您不必进行坐标转换。

如果你的游戏是基于极坐标系(比如总是面向圆心的船),你可能真的想用极坐标来表示它。除此之外,直角坐标通常更容易使用。

无论哪种方式,罪和cos都可能成为你的朋友。请记住,大多数图形坐标系都是y-down为正。

答案 1 :(得分:2)

你对矢量和标量之间的区别感到困惑。

沿x轴的速度是标量。

沿y轴的速度也是一个标量。

将这两个数字组合成一个数学对象时,该对象就是速度向量。可以把它想象成一个2元素的数组:[x,y]

类似地,

推力是一个标量。

角度是标量。

这两个数字的组合是一种不同的速度矢量[推力,角度]。

在[x,y]系统中可以表达的任何速度也可以在[推力,角度]系统中表示。

你可能会对“基础向量”感到困惑。在第一个坐标系中,基矢量是一个单位长的矢量,它沿x或y轴指向。因此[1,0]将是沿x轴为一个单位的基矢量,[0,1]将是沿y轴一个单位的基矢量。关于基矢量有趣的是,任何矢量都可以表示为基矢量的线性组合。

所以如果i = [1,0],j = [0,1]则

(34.5 i + -4.45 j)是一个向量,

(4.65 i + 23.3 j)是一个向量,

等。 (如果你不熟悉矢量加法,只需谷歌吧,这很容易)

现在你可能会认为,当你采用二维空间并使用不同的坐标系(如极坐标,这实际上就是你的推力/角度坐标)时,你正在远离基础向量,但事实上你不是。因此,对于您的推力和角度坐标系,您的基础向量是:

i = 1个正推力单位,或半径

j = 1度(或弧度)的正角度

任何可能的速度仍然是i和j的组合,你的基础向量。

答案 2 :(得分:1)

这两个表示在数学上是等价的。另外,将一个转换为另一个是简单的O(1)操作。所以请注意,这可能不是一个成败的决定。也就是说,就易用性而言:

你可能是正确的,这取决于哪种情况更合适,所以无论你能预见到自己经常使用哪种情况,那么请继续使用,并在必要时转换为其他形式。

使用语言功能来帮助您抽象出特定的实现类型。例如。如果您使用的是Java,请使用相关方法的IPoint接口。这样,您可以选择实施,甚至更多,以满足需求。您甚至可以选择程序的某些部分来处理一个实现,而其他部分则可以选择其他类型。适当的架构将使这些东西无缝

根据某些计算,您可能更愿意使用能够提供更高精度的计算。如果您正在进行具有大不相同的浮点运算,则可能会出现精度损失。在这种情况下,例如,它可以更容易使用角度和长度表示,因为角度将具有持久的精度,并且长度可以具有相似的幅度,而在x和y表示中不能保证这样。虽然你认为这是一个稍微不那么迫切的问题,但如果你的价值观合理且计算名义上的话。

答案 3 :(得分:0)

你所谓的“标量”实际上只是一个极向量,对吧?所以你的问题不是关于矢量vc标量,而是关于笛卡尔与极坐标系。 [x,y]和[theta,r]都是矢量。

我还没有完成很多物理编程,但是上次我做了它并且开始变得复杂(模拟鱼在三维空间中游泳),我对处理极坐标感觉更舒服。我正在从头开始实现一个类似boids的算法,我发现从极向量的角度思考它会更直接,特别是在三维工作时。我还发现使用三角函数(acos(),asin()等)比使用你在笛卡尔系统中使用的毕达哥拉斯公式更清洁。

但你真的在这么低的水平编码吗?

答案 4 :(得分:0)

系统的动态通常更容易在(点,速度)框架中描述。实际上,“基本”ODE通常在该系统中描述:

d (mv) / dt = force(x)

因此也更容易插入黑盒Runge Kutta解算器。

但是,由于canonical transformations,任何系统都可以。