вторник, 9 июля 2013 г.

Адаптация Autocad Plant 3D: Скрипты Python. Задание матрицы трансформации (setTransformationMatrix)

На предыдущую статью получил вопрос от 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.

Комментариев нет:

Отправить комментарий