Повоpот в 3d

From
Victor A. Pavlov (2:5025/81)
To
Oleg Sysoev
Date
2002-07-31T09:58:22Z
Area
RU.ALGORITHMS
Доброго здоровья, Oleg!

 Как то раз (Чет Июл 25 2002 20:42) Oleg Sysoev написал письмо All:

 OS>  Но это в 2d. А как быть, если точка pасположена в 3d?
 OS>  Большая пpосьба поделиться со мной соответствyющей литеpатypой/линком,
 OS>  либо готовым алгоpитмом. Очень хотелось бы полyчить фyнкцию со входными
 OS>  паpаметpами, как glRotatef в opengl.

  Во-первых, если тебе посоветуют умножать на матрицы 4х4 - не пытайся. Метод, конечно, классический, но крайне медленный, особенно, если нужно делать поворот не только вокруг координатных осей, а вообще вокруг произвольлной прямой.
  Имеется более быстрый (и более простой) метод поворота точки на произвольный угол вокруг произвольной прямой в постранстве.

Начальные данные:                _
  Точка задается радиус-вектором p=(px,py,pz).
  Угол задается числом phi (в радианах).                                  _
  Прямая (ось) задается, двумя векторами: радиус-вектором точки на прямой s =
                                  _              _ (sx,sy,sz) и вектором направления n=(nx,ny,nz), |n|=1.
     _    _ _  _  _ _
  1. s := s+s*(s&(p-s));                      _ _
операция & - скалярное произведение векторов: a&b=ax*bx+ay*by+az*bz
     ___    _ _
  2. tmp := p-s;
     _     ___           ___ _           _
  3. p' := tmp*cos(phi)+(tmp^s)*sin(phi)+s;   _ _
операция ^ - векторное произведение векторов: a^b=(ay*bz-az*by,az*bx-ax*bz, ax*by-ay*bx)
        _
  Точка p' - и есть результуриющая точка.

  Геометрический смысл данных преобразований также довольно прост.

Всего хорошего - Victor

--- GoldED/W32 3.0.1
 * Origin: Red Station, Voronezh, Russia (2:5025/81)