背景:在三维场景中,我们经常会需要模拟一些运动的目标,比如行驶中的汽车,飞行中的飞机,在轨运行的卫星等等。我们可以动态的设置模型或者图元的位置来使其运动起来,单纯的位置移动比较容易实现,但运动姿态(例如汽车的朝向)则需要我们进行计算,相对于位置来说姿态的计算会复杂一些。
本文通过坐标系介绍、目标位置计算、目标姿态计算三部分循序渐进地讲解了如何实现三维场景中动目标姿态的计算。
1.球心坐标系、模型坐标系
球心坐标系是指坐标原点与地心重合,Z轴垂直赤道面,X轴朝向(东经0°,北纬0°),Y轴朝向(东经90°,北纬0°),如图1所示。
图1 Cesium球心坐标系
模型坐标系是建模软件在建模过程中或者在程序构建图元时使用的坐标系,为了方便建模,一般球状物体的原点都在物体中心,游戏角色模型原点一般位于脚部。
在三维场景中直接加载模型,模型中心点会与地心重合,也就是说模型坐标(0,0,0)会和球心坐标(0,0,0)点重合。如果我们想要把模型放置到地球表面某一点,就需要经过一个矩阵转换把模型的顶点坐标转换到地球表面。
当然你也可以在建模的时候就把模型建立在目标位置的世界坐标上比如(100,0,0),但是当你想让模型绕中心点旋转的时候,模型会沿着世界坐标的原点作半径为100的圆周运动,如果要达到正确的效果,你就需要先把模型移到世界原点,旋转,然后再移回来,操作起来会比较麻烦。
2. 目标位置计算
接下来再了解一下,Cesium中是如何把模型放置到地球表面的指定位置处。我们一般都是使用的地理坐标经度、纬度、高度,比如(108.0,30.0,1000.0),通过Cesium.Cartesian3.fromDegrees(108,30,1000)转换得到其对应的世界坐标,然后通过一个四维矩阵对模型进行平移和旋转,Cesium中提供了多种世界坐标转换为矩阵的接口,不同的转换接口,放置到地球表面模型的姿态角度不同。如图2所示,转换到地球高空某位置的飞机会有各种姿态,其中我们经常用到的“东北天”坐标是中间ClassicalEastNorthUp local Frame所示效果,模型坐标系的X轴朝向正东方向,Y轴朝向正北方向,Z轴朝向垂直于地球表面向上方向。