Составить два поворота в геопроекции D3?
Получайте удовольствие от геоортографической проекции D3, чтобы построить интерактивный глобус, основываясь на всех замечательных примерах, которые я нашел.
Вы можете увидеть мой простой макет по адресу http://bl.ocks.org/patricksurry/5721459
Я хочу, чтобы пользователь управлял земным шаром, как трекбол ( http://www.opengl.org/wiki/Trackball). Я начал с одного из примеров Майка ( http://mbostock.github.io/d3/talk/20111018/azimuthal.html) и немного улучшил использование координат холста и выразил расположение мыши в "координатах трекбола" (то есть вращение вокруг холст горизонтальной и вертикальной осей), так что фиксированное движение мыши дает большее вращение вблизи краев земного шара (и работает за пределами земного шара, если вы используете гиперболическое расширение, описанное выше), а не одно из соответствий Майка: одно соответствие.
Это хорошо работает, когда глобус начинается в не повернутом положении (северный полюс по вертикали), но когда глобус уже повернут (манипулируйте примером так, чтобы северный полюс был обращен за пределы страницы), тогда элементы управления трекболом становятся неинтуитивными, потому что вы можете не просто выражать изменение координат трекбола как дельту в координатах d3.geo.rotate lat / lon. 3-осевое вращение D3 включает в себя вращение по долготе (вращение вокруг северного полюса), затем вращение по широте (вращение вокруг горизонтальной оси в плоскости холста), а затем вращение вокруг оси (вращение вокруг оси, перпендикулярной плоскости). - см. http://bl.ocks.org/mbostock/4282586.
Я предполагаю, что мне нужен метод для составления двух моих матриц вращения (та, которая в данный момент находится в проекции, с новой, чтобы немного вращать трекбол), но я не вижу способа сделать это в D3, кроме как копать в источник ( https://github.com/mbostock/d3/blob/master/src/geo/rotation.js) и пытаясь сделать математику для определения матрицы вращения. Код выглядит элегантно, но без комментариев, и я не уверен, что смогу правильно расшифровать замыкания с помощью экземпляра ортографической проекции.
И последнее: если кто-то знает форму матрицы вращения d3.geo.projection, это, вероятно, решит и мою проблему.
Есть идеи?
2 ответа
Существует альтернативное решение ответа Patricksurry, используя кватернионные представления, вдохновленные Джейсоном Дэвисом. Я тоже думал, что D3 уже поддерживал бы эту композицию изначально! И надеялся, что Джейсон Дэвис опубликовал свой код...
Потребовалось время, чтобы понять математику. Демонстрация загружена здесь, с попыткой объяснить математику тоже. http://bl.ocks.org/ivyywang/7c94cb5a3accd9913263
С моим ограниченным знанием математики, я думаю, одно из преимуществ кватерниона по сравнению с Эйлером - это возможность составлять множество вращений снова и снова, не беспокоясь о координатных привязках. Так что это всегда будет работать, независимо от того, где находится ваш северный полюс, и сколько бы вы не вращались. (Кто-то, пожалуйста, поправьте меня, если я ошибся).
Я решил, что решение для объединенной матрицы вращения может быть не таким сложным. Я получил http://sagemath.org/ чтобы выполнить большую часть тяжелой работы, чтобы я мог выразить композицию исходной ориентации rotate() проекции плюс вращение трекбола как один эквивалент rotate().
Это дает гораздо более естественное поведение независимо от ориентации земного шара.
Я обновил макет, чтобы он имел улучшенную версию - см. http://bl.ocks.org/patricksurry/5721459
Источники находятся по адресу http://bl.ocks.org/patricksurry/5721459 котором содержится объяснение математики - здорово, что вы можете использовать правильные греческие буквы в javascript для почти читаемого исходного кода математики!
Было бы хорошо, если бы D3 изначально поддерживал состав операций поворота (или, может быть, уже сделал?!)