在D3地理投影中组合两个旋转?

时间:2013-06-06 14:37:58

标签: d3.js 3d computational-geometry rotational-matrices d3.geo

根据我发现的所有优秀例子,玩D3地理正投影来构建交互式地球仪。

您可以在http://bl.ocks.org/patricksurry/5721459

看到我的简单模型

我希望用户像轨迹球一样操纵地球(http://www.opengl.org/wiki/Trackball)。我从迈克的一个例子(http://mbostock.github.io/d3/talk/20111018/azimuthal.html)开始,并略微改进以使用画布坐标并在'轨迹球坐标'中表示鼠标位置(即围绕画布水平和垂直轴旋转),以便固定的鼠标移动提供更多在地球边缘附近旋转(如果使用上面解释的hyberbolic扩展,则在地球外工作),而不是Mike的一个:一个对应。

当地球仪在未旋转的位置(北极垂直)开始时,它可以很好地工作,但是当地球仪已经旋转(操纵示例以使北极朝向页面外)时,轨迹球控制将变得不直观因为你不能简单地将轨迹球坐标的变化表示为d3.geo.rotate lat / lon坐标中的delta。 D3的3轴旋转涉及应用经度旋转(绕北极旋转),然后是纬度旋转(围绕画布平面中的水平轴旋转),然后是“偏航”旋转(围绕垂直于平面的轴旋转) - 见http://bl.ocks.org/mbostock/4282586

我想我需要的是一个组合我的两个旋转矩阵的方法(当前在投影中的一个,用一个新的旋转轨迹球稍微),但我在D3中看不到这样做的方法,除了深入挖掘源(https://github.com/mbostock/d3/blob/master/src/geo/rotation.js)并尝试进行数学运算以定义旋转矩阵。代码看起来很优雅,但没有注释,我不确定我是否可以正确解释正交投影实例的闭包。

最后一点,如果有人知道d3.geo.projection的旋转矩阵形式,也可能解决我的问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我决定解决组合旋转矩阵可能不那么难。我得到http://sagemath.org来完成大部分的努力工作,这样我就可以将原始投影rotate()方向的组合加上轨迹球旋转表示为单个等效的rotate()。

无论地球的方向如何,这都会提供更自然的行为。

我更新了模型以使其具有改进的版本 - 请参阅http://bl.ocks.org/patricksurry/5721459

源代码位于http://bl.ocks.org/patricksurry/5721459,其中包含对数学的解释 - 很酷,您可以在javascript中使用适当的希腊字母来获取几乎可读的数学源代码!

如果D3本身支持旋转操作的组合(或者它可能已经存在?),那仍然会很好。

答案 1 :(得分:2)

通过使用四元数表示,patricksurry的答案有另一种解决方案,受到Jason Davies的启发。我也认为D3本来就已经支持过这个组合了!希望Jason Davies发布他的代码......

花了一些时间来计算数学。这里上传了一个演示,试图解释数学。 http://bl.ocks.org/ivyywang/7c94cb5a3accd9913263

凭借我有限的数学知识,我认为,四元数优于欧拉的优点之一是能够反复复合多次旋转,而不必担心坐标参考。无论你的北极面向哪里,无论你有多少次旋转,它都会一直有效。 (如果我弄错了,请有人纠正我)。