继续我的项目previously described我正在构建一个动画,显示城市列表之间的移动。我当前的代码呈现了一个城市列表,并创建了一组连接城市的大圆弧。城市列表是时间轴的一部分,因此在访问一个城市后,动画将转换为以下一个城市为中心。
在我看来,这意味着应调整ViewVector以显示起始城市和结束城市之间的点。由此产生的结果可能看起来像飞行中的地图,长途飞行的速度相当大。单帧可能看起来像下面手动生成的那样:
我现在明白如何将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"]
答案 0 :(得分:5)
在计算机图形学中,人们经常使用四元数在各种相机观察方向之间平滑插值。 Mathematica有一个Quaternion package,你可以用它来进行基本的四元数算术。描述了四元数和欧拉角之间的转换here。
插值过程描述为here。