坐标系的旋转与平移 - chunlieater/chunlifeet GitHub Wiki

  • 3d坐标系分三个轴向,其旋转和平移可以看作是三个轴向上变化后的结合,每次运算时只在一个平面内进行。 我们把空间中一个点在原坐标系中的坐标记做P(x,y),当坐标系发生变换后,这个点在新坐标系中的坐标记做P'(x',y'),坐标系转换就是求P和P'之间的关系。
  1. 坐标系的平移 新坐标系和原坐标系如果是平移关系,移动的距离为x轴i,y轴j,那(x,y) = (x'+i,y'+j).
  2. 坐标系旋转 新坐标系和原坐标系如果是旋转关系,旋转轴为z,旋转角度为a,那(x,y) = (x'cosa-ysina,y'*cosa+x'*sina),沿轴向正方向做顺时针移动a为正值,逆时针移动a为负值。
  • 等角变换和二等角投影 这是一种特殊的坐标系,用来制作2d游戏的透视地图,相当于计算一个先沿着y轴旋转45度,再沿着x轴旋转-30度的坐标系,在屏幕坐标系上的投影。 设点在屏幕坐标系的坐标为Ps(xs,ys),在自身坐标系(旋转后的坐标系)中的坐标为P'(x',y'),则可以这样推导他们的关系。
  • xs = x'*cos45 - z'*sin45
  • zs1 = z'*cos45 + x'*sin45
  • ys = y'cos-30 -zs1sin-30
  • zs2 = zs1*cos-30 + y'*sin-30
  • 最后精简为
  • xs = x'-z'
  • ys = y'*1.2247 +(x'+z')*0.5
  • zs2 =(x'+z')*0.866 - y'*0.707 ,zs2在深度排序中有用。
  • 如果场景中的所有对象高度相同,那么*1.2247是可以去掉的。
  • xs = x'-z'
  • ys = y'+(x'+z')*0.5
  • 因为一般在自身坐标系中y'都是0,所以进一步简化成
  • xs = x'-z'
  • ys = (x'+z')*0.5
  • 好了,现在可以根据场景的自身坐标系求出它的点在一个2d屏幕坐标系中的坐标了。然后还需要根据这个反推出如果点在屏幕坐标系的一个点上,如何求出它在自身坐标系中的值。
  • xs = x' - z'
  • ys = y'*1.2247 + (x'+z')*0.5
  • 由于y‘一般为0,所以反推为
  • x' = ys + xs/2
  • y' = 0
  • z' = ys - xs/2

如果旋转和平移同时发生,那么一般来说,先将自身坐标系旋转到和原坐标系角度一致,求得点在旋转后的坐标系中的坐标值,再进行坐标系平移,求得最终结果。