正如之前的回复所暗示的,保持向上、向前和向右的向量是定义(欧几里得)坐标空间的好方法。如果你也添加一个原点会更好,因为你可以代表更广泛的空间。
假设我们有两个空间 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 转换,而不会对相同数量的点上的单个转换造成显着的性能影响。