Глобальная координата вложенного блока при использовании NestedEntity

Автор Тема: Глобальная координата вложенного блока при использовании NestedEntity  (Прочитано 2215 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Всех приветствую. Кто-то решал проблему как можно глобальную координату вложенного блока при использовании NestedEntity?
Если блоки располагаются друг в друге не поворачиваясь, то задача простая. Но стоит один из родительски блоков повернуть, то координаты надо считать совсем иначе.
Прикладываю картинку - Есть блок с атрибутом А1 (Выделен красным). Пользователь щёлкает только по атрибуту. Этот блок вложен в другой блок, который вставляется в другой блок и, при этом, поворачивается. И нужно узнать хотя бы глобальные координаты синей точки. А в идеале глобальный поворот.


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Находишь всю цепочку вложений и используя метод BlockTransform получаешь матрицы преобразования.
Пример рекурсивного использования: https://adn-cis.org/forum/index.php?topic=2933.msg12071#msg12071
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Находишь всю цепочку вложений и используя метод BlockTransform получаешь матрицы преобразования.
Пример рекурсивного использования: https://adn-cis.org/forum/index.php?topic=2933.msg12071#msg12071
У меня почему-то через матрицы трансформаций не получается найти правильные координаты.
Ведь я правильно понимаю, что если у меня вложенные блоки, то я для всех блоков беру BlockTransform и переумножаю их?

https://help.autodesk.com/view/OARX/2022/ENU/?guid=GUID-4F71D4FB-FBF4-4EB3-B546-24B8858FBB94
Вот по этому способу я так же получил результат, что и простое умножение матриц.

Единственное решение, которое я нашёл это через Position получать координаты вставки блоков, отслеживать поворот блока и, если блок повернулся, то пересчитывать координаты вложенных блоков через полярные координаты.

Отмечено как Решение Lemieux 18-02-2024, 16:13:46

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 93
  • Карма: 11
Ну я в свое время не перемножал, когда вылезла рекурсия просто создал список трансформаций и при новом вложении просто добавлял инвертированную матрицу в список, а в конце просто трансформировал объект в цикле foreach матрицами из получившегося списка, ну тут думаю примерно тоже самое что и перемножение, но с матрицами я не особо знаком так что в такие дебри лезть не стал. Тут кстати важную роль играет в какой последовательность идут преобразования.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Тут кстати важную роль играет в какой последовательность идут преобразования.
Именно. И соответственно перемножение матриц должно быть в определенном порядке.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Lemieux,
А ты учел, что на самом нижнем уровне матрицу BlockTransform не нужно применять? Атрибут не подчиняется этому преобразованию.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Lemieux,
А ты учел, что на самом нижнем уровне матрицу BlockTransform не нужно применять? Атрибут не подчиняется этому преобразованию.
Да, это я учёл, но забыл свойства матриц. Всем спасибо! Всё работает. Осталось решить вопрос с определением поворота. Но тут я думаю просто буду склыдвать у всех блоков Rotation, а потом поворачивать то, что надо.

PS Так, я тут поэкспериментировал. А я правильно понимаю, что с помощью CoordinateSystem3D можно узнать поворот и "направление" куда смотрит блок?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Но тут я думаю просто буду склыдвать у всех блоков Rotation, а потом поворачивать то, что надо.
Матрица BlockTransform учитывает поворот и масштабирование блока. Только для самого атрибута следует учитывать поворот.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Угол поворота я вычислил просто. Получил Xaxis у обоих CoordinateSystem3D (локальная и глобальная) и через GetAngleTo вычислил угол.