Manifold Geometry // Многообразная Геометрия

Архивы

Совмещение координатных осей (реперов)

Сегодня решаем простую задачу. Даны два координатных репера (reference frames), произвольным образом расположенные в пространстве моделирования. Требуется их совместить, например, повернуть и сдвинуть фрейм B так, чтобы он совпал с фреймом A:

Часто с координатными реперами ассоциированы некоторые геометрические объекты, например, CAD-модели, сетки, облака точек и проч. Таким образом, совмещая координатные реперы мы, тем самым, совмещаем ассоциированные с ними объекты, то есть решаем задачу регистрации. Точное совмещение объектов (например, облака точек и CAD-модели) обычно требует выполнения некоторого алгоритма, нередко с привлечением методов оптимизации. Совмещение же фреймов является линейным оператором и достигается умножением на матрицу перехода (понятно, что точность совмещения в этом случае зависит от того, насколько соответствуют друг другу используемые фреймы).

Чтобы совместить координатный репер B с репером A достаточно выполнить следующие простые действия:

  1. Подсчитать трансформацию TB для совмещения B с глобальной системой координат.
  2. Подсчитать трансформацию TA для совмещения A с глобальной системой координат.
  3. Подсчитать обратную трансформацию [TA]-1.
  4. Применить к реперу B цепочку трансформаций T = [TA]-1 TB.

Для выполнения этой операции средствами OpenCascade можно использовать следующий код (команда test-transform-axes в Analysis Situs):

// First frame.
gp_Ax3 A( gp_Pnt(-1., -2., -3.), gp_Dir(1., 1., 1.), gp_Dir(1., -1., -1.) );
  
// Second frame.
gp_Ax3 B( gp_Pnt(4., 2., 3.), gp_Dir(1., -1., 0.25), gp_Dir(-1., 1., 0.5) );
  
// B goes to global origin.
gp_Trsf T_B;
T_B.SetTransformation(B);
  
// Global origin goes to A.
gp_Trsf T_A;
T_A.SetTransformation(A);
T_A.Invert();
  
// Final transformation from B to A.
gp_Trsf T = T_A*T_B;
  
// Transformed B.
gp_Ax3 TB = B.Transformed(T);