На предыдущую статью получил вопрос от Max Grigorenko:
Доброго времени суток! Хорошая статья хоть и кратенькая. но вот вопрос у меня к Вам: знаете ли вы как работает функция "Задать матрицу трансформации (obj.setTransformationMatrix)"? Если Вас не затруднит, пример с пояснениями.
Что такое матрица трансформации
Матрица трансформации - это объект, содержащий информацию о вращении и переносе, примененных к ней.
Матрица трансформации создается с помощью функции mTransform(), и далее с ней можно работать как с обычным элементом геометрии, применяя функции вращения и переноса.
Для чего это нужно?
Представим ситуацию. Мы хотим создать Цилиндр и Конус, повернуть их относительно оси Y на 90 градусов и перенести вдоль X на 300 единиц, а вдоль Y на 200.
Оба элемента создаются в одной точке, а потому их можно перетаскивать одновременно. Я вижу здесь 3 способа, как выполнить эту задачу.
1. Создаем цилиндр и конус и каждый из них отдельно переносим и вращаем
сn = CONE(s, 20, 0, 200, 0).rotateY(90).translate((300, 200, 0))
cl = CYLINDER(s, 50, 10,0).rotateY(90).translate((300, 200, 0))
2. Используем матрицу трансформации для переноса и вращения
t=mTransform().rotateY(90).translate((300, 200, 0))
сn = CONE(s, 20, 0, 200, 0).setTransformationMatrix(t)
cl = CYLINDER(s, 50, 10,0).setTransformationMatrix(t)
С точки зрения программиста, этот способ лучше, так как легче для понимания и обслуживания кода. Изменения, при необходимости, нужно будет вносить только в одном месте.
3. Сначала объединяем, потом переносим
сn = CONE(s, 20, 0, 200, 0)
cl = CYLINDER(s, 50, 10,0)
cn.uniteWith(cl)
cl.erase()
cn.rotateY(90).translate((300, 200, 0))
Этот вариант применим к нашей задаче, но могут возникнуть случаи, когда второй вариант окажется предпочтительнее.
Выводы
Матрицу трансформации удобно использовать в однотипных операциях переноса и вращения. Этот инструмент делает код более удобным для чтения и поддержки, но в простых скриптах можно обойтись и без неё. Какой инструмент использовать для достижения цели - ваш выбор.
P.S.
При использовании .NET API все операции по переносу или вращению приходится выполнять с помощью класса Matrix3d. Для более полного понимания, что же такое матрица трансформации рекомендую обратиться к описаниям этого класса или AcGeMatrix3d в ARX.