Идея состоит в том, чтобы использовать стандартную матрицу вращения. В 2D это:
-- -- -- -- -- --
| x_new | | cos(a) -sin(a) | | x_old |
| | = | | | |
| y_new | | sin(a) cos(a) | | y_old |
--- -- -- -- -- --
Где a
- угол, на который вы вращаетесь.
Идея состоит в том, что вы переводите каждую точку в новую точку, используя это преобразование. Чтобы получить более полное представление об этом, рассмотрим единичный круг (который я не знаю, как рисовать с помощью ASCII-рисунка), и спросите себя, как вы можете переместить точку (0,1) в (sqrt(2)/2,sqrt(2)/2)
(поворот на 45 градусов) ).
x_new = x_old * cos(45) - y_old * sin(45) = 1 * sqrt(2)/2 - 0 * sqrt(2)/2 = sqrt(2)/2
y_new = x_old * sin(45) + y_old * cos(45) = 1 * sqrt(2)/2 + 0 * sqrt(2)/2 = sqrt(2)/2
Теперь переведите это на (1,0)
, еще один поворот на 45 градусов:
x_new = x_old * cos(45) - y_old * sin(45) = sqrt(2)/2 * sqrt(2)/2 - sqrt(2)/2 * sqrt(2)/2 = 0
y_new = x_old * sin(45) + y_old * cos(45) = sqrt(2)/2 * sqrt(2)/2 + sqrt(2)/2 * sqrt(2)/2 = 1
Распространение этого на 3D довольно просто, все, что вам нужно сделать, - это использовать другое умножение для вращения вдоль плоскости XZ.