Представьте, что в центре окна находится 3d-сфера (не эллипс), которая касается краев окна.Он расположен в пространстве экрана, а не в мировом пространстве.«Пространство экрана» означает, что если ваше окно имеет размер 640x480, то сфера находится в x = 320, y = 240 и имеет радиус 240 (min(width,height)/2
), независимо от вашей модели просмотра / матрицы проекции.
Когдапользователь нажимает кнопку мыши, выбирает точку на сфере.Если щелчок находится за пределами этой сферы, начальная точка перемещается в границу сферы.Давайте назовем эту точку pointA
.Когда пользователь перетаскивает мышь, положение мыши указывает, где пользователь хочет, чтобы эта начальная точка была.Давайте назовем это pointB
.
Теперь для сферы довольно легко вычислить 3-ю координату с учетом первых 2, так как 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 и изучить любой пример, который позволяет вращать объект с помощью мыши.