Представьте, что в центре окна находится трехмерная сфера (не эллипс), которая касается краев окна. Он находится в пространстве экрана, а не в мировом пространстве. «Пространство экрана» означает, что если ваше окно имеет размер 640x480, то сфера расположена по координатам x=320,y=240 и имеет радиус 240 (min(width,height)/2
), независимо от вашей матрицы представления модели/проекции.
Когда пользователь нажимает на кнопку мыши, он выбирает точку на сфере. Если щелчок находится за пределами этой сферы, начальная точка перемещается в границу сферы. Назовем эту точку pointA
. Когда пользователь перетаскивает мышь, положение мыши отмечает, где пользователь хочет, чтобы эта начальная точка была. Назовем его pointB
.
Теперь для сферы довольно легко вычислить 3-ю координату по первым двум, поскольку R^2 = X^2+y^2+z^2
Таким образом, вы можете вычислить 3-ю координату для начальной точки (pointA
) и 3-ю координату для текущей точки (pointB
). Теперь, используя две точки, вы можете вычислить два вектора из центра сферы (O
) в точку (vectorOA = pointA - O; vectorOB = pointB - O
). Теперь, когда у вас есть два вектора, вы можете использовать их для вычисления оси вращения (используя векторное произведение = rotationAxis = normalize(vecOA x vecOB);
) и угол поворота (используя acos для скалярного произведения нормализованных векторов = acos(dot(normalize(vecOA), normalize(vecOB))
). Используя ось и угол, вы можете построить матрицу вращения в пространстве экрана, которую затем можно преобразовать в нужное пространство и применить к объекту.
Этот метод обычно называют «трекбол». Он использовался в некоторых примерах в Microsoft DirectX SDK, и вы сможете найти его где-нибудь в NVidia OpenGL SDK. Поэтому, если вы не понимаете объяснения, я предлагаю взять любой SDK и изучить любой пример, который позволяет вам вращать объект с помощью мыши.
person
SigTerm
schedule
01.03.2012