Матрицы преобразования ECS, DCS, UCS и т.д.

Автор Тема: Матрицы преобразования ECS, DCS, UCS и т.д.  (Прочитано 21525 раз)

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

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
А где-то есть более подробная подборка информации от Автодеска по:
1. по Ecs. как трансформировать, какие возможности есть. Как из общей матрицы выделять поворот, перенос. и т.д.
2. по системам координат UCS, OCS и т.д.

Пока встречал только отдельную информацию и как-то все разрознено, не полно.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А где-то есть более подробная подборка информации от Автодеска по:
В таком виде информации нет.
Как из общей матрицы выделять поворот, перенос. и т.д.
Вообще-то это не дело Autodesk разъяснять то, что следует знать из аналитической геометрии и матричного исчисления.
Несколько примеров есть:
http://adndevblog.typepad.com/autocad/2013/01/get-the-rotation-angle-and-axis-from-acgematrix3d.html
http://adndevblog.typepad.com/autocad/2014/08/decomposing-material-mapper-transform-matrix.html (функция DecomposeMatrix)
Всё это не универсально, т.к. матрица преобразования может быть композицией различных преобразований. Например, несколько поворотов относительно различных осей. И восстановить все единичные преобразования по результирующей матрице нельзя. Поэтому делаются некоторые допущения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Несколько примеров есть:

спасибо вторую статью по декомпозиции не нашел.

И восстановить все единичные преобразования по результирующей матрице нельзя.
это логично, на то она и результирующая.

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В других источника как-раз нашел, что матрица трансформации содержит информацию о сдвиге (тут могу напутать, это что-то из разряда трансформации ).
Сдвиг (скос) в теории может быть, но в AutoCAD такое преобразование не используется (т.е. ни ECS, ни DCS, ни UCS не могут содержать такую компоненту). Это преобразование меняет форму примитива. Имеет смысл только для твердых тел и поверхностей.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати, хоть ECS есть у любого примитива (наследника Entity), но у многих примитивов она единичная. Например, Line, Solid3d, Face. 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
но у многих примитивов она единичная. Например, Line, Solid3d, Face.
к сожалению это не так. Иначе бы и не интересовался.

Line
Ecs: ((0.652308286583294,0,0.757953757992377,0),(0.757953757992377,0,-0.652308286583294,0),(0,1,0,0),(0,0,0,1))
Normal: (0.757953757992377,-0.652308286583294,0)

предварительное предположение такое:
если применен перенос, то координаты Line пересчитываются и Ecs единичная
если применен поворот,  тогда получаем не единичную Ecs.

у многих примитивов она единичная.
Еще вопрос. есть ли стандартная проверка на единичную матрицу  типа  entity.Ecs.IsSingle
Или стандартное получение матрицы, типа Matrix3d.Single

не смог найти подобные методы. И создаю единичную матрицу через передачу массива, и потом сравниваю.

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Вообще-то это не дело Autodesk разъяснять то, что следует знать из аналитической геометрии и матричного исчисления.


Сдвиг (скос) в теории может быть, но в AutoCAD такое преобразование не используется (т.е. ни ECS, ни DCS, ни UCS не могут содержать такую компоненту). Это преобразование меняет форму примитива. Имеет смысл только для твердых тел и поверхностей.

Этот момент важен и поэтому и искал описание от автодеска, что может их матрица, а что нет, какими методами задается как считывать. И примеры кода с разъяснениями по матричным преобразованиям Api вроде как напрашивается, даже если освоил теорию.

Может про матрицы расписано в API к специализированным 3Д пакетам типа  Inventor, если кто видел напишите)


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Цитата: Александр Ривилис от 13-05-2016, 14:21:23

    но у многих примитивов она единичная. Например, Line, Solid3d, Face.

к сожалению это не так. Иначе бы и не интересовался.

Line
Ecs: ((0.652308286583294,0,0.757953757992377,0),(0.757953757992377,0,-0.652308286583294,0),(0,1,0,0),(0,0,0,1))
Normal: (0.757953757992377,-0.652308286583294,0)

предварительное предположение такое:
если применен перенос, то координаты Line пересчитываются и Ecs единичная
если применен поворот,  тогда получаем не единичную Ecs.
Приложи чертеж, в котором это так. Так быть не должно. Это какой-то глюк.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще вопрос. есть ли стандартная проверка на единичную матрицу  типа  entity.Ecs.IsSingle
Или стандартное получение матрицы, типа Matrix3d.Single

не смог найти подобные методы. И создаю единичную матрицу через передачу массива, и потом сравниваю.

Код - C# [Выбрать]
  1. Matrix3d mat; // дальше где-то получили её значение.
  2. if (mat.IsEqualTo(Matrix3d.Identity)) { // Сравнение со стандартной точностью
  3. // Матрица единичная
  4. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Этот момент важен и поэтому и искал описание от автодеска, что может их матрица, а что нет, какими методами задается как считывать. И примеры кода с разъяснениями по матричным преобразованиям Api вроде как напрашивается, даже если освоил теорию.
В документации ObjectARX есть какая-то информация по этому поводу. Например раздел: Autodesk ObjectARX for AutoCAD: Developer Guide > Basic Interaction with AutoCAD > Basic Interaction with AutoCAD > Selection Set, Entity, and Symbol Table Functions > Entity Name and Data Functions > Entity Name Functions > Entity Context and Coordinate Transform Data >
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Так быть не должно. Это какой-то глюк.
Я тоже не ожидал, пока не наткнулся. А потом понял, что все возможно)

Приложи чертеж, в котором это так.
https://yadi.sk/d/cI7pRNRIrgd9C

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я тоже не ожидал, пока не наткнулся.
Для отрезка это очень странно. И явно противоречит документации:
Цитировать
In AutoCAD, planar entities have an ECS; 3D entities do not. AutoCAD entities that can return a nonidentity matrix for their getEcs() function are:

Dimensions
Text
Circles
Arcs
2D polylines
Block inserts
Points
Traces
Solids
Shapes
Attribute definitions
Attributes

Сообщил об этом в ADN DevHelp.

Я помню, что когда-то в ObjectARX я использовал метод getEcs() для получения матрицы преобразования и для отрезка получалась единичная матрица. В какой-версии это изменилось - не знаю.
« Последнее редактирование: 13-05-2016, 19:45:43 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Получил такой ответ от ADN DevHelp (даже переводить не буду):
Цитировать
As AcDbLine is an object for which ECS is equivalent to WCS, getECS()
can return non identity matrix.
Долго перечитывал его и пришёл к выводу, что ответивший не силён в матричном исчислении.
Пришлось убедить его, что если ECS == WCS, то матрица всегда единичная.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
As AcDbLine is an object for which ECS is equivalent to WCS, getECS()
can return non identity matrix.

Если я правильно понял его, то он говорит, что Line ECS возвращает WCS. а WCS может не быть единичной матрицей.

Или WCS всегда единичная матрица? Тогда может он имел ввиду ECS=UCS - пользовательской системе координат.

Вобщем матричные исчисления хороши в теории но применительно к автокаду и API много нюансов, разобраться в которых не так просто.


мои выводы такие:
ECS может быть произвольной, для любого Entity. Это именно Entity CS, а не UCS, MCS и д.р.
entity.Ecs возвращает именно ECS примитива. И для каждого примитива в чертеже может быть задан свой ECS.


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если я правильно понял его, то он говорит, что Line ECS возвращает WCS. а WCS может не быть единичной матрицей.
Именно это он и говорит. Но это чушь!
Или WCS всегда единичная матрицf?
Конечно! ECS - это матрица преобразования из системы координат объекта в мировую систему координат (WCS). Если обе системы координат совпадают, то матрица преобразования единичная. Это азы матричного исчисления.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение