Wolfram mathematica 球体上两个球坐标之间的ViewVector变换

Wolfram mathematica 球体上两个球坐标之间的ViewVector变换,wolfram-mathematica,Wolfram Mathematica,继续这个项目,我目前正在制作一个动画,展示一系列城市之间的运动。我当前的代码呈现一个城市列表,并创建一组连接城市的大圆弧。城市列表是时间线的一部分,因此在访问一个城市后,动画将过渡到以下一个城市为中心 在我看来,这意味着应该调整起点城市和终点城市之间的点。由此产生的结果可能看起来像一张长途飞行的飞行地图,大大加快了飞行速度。单个帧可能看起来像以下手动生成的帧: 我现在了解了如何在最近的城市上方定位ViewVector,但我不确定如何在两个球坐标点之间平滑移动摄影机。我目前的代码如下: SC[{

继续这个项目,我目前正在制作一个动画,展示一系列城市之间的运动。我当前的代码呈现一个城市列表,并创建一组连接城市的大圆弧。城市列表是时间线的一部分,因此在访问一个城市后,动画将过渡到以下一个城市为中心

在我看来,这意味着应该调整起点城市和终点城市之间的点。由此产生的结果可能看起来像一张长途飞行的飞行地图,大大加快了飞行速度。单个帧可能看起来像以下手动生成的帧:

我现在了解了如何在最近的城市上方定位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"]

在计算机图形学中,人们经常使用四元数在不同的摄像机观察方向之间平滑插值。Mathematica有一个可用于基本四元数算术的函数。描述了四元数和欧拉角之间的转换


描述了插值过程。

+1。有意思,我从没想过。对于球体上的点,这必须与从
SU(2)
SO(3)
的同态有关。