2013-06-26 3 views
1

Учитывая жест на сенсорном экране, который описывает преобразование (масштабирование + поворот + перевод), я хотел бы изменить положение предстательной точки и цели, чтобы пальцы оставались липкими к соответствующим точкам на карте камера смотрит. Это в основном поведение карт Google. Это легко, когда вектор направления камеры (глаз - цель) перпендикулярен карте. Однако я не могу понять, как это решить в случае изменения перспективы, и он больше не ортогонален.Перемещение камеры на перспективной карте

Вращение, в частности, по отношению к направлению движения, перпендикулярное плоскости, смотрится, тривиально (вы поворачиваете цель и окошко вокруг непроектированного центра вращения с экрана и, следовательно, оси viewmatrix). Это становилось все труднее всякий раз, когда теряется свойство ортогональности. На самом деле, в таком случае, кажется, что вращение становится эллиптическим, и я теряюсь, где позиционировать новую цель. Любая идея?

+0

Почему downvote? Это интересный вопрос. –

+1

Можете ли вы уточнить, что вы подразумеваете под «пальцами остаются липкими на карте»? –

+1

Я думаю, что он имеет в виду, что он рисует карту на Google Maps. При перетаскивании одним пальцем проекция этого пальца на карту остается в том же положении, потому что камера переведена (краб). То же самое с двумя пальцами, потому что камера вращается вокруг оси обзора и масштабируется.Это справедливо для ортогональной проекции, но как вы это сделаете для перспективной проекции, если карта наклонена? Это правильно, ОП? Или вы все еще используете ортогональную проекцию и только поворачиваете карту? –

ответ

0

Основная проблема здесь заключается в том, что перевод объекта под перспективным проектором не 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) ,

Независимо от того, является ли поворот камеры вокруг ее источника разумным выбором для того, как вы хотите, чтобы пользователь мог перемещаться, я не могу сказать. Возможно нет.