Основная проблема здесь заключается в том, что перевод объекта под перспективным проектором не preserve lengths. Если у вас есть сегмент линии (A, B) в мировой системе координат, который проецируется на экран на (A ', B'), и вы переводите его на (A + v, B + v) в WCS, вы (A '+ v1', B '+ v2'), и вообще v1 'не будет равно v2'. И наоборот, если вы переводите (A ', B') на (A '+ v', B '+ v') на экране, вы не сможете найти перевод (A + v0, B + v1), который проецируется на (A '+ v', B '+ v'), где v0 равно v1.
Это означает, что проблема некорректна. Не существует уникального решения. На самом деле, с ортогональной проекцией тоже нет единственного решения, так как вы всегда можете перевести карту в направлении z. Но это не имеет значения, потому что проекция выступает вдоль этой оси. Таким образом, с ортогональной проекцией ясно, какое из бесконечного числа решений вы выбираете: тот, который не меняет z. С перспективой проекции это не ясно. Это во многом зависит от того, как вы хотите, чтобы пользователь мог перемещаться.
Я думаю, что наиболее интуитивным способом решения жестов с переводом было бы поворот камеры. Поэтому вместо перевода карты вы будете вращать ее вокруг начала координат. Можно утверждать, что для ортогональной проекции одно и то же: если вы постепенно конвертируете свою камеру с проекции перспективы в ортогональную проекцию, вы будете двигаться дальше и дальше, пока сузите поле зрения, и когда вы приближаетесь к бесконечности, поворот вокруг начала координат становится трансляцией, ортогональной направлению просмотра.
Однако пальцы не были бы совершенно липкими. Для жестов перевода двумя пальцами экран должен быть изогнут для этого. Но поскольку он плоский, искажение перспективы станет больше возле границы экрана (расстояния искажаются все больше и больше). В то время как вы могли бы добавить некоторый трансфокатор или трансляцию вдоль оси обзора, чтобы держать пальцы липкими, это может быть немного контр-интуитивным. Я думаю, это эллиптическое движение, о котором вы говорили. Поэтому я, вероятно, поцарапал бы липкость и сопоставлял бы перевод центра C пальца на поворот вокруг начала координат, поворот пальцев на поворот вокруг луча зрения через C и жест жесткости на зум (изменение FOV) ,
Независимо от того, является ли поворот камеры вокруг ее источника разумным выбором для того, как вы хотите, чтобы пользователь мог перемещаться, я не могу сказать. Возможно нет.
Почему downvote? Это интересный вопрос. –
Можете ли вы уточнить, что вы подразумеваете под «пальцами остаются липкими на карте»? –
Я думаю, что он имеет в виду, что он рисует карту на Google Maps. При перетаскивании одним пальцем проекция этого пальца на карту остается в том же положении, потому что камера переведена (краб). То же самое с двумя пальцами, потому что камера вращается вокруг оси обзора и масштабируется.Это справедливо для ортогональной проекции, но как вы это сделаете для перспективной проекции, если карта наклонена? Это правильно, ОП? Или вы все еще используете ортогональную проекцию и только поворачиваете карту? –