2

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

你可以在http://bl.ocks.org/patricksurry/5721459看到我的简单模型

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

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

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

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

有任何想法吗?

4

2 回答 2

3

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

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

我认为,以我有限的数学知识,四元数相对于 Euler 的优势之一是能够一遍又一遍地复合多个旋转,而不必担心坐标参考。因此,无论您的北极面向何处,无论您将进行多少次旋转,它都将始终有效。(如果我错了,请有人纠正我)。

于 2015-10-24T04:40:16.540 回答
2

我决定求解组合旋转矩阵可能并不难。我让http://sagemath.org完成了大部分艰苦的工作,这样我就可以将原始投影旋转()方向加上轨迹球旋转的组合表示为单个等效旋转()。

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

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

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

如果 D3 本身支持旋转操作的组合(或者可能已经支持?!)

于 2013-06-07T02:26:18.170 回答