- •4. Преобразование координат
- •4.1. Представление вектора в однородной форме
- •4.2. Преобразования координат в 2d, координатный фрейм
- •4.3. Цепочки преобразований координат
- •4.4. Элементарные матрицы преобразования координат в 2d
- •4.5. Преобразование координат и координатный фрейм в 3d
- •4.6. Элементарные матрицы преобразования координат в 3d
- •4.7. Общность задач преобразования модели и преобразования координат
- •4.7.1. Локальные системы координат
- •4.7.2. Функции OpenGl для работы со стеком
- •4.7.3. Примеры программ с использованием понятия «локальная система координат»
- •4.8. Несколько задач преобразования ск
4.3. Цепочки преобразований координат
Представим себе цепочку вложенных систем координат (рис. 4.8).
Система координат СК0 привязана к СК1, следовательно, должен быть известен координатный фрейм F01, система координат СК1, в свою очередь, привязана к СК2 и должен быть известен координатный фрейм F12 и т.д.
Эту же цепочку вложений СК будем изображать так:
Пусть в СК0 задана точка A0. Найти матрицу преобразования F03 и представление этой же точки в СК3.
– точка A в СК1;
– точка A в СК2;
–точка A в СК3;
F03 = F23F12F01 – матрица преобразования из СК0 в СК3.
В общем случае матрица преобразования из СК0 в СКN:
F0N = F(N–1)N F23F12F01. (4.1)
Обратная задача. Пусть в СК3 задана точка A3. Найти матрицу преобразования F30 и представление этой же точки в СК0.
Если известны F01, F12, F23, то легко находятся матрицы , и как обратные известным, тогда:
;
;
( – матрица преобразования из СК3 в СК0).
В общем случае:
FN0 = F10F21F32 FN((N-1). (4.2)
Как видим, все формулы преобразования координат не отличаются от формул преобразования модели. Подробнее рассмотрим этот вопрос позже.
4.4. Элементарные матрицы преобразования координат в 2d
Рис. 4.9. Элементарные матрицы преобразования координат в 2D
4.5. Преобразование координат и координатный фрейм в 3d
В 3D матрица F10 преобразования координат из СК1 в СК0 или, что то же, координатный фрейм, задающий привязку СК1 относительно СК0, имеет вид:
.
Как и в 2D, здесь
– точка положения системы координат СК1 относительно СК0:
– единичный вектор оси X1 СК1 относительно СК0;
– единичный вектор оси Y1 СК1 относительно СК0.
– единичный вектор оси Z1 СК1 относительно СК0.
Все ранее полученные соотношения для 2D справедливы и для 3D.
4.6. Элементарные матрицы преобразования координат в 3d
Как известно, все элементарные матрицы преобразования координат и координатные фреймы в 2D и 3D совпадают с определенными ранее типовыми элементарными матрицами T(); R(); S().
В преобразовании S(sx, sy, sz) имеется важный частный случай. Пусть , при этом, .
Это случай, когда в СК1 оси X1 и Y1 совпадают с X0 и Y0, а координата Z1 всегда равна нулю. Но по существу это преобразование из 3D в 2D, т.е. получение проекций 3D объекта на плоскость X1Y1, совпадающую с плоскостью X0Y0. Поэтому о таком преобразовании можно говорить, как о преобразовании проецирования на плоскость X0Y0.
При этом не существует, поскольку . Это естественно, поскольку после операции проецирования невозможно однозначно восстановить Z-ю координату исходной точки.
4.7. Общность задач преобразования модели и преобразования координат
4.7.1. Локальные системы координат
Рассмотрим несколько примеров.
П ример 1.
glTranslatef(a, b, 0); // VM = T(a,b)
glBegin(GL_POINTS);
glVertex2f(c, d);
glEnd();
Можно провести два равноценных толкования этого фрагмента программы.
1) Точка между операторными скобками A0 задана в МСК. Матрица VМ здесь принимает значение VM=T(a, b). Первая операция обработки точки в конвейере A1=VM∙A0=T(a, b) ∙A0 переводит точку A из положения A0 в положение A1. Следовательно, матрицу VM следует понимать как матрицу преобразования модели, т.е. VM=T(a, b)=M01 (рис. 4.12).
2 ) Та же точка считается заданной в системе координат пользователя, будем такую СК называть локальной (ЛСК). ЛСК свободна, она не привязана ни к какой СК, нигде не прописана в программе (возможно только в комментариях) и существует только в представлении программиста. На рис. 4.13 показано, как та же точка из рассматриваемого примера задана в ЛСК.
AL – это та же точка, заданная между операторными скобками в примере 1, но, чтобы подчеркнуть то обстоятельство, что она задана в ЛСК, помечаем ее индексом L.
Матрица VM опять принимает значение VM=T(a,b), но понимать ее будем как координатный фрейм, задающий привязку ЛСК к МСК, т.е. VM=T(a,b)=FLM.
3) Вспомним, что координатный фрейм FLM одновременно является матрицей преобразования координат из ЛСК в МСК, поэтому операцию
AM = VM∙AL=T(a,b)∙Al=FLM∙AL
б удем понимать как преобразование точки AL из ЛСК в точку AM в МСК. Где при этом в МСК будет точка AM при таком толковании рассматриваемого примера? Ответ на этот вопрос дает рис. 4.14. Результат тот же, как и при первом толковании программы из примера 1.
Пример 2.
glRotatef(φ,0,0,1); // VM = R(φ)
glBegin(GL_POINTS);
glVertex2f(c,0);
glEnd();
О пять два толкования этого текста.
1) A0 – начальное положение точки в МСК. VM=R(φ). Первая операция в конвейере обработки переводит точку из положения A0 в положение A1:
A1=VM∙A0= R(φ)∙A0=M01∙A0.
На рис. 4.15 показано положение точки A0 и A1.
2) Точка в приведенном Примере 2 задана в ЛСК, обозначим ее AL. VM=R(φ)=FLM – координатный фрейм, задающий привязку ЛСК к МСК, одновременно это матрица преобразования координат точки AL из ЛСК в координаты точки AM МСК.
Результат первой операции в конвейере обработки:
AM = VM∙AL=R(φ)∙AL=FLM∙AL.
П оложение точки AM в МСК в результате таких преобразований приведено на рис. 4.16. Как видим результат тот же, что и в примере 2, п.1.
Пример 3.
glScalef(2, 2, 1); // VM = S(2,2)
glBegin(GL_POINTS);
glVertex2f(3, 2);
glEnd();
1) Точка задана в МСК. VM осуществляет масштабирование и переводит точку из положения A0 в положение A1 в МСК. Результат выполнения операции
; .
2) Точка задана в ЛСК. VM – координатный фрейм, который понимаем как матрицу преобразования из ЛСК в МСК. Легко убедиться, что положение точки в МСК будет то же, что и в предыдущем случае.
Пример 4.
void fig( ){ }
void display( )
{
glTranslatef(a, b, 0); // VM = T(a,b)
glRotatef(φ, 0, 0, 1); // VM = T(a,b)R(φ)
glScalef(1, -1, 1); // VM = T(a,b)R(φ)S(1,–1)
fig( );
}
1) Фигура fig построена в МСК; VM – матрица преобразования модели над каждой точкой фигуры fig. В данном случае над каждой точкой fig осуществляется масштабирование S, вращение R и перемещение T.
Положение каждой точки fig в МСК
.
2 ) Фигура fig построена в ЛСК. Матрица VM понимается как координатный фрейм FLM, описывающий привязку ЛСК относительно МСК.
Операция над каждой точкой fig
есть преобразование точек из ЛСК в ту же точку в МСК.
,
где – положение каждой точки fig в МСК.