游戏开发中的坐标系

July 21st, 2010 no comment

游戏和图形开发中常用的坐标系有:世界坐标系、物体坐标系、摄像机坐标系、惯性坐标系、嵌套坐标系。

先说一下数学上的空间直角3维坐标系。

空间直角坐标系
解析几何为了沟通空间图形与数的研究,需要建立空间的点与有序数组之间的联系,为此我们通过引进空间直角坐标系来实现。
过定点O,作三条互相垂直的数轴,它们都以O为原点且一般具有相同的长度单位。这三条轴分别叫做x轴(横轴)、y轴(纵轴)、z轴(竖轴),统称坐标轴。通常把x轴和y轴配置在水平面上,而z轴则是铅垂线。

右手坐标系:当它们的正方向要符合右手规则,即以右手握住z轴,当右手的四指从正向x轴以π/2角度转向正向y轴时,大拇指的指向就是z轴的正向,这样的三条坐标轴就组成了一个空间直角坐标系,点O叫做坐标原点。

左手坐标系:当它们的正方向要符合左手规则,即以左手握住z轴,当右手的四指从正向x轴以π/2角度转向正向y轴时,大拇指的指向就 是z轴的正向,这样的三条坐标轴就组成了一个空间直角坐标系,点O叫做坐标原点。

图示如下

另外一个简单的判断方法:在空间直角坐标系中,让右手拇指指向x轴的正方向,食指指向y轴的正方向,如果中指能指向z轴的正方向,则称这个坐标系为右手直角坐标系.同理左手直角坐标系。

DirectX中使用的是“左手坐标系”,M$ XNA是使用的“右手坐标系”,OpenGL使用的是“右手坐标系”,大多数数学运算中也使用的“右手坐标系”。

看来M$一向的另类,自己的两套东西坐标系都正好相反。

世界坐标系
世界坐标系是描述其它坐标系所需要的参考框架,只能用世界坐标系描述其他坐标系的位置,不能用更大的,外部的坐标系来描述世界坐标系。关于世界坐标系的的典型问题都是关于初始位置和环境的,如:

  1. 每个物体的位置和方向。
  2. 摄像机的位置和方向。
  3. 世界的每一点的地形是什么
  4. 各物体从哪里来,到哪里去。

物体坐标系
物体坐标系是和特定物体相关的坐标系。每个物体都有它们独立的坐标系。 在物体坐标系中可能会遇到的问题:

  1. 周围有需要互相作用的物体吗?(我要攻击它吗?)
  2. 哪个方向,在我前面吗?我左边一点?(我应该射击还是转身就跑)

摄像机坐标系
摄像机坐标系是和观察者密切相关的坐标系。是一种特殊的“物体”坐标系。 问题:

  1. 3D空间中的给定点在摄像机前方吗?
  2. 3D空间中的给定点在屏幕上还是超出了边界?
  3. 某个物体是否在屏幕上?部分还是全部在?
  4. 两个物体谁在前面?(可见性检测,深度排序)

惯性坐标系
惯性坐标系是为了简化世界坐标系到物体坐标系的转换。从物体坐标系到惯性坐标系只需旋转,从惯性坐标系到世界坐标系只需平移。
嵌套坐标系
嵌套坐标系同样为了简化物体在世界坐标系中位置,如一个物体坐标系嵌套一个头部坐标系,则头部坐标系可以只与物体坐标系联系,简化操作。