2

私が見つけたすべての素晴らしい例に基づいて、インタラクティブな地球を構築するために D3 地理正投影を楽しんでいます。

私のシンプルなモックアップはhttp://bl.ocks.org/patricksurry/5721459で見ることができます

ユーザーが地球儀をトラックボールのように操作できるようにしたい ( http://www.opengl.org/wiki/Trackball )。Mike の例の 1 つ ( http://mbostock.github.io/d3/talk/20111018/azimuthal.html ) から始めて、キャンバス座標を使用し、マウスの位置を「トラックボール座標」で表現するように少し改善しました (つまり、回転これにより、Mike の 1 対 1 の対応ではなく、固定されたマウスの動きが地球の端近くでより多くの回転を与えます (上記で説明した双曲線拡張を使用すると、地球の外側で機能します)。

地球が回転していない位置 (北極が垂直) から始まる場合はうまく機能しますが、地球が既に回転している場合 (北極がページの外を向くように例を操作します)、トラックボール コントロールは非直感的になります。単にトラックボール座標の変化を d3.geo.rotate lat/lon 座標のデルタとして表現するだけではありません。D3 の 3 軸回転には、経度回転 (北極を中心に回転)、緯度回転 (キャンバス平面の水平軸を中心に回転)、「ヨー」回転 (平面に垂直な軸を中心に回転) の適用が含まれます。 - http://bl.ocks.org/mbostock/4282586を参照してください。

私が必要としているのは、2 つの回転行列 (現在投影されているものと、トラックボールをわずかに回転させるための新しい行列) を構成する方法だと思いますが、掘る以外に D3 でそれを行う方法がわかりません。ソース ( https://github.com/mbostock/d3/blob/master/src/geo/rotation.js ) に入力し、回転行列を定義するために計算を試みます。コードは洗練されているように見えますが、コメントはありません。正射投影インスタンスでクロージャを正しく解読できるかどうかはわかりません。

最後の点で、誰かが d3.geo.projection の回転行列形式を知っていれば、おそらく私の問題も解決します。

何か案は?

4

2 に答える 2

3

Jason Daviesに触発されたように、クォータニオン表現を使用することにより、パトリックサリーの答えに対する代替ソリューションがあります。私も、D3 はこの構成をネイティブでサポートしていると思っていました。そして、Jason Davies が彼のコードを投稿してくれることを願っています...

数学を理解するのに時間がかかりました。デモもここにアップロードされ、数学の説明も試みられています。http://bl.ocks.org/ivyywang/7c94cb5a3accd9913263

私の限られた数学知識では、オイラーに対するクォータニオンの利点の 1 つは、座標参照を気にせずに複数の回転を何度も合成できることだと思います。したがって、北極がどこを向いていても、回転数に関係なく、常に機能します。(私がこれを間違っていたら、誰かが私を訂正してください)。

于 2015-10-24T04:40:16.540 に答える
2

組み合わせた回転行列を解くのはそれほど難しくないと判断しました。http://sagemath.orgに大変な作業のほとんどを任せてもらったので、元のプロジェクションのrotate()方向とトラックボールの回転の構成を単一の同等のrotate()として表現することができました。

これにより、地球の向きに関係なく、より自然な動作が得られます。

改善されたバージョンになるようにモックアップを更新しました - http://bl.ocks.org/patricksurry/5721459を参照してください

ソースはhttp://bl.ocks.org/patricksurry/5721459にあり、数学の説明が含まれています - JavaScript で適切なギリシャ文字を使用して、ほとんど読みやすい数学ソースコードを作成できるのはクールです!

D3 が回転操作の構成をネイティブにサポートしていればなお良いでしょう (または、既にサポートされているのではないでしょうか?!)。

于 2013-06-07T02:26:18.170 に答える