У меня есть единичная сфера, которая центрирована в начале координат, а моя камера также центрирована в начале координат.Камера обращена к 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.
Кстати, конечный «эффект», к которому я стремлюсь, заключается в том, что если пользователь щелкает где-то на сфере, а затем перетаскивает сферу, то точка, на которую щелкнул пользователь, остается подмышь при перетаскивании и сфера остается в вертикальном положении.