Вращение сферы от точки к точке - PullRequest
1 голос
/ 24 ноября 2010

У меня есть единичная сфера, которая центрирована в начале координат, а моя камера также центрирована в начале координат.Камера обращена к z = -1.Я меняю точку обзора, поворачивая камеру сначала вокруг оси x, а затем вокруг оси z.Это делается в opengles 1.1 с использованием glrotate (phi, 1,0,0);glrotate (theta, 0,0,1)

По сути, это дает мне точку обзора камеры, где z = (0,0,1) всегда является восходящим вектором.Использование gluLookAt дало бы мне тот же результат, если бы я указывал, на какую точку зрения смотреть.Я также ранее определил матрицу проекции.

Теперь для реального вопроса:

Я нажимаю на экран, и первая точка, на которую я нажимаю, преобразуется обратно черезматрица проекции и матрица просмотра модели и сохранены.то есть pl = положение пикселя на экране, P = матрица проекции, M = матрица вида модели, ps = точка на сфере в 3d

P * M * ps = pl, поэтому ps = inv (M) * inv (P)* pl

Выполнение этого шага тривиально.Следующая часть - нет.

Теперь я хочу щелкнуть где-нибудь еще на экране, поэтому я получаю plnew и хочу выяснить, какая матрица Mnew будет вызывать поворот, так что точка ps теперь будет появляться в plnewна экране, то есть P * Mnew * ps = plnew

Это явно недостаточно, и поэтому мне нужно найти правильные ограничения.Ограничения основаны на том факте, что я могу вращаться только с помощью фи и тета, как описано во введении к вопросу.Так как мне решить для Mnew?или, другими словами, phiNew и thetaNew.

Кстати, конечный «эффект», к которому я стремлюсь, заключается в том, что если пользователь щелкает где-то на сфере, а затем перетаскивает сферу, то точка, на которую щелкнул пользователь, остается подмышь при перетаскивании и сфера остается в вертикальном положении.

1 Ответ

0 голосов
/ 24 ноября 2010

Мне удалось решить это довольно легко после того, как я отправил вопрос, несмотря на то, что я потратил впустую целый день, стуча по голове вчера.

let psnew = inv (M) * inv (P) * pl

Т.е. psnew - это просто расположение точки plnew на сфере.

v = psnew-ps

so (theta, phi) = convertToPolarCoordinates (v)

, где преобразование является стандартным и может быть найдено в Википедии или где-либо еще

...