地球上两个球面坐标之间的ViewVector过渡

时间:2011-10-05 08:46:43

标签: wolfram-mathematica

继续我的项目previously described我正在构建一个动画,显示城市列表之间的移动。我当前的代码呈现了一个城市列表,并创建了一组连接城市的大圆弧。城市列表是时间轴的一部分,因此在访问一个城市后,动画将转换为以下一个城市为中心。

在我看来,这意味着应调整ViewVector以显示起始城市和结束城市之间的点。由此产生的结果可能看起来像飞行中的地图,长途飞行的速度相当大。单帧可能看起来像下面手动生成的那样:

enter image description here

我现在明白如何将ViewVector定位在最近的城市上方,但我不确定如何在两个球面坐标点之间平滑移动相机。我目前的代码如下:

SC[{lat_, lon_}] := {Cos[lon \[Degree]] Cos[lat \[Degree]], 
   Sin[lon  \[Degree]] Cos[lat  \[Degree]], Sin[lat \[Degree]]};

GreatCircleArc[{lat1_, lon1_}, {lat2_, lon2_}] :=

 Module[{u = SC[{lat1, lon1}], v = SC[{lat2, lon2}], a}, 
  a = VectorAngle[u, v]; 
  Table[Evaluate[RotationTransform[\[Theta], {u, v}][u]], {\[Theta], 
0, a, a/Ceiling[10 a]}]]

CityGraphic[name_] := {Opacity[0.85], Black, PointSize[Medium], White,
   PointSize[0.045], Point[1.01 SC[CityData[name, "Coordinates"]]]}

CityGraph[places_, age_] := 
  Graphics3D[{
Opacity[0.75],
Sphere[{0, 0, 0}, 0.99 ],
Map[Line[
   Map[SC,
    CountryData[#, "SchematicCoordinates"], {-2}]] &,
 CountryData["Countries"]],
Map[CityGraphic, places],
Text[Style[age, FontFamily -> "Helvetica"], 
 1.02 SC[CityData[First[places], "Coordinates"]]],
White, Line
 [Apply[GreatCircleArc, 
  Partition[Map[CityData[#, "Coordinates"] &, places], 2, 1], {1}]]
},
   ViewVector -> { 
 4 SC[CityData[First[places], "Coordinates"]], {0, 0, 0}},
   Boxed -> False,
   SphericalRegion -> True,
   ImageSize -> {640, 480}
   ];
CityGraph[{"Tokyo", "Dublin", "Cape Town", "Seattle", "Denver"}, "04"]

1 个答案:

答案 0 :(得分:5)

在计算机图形学中,人们经常使用四元数在各种相机观察方向之间平滑插值。 Mathematica有一个Quaternion package,你可以用它来进行基本的四元数算术。描述了四元数和欧拉角之间的转换here

插值过程描述为here