3D Picture

Обсуждение вопросов, связанных с обработкой аудио и видео информации

Re: 3D Picture

Postby Sevas on 20 Jul 2016, 18:38

Коллеги, обращаюсь за тех помощью.
Столкнулся с вышеописанными нестыковками в терминологии по инструментам вращения и перемещения объекта.
В итоге не могу решить свою задачу.
Делаю некоторое подобие ависимулятора, сделал пока для теста интеграторы вращения по крену и тангажу, но не могу понять как корректно все это заставить рисоваться в 3D Picture.

Есть неподвижная в пространстве модель подложки-земли.
Есть модель самолетика, которая должна вращаться по крену и по тангажу.
Я привязал управление вращением к клавиатуре - стрелки.

Физика считает углы крена Roll и тангажа Pitch относительно неподвижной земли.
Собственно не могу который день заставить правильно отрабатывать эти углы.

Покрутите модель, поймете в чем беда. Сложновато все будет тут описать. Суть в том что сейчас повороты происходят в системе координат, относительно земли, я пытаюсь крутить в связанной с самолетом СК. В модели получается что если сделать крен 90гр, и начать вращение по тангажу (нос вверх-вниз) происходит полный бардак.

Буду благодарен любому совету и правке кода.
Творение в будущем выложу на обозрение в качестве пособия-демонстратора отработки систем управления на примере летающих объектов.

Проект в LV 2013й версии.
Attachments
LV2013 3d plane.rar
(1.29 MiB) Downloaded 100 times
Sevas
user
user
 
Posts: 89
Joined: 23 Feb 2011, 19:32
Location: Sevastopol
LabVIEW Version: 13
Karma: 30

Re: 3D Picture

Postby dadreamer on 20 Jul 2016, 22:11

Artem.spb
Здесь надо сказать пару слов о такой штуке как наследственность. Основной "родитель" (parent) всех объектов - это сцена. В моём примере она создаётся через тройку осей X,Y,Z (голубого цвета). Когда мы добавляем очередной объект к сцене, то он становится "потомком" (child) сцены. Между родителем и потомком устанавливается однозначная связь, которая выражается в жёсткой привязке их СК. Если мы добавим один объект к другому, то установится связь "объект 1" -> "объект 2", и так же будут связаны их СК. Если эту связку теперь добавить на сцену, то установится связь "сцена" (родитель) -> "объект 1" (старший потомок) -> "объект 2" (младший). В моём примере по сути три объекта: сцена (голубые оси) -> объект 1 (розовые оси) -> объект 2 (кубик). Всё это время мы управляли объектом 1 (розовые оси), который жёстко связан со сценой. То есть, все относительные транформации осуществлялись согласно этой связке.

Теперь сделаем следующее. Как обычно, сдвинем розовую СК в точку (1,1,1) и повернём, например, на 35 градусов по Y. Переключаемся на объект 2 "кубик" и транслируем его ещё на (1,1,1) (относительное смещение).
2016-07-20_23-39-12.jpg
Ну что, похоже на то, что требовалось получить? :wink:
Как видим, важен порядок добавления объектов друг к другу и на сцену. На иконке :vi: Add Object не зря нарисовано дерево:
2016-07-20_23-42-42.jpg
2016-07-20_23-42-42.jpg (52.76 KiB) Viewed 8583 times

Для сравнения: создание объектов в старом примере и в новом (см. ниже).
Старый:
old_ex.jpg
Новый:
new_ex.jpg
Сам пример:
Axis Rotation Test 2 w Axis Parent.vi
lv2011
(28.24 KiB) Downloaded 102 times
А также очень хороший пример для понимания наследственности: C:\Program Files (x86)\National Instruments\LabVIEW 2015\examples\Graphics and Sound\3D Picture Control\Order of Transformations.vi

К слову говоря, можно "забить" на наследственность и преобразовывать СК родительских объектов. Правда, это не совсем тривиально, хотя разобраться можно. Есть два пути: рассчитывать конечные координаты СК объекта и записывать их в матрицу преобразований, либо использовать Rotate Y-axis (относительный поворот) + Translate Object (относительное смещение).
По первому методу суть сводится к использованию уже упомянутых в теме формул:
X' = X*cos (a) + Z*sin (a)
Y' = Y
Z' = Z*cos (a) - X*sin (a)

Здесь
a - угол, на который повёрнута СК объекта относительно СК сцены, рад.;
X, Y, Z - координаты в СК объекта, которые должен занять центр СК (т.е., центр объекта);
X', Y', Z' - конечные координаты в СК сцены, которые нужно будет записать в матрицу преобразований.
Стоит обратить внимание, что если объект уже смещён на какие-то расстояния от СК сцены, то нужно добавить эти смещения к получившимся координатам X', Y' и Z' перед записью в матрицу.
По второму методу суть такова: смещаем объект, куда нам нужно, поворачиваем (относительный поворот) на заданный угол, транслируем (относительное смещение) по тому вектору, что должен быть в СК объекта (например, нужно, чтобы объект занял точку (1,1,1) в локальной системе координат, значит, делаем Translate Object с кластером (1,1,1)). Результат - объект займет ту точку, которая нам нужна. Это проверил: матрица преобразований в обоих случаях одинаковая.
User avatar
dadreamer
professor
professor
 
Posts: 3338
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 845
I/O VIP vision internet

Re: 3D Picture

Postby Artem.spb on 22 Jul 2016, 09:31

dadreamer wrote:Ну что, похоже на то, что требовалось получить? :wink:

не похоже :)
если я правильно понимаю предлагаемую логику, то
повернуть куб на N, повернуть ось на N, то
abs смещение (пусть по X) должно сместить кубик ниже розовой оси Х, так что радиус-вектор равен смещению, а угол между осью и R - как раз N
rel смещение (пусть по X) должно сместить кубик по оси Х (розовой) на заданное смещение из текущей точки.

Вторая функция работает как описано, а вот первая всё равно смещает вдоль оси Х.
Artem.spb
expert
expert
 
Posts: 1677
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 266
CLD hardware I/O VIP freelance

Re: 3D Picture

Postby Artem.spb on 22 Jul 2016, 09:57

Sevas
главный совет: забыть про функции rot x/y :)
В идеале надо рассчитать текущее направление радиус-вектора самолёта и задать его одной функцией.
Как возможный вариант (нет времени проверить), хранить старые значения углов поворота и, получив новые углы, вычислить необходимый доворот (именно это и происходит при вызове функций rel).
Artem.spb
expert
expert
 
Posts: 1677
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 266
CLD hardware I/O VIP freelance

Re: 3D Picture

Postby dadreamer on 23 Jul 2016, 13:52

Artem.spb wrote:abs смещение (пусть по X) должно сместить кубик ниже розовой оси Х, так что радиус-вектор равен смещению, а угол между осью и R - как раз N

А почему ниже-то? Абсолютное смещение смещает объект-потомок от своего родителя на заданные смещения X,Y,Z. И действует один раз, поскольку берётся нулевой столбец исходных координат. То есть, сказали на 1 сместить по X, так на 1 и сместится от (0,0,0) родительской СК. Относительное смещение учитывает предыдущие смещения, добавляя к ним текущие. Всё довольно просто получается.
И вот это ваше пожелание тоже выполняется:
Artem.spb wrote:Центр остался там же, да. Но оси теперь направлены иначе. Так что если бы одна из функций смещала ЦК объекта в СК самого объекта, то кубик должен уезжать не по вектору 1-1-1 в СК сцены.
capture-1.rar
видео
(1.77 MiB) Downloaded 87 times

Думаю, на этом этапе, когда мы более-менее разобрались с инструментами поворота-смещения, можно "забить" на эти несоответствия (мнимые или реальные, чем бы они ни были). Можно ещё раз описать их основное поведение, выделить красным, (распечатать, вырезать, поставить в рамочку) и запомнить. А можно и не делать, если написанного здесь достаточно. :dntknw:
User avatar
dadreamer
professor
professor
 
Posts: 3338
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 845
I/O VIP vision internet

Re: 3D Picture

Postby dadreamer on 23 Jul 2016, 14:56

Sevas wrote:Суть в том что сейчас повороты происходят в системе координат, относительно земли, я пытаюсь крутить в связанной с самолетом СК

У вас сцена (родительский объект) - это "земля". "Самолёт" - это объект-потомок. Существует связь "земля" -> "самолёт", и согласно ей вы крутите "самолёт" относительно "земли", т.е. СК "самолёта" относительно СК "земли", никак иначе.

Далее, исходя из того, что "самолёт" вращается по Y, затем по X (относительный поворот), меняются его координаты: сперва X и Z, затем Y и Z (по тем формулам, что я выше приводил). Чтоб этого избежать, вы принудительно задаёте другие смещения, предварительно рассчитанные в FN. Всё это лишние действия, которые не очень оправданы. Как сказал уже Artem.spb, проще отказаться от функций относительного поворота. Работа с матрицей преобразований намного прозрачнее, так как видно, какие элементы за что отвечают и как они меняются со временем. Тем более, что Roll, Pitch, Yaw довольно просто задаётся: http://www.songho.ca/opengl/gl_anglestoaxes.html
Я понимаю, что можно было бы поизвращаться и приспособить текущие :vi: для поворота... Однако, нужно, чтобы объект "самолёт" всегда был в центре СК сцены, что не получится сделать ("самолёт" однозначно должен смещаться от центра СК сцены, улетать, короче, при малейших изменениях Roll, Pitch, Yaw). А если очищать всё время матрицу преобразований, то будем видеть неприятные графические глюки. В общем, заменяйте все эти :vi: на работу с матрицей.

Кроме того, я бы переделал работу с кнопками на Event Structure, чтобы лишний раз не опрашивать драйвер клавы, когда это не требуется. Также не помешала бы нормальная кнопка Стоп, чтоб на Abort не жать.

Ещё у меня такой вопросик. Зачем так далеко от центра СК сцены смещать СК объекта (500 по X, 500 по Y)? Я хотел оси нарисовать у сцены, но из-за таких гигантских расстояний не удаётся разглядеть всю картинку. Почему бы не запускать самолёт из (0,0,0) СК сцены, а дальше пусть летит, куда юзер захочет.

Кстати, вот какие :vi: ещё нашёл:
Roll Pitch Yaw to Rotation Matrix VI
Rotation Matrix to Roll Pitch Yaw VI
Это как альтернатива вашим текущим вычислениям. Требуется Robotics Module, но можно выдрать логику оттуда и встроить в свою программу. Если понадобится, могу поставить модуль и посмотреть.

А этот пример - то, о чём я выше написал: https://decibel.ni.com/content/docs/DOC-21690 На каждой итерации очищаем матрицу преобразований, и тогда относительные повороты не модифицируют X,Y,Z. Но всё портят графические глюки на контроле.
User avatar
dadreamer
professor
professor
 
Posts: 3338
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 845
I/O VIP vision internet

Re: 3D Picture

Postby Sevas on 28 Jul 2016, 20:58

dadreamer, спасибо за комментарии и помощь.
Увы, я пока ничерта не могу понять в этих матрицах. Раньше я спокойно игрался в готовом симуляторе, где все эти вращения сделаны его разработчиками, я занимался только самолетом и его аэродинамикой.



Но сейчас симулятор сильно "вырос" по требованиям к железу, не везде его можно запустить. Вот и влез в изобретение велосипеда... Сейчас с авиагоризонтом мучаюсь, там тоде свои грабли. Уже жалею что начал вообще все это делать.:think:


500х500 это мои тесты, я с 0 0 0 начинал, но уже не помню почему сдвинул.
Sevas
user
user
 
Posts: 89
Joined: 23 Feb 2011, 19:32
Location: Sevastopol
LabVIEW Version: 13
Karma: 30

Re: 3D Picture

Postby Sevas on 12 Nov 2016, 17:49

После пары месяцев наконец-то разобрался как правильно вращать объект.
Инструменты вращения LV используют в качестве входных параметров один угол и 3 оси.
Оси и угол надо рассчитывать с помощью кватернионов. Итоговые формулы не сильно сложные, но чтобы с ними разобраться и как их применить для вращения надо нехило поломать голову.
В общем Гамильтон рулит. :thank:
Теперь свой LV-шный симулятор самолета наконец-то смогу доделать.
Кому интересно прикладываю проект. wx,wy,wz задают угловые скорости вращения объекта.

Настоятельно приму рекомендации по оптимизации проекта, т.к. на нетбуке проект все же подтормаживает. 2д анимация грузит. Если кто сможет упростить буду премного благодарен.
Может как-то можно не процедурно рисовать прибор, а текстуру подгрузить?
Attachments
img-2016-11-12-12-58-29.png
LV2013_Quaternion_rotation.rar
(371.92 KiB) Downloaded 93 times
Sevas
user
user
 
Posts: 89
Joined: 23 Feb 2011, 19:32
Location: Sevastopol
LabVIEW Version: 13
Karma: 30

Re: 3D Picture

Postby alerm on 13 Nov 2016, 02:15

Уважаемые знатоки! Вопрос задает человек, которому явно нечего делать в два часа ночи, внимание на экран:
сравнение памяти.jpg

LV2013_Quaternion_rotation_1.rar
(386.64 KiB) Downloaded 82 times
User avatar
alerm
leader
leader
 
Posts: 580
Joined: 02 May 2012, 21:28
Medals: 1
Activity (1)
LabVIEW Version: 13
Karma: 156
VIP teachers freelance

Re: 3D Picture

Postby Sevas on 13 Nov 2016, 12:34

Получается, что с формулой, что с граф.компонентами по производительности почти никаких изменений?
Sevas
user
user
 
Posts: 89
Joined: 23 Feb 2011, 19:32
Location: Sevastopol
LabVIEW Version: 13
Karma: 30

Re: 3D Picture

Postby dadreamer on 13 Nov 2016, 12:36

Sevas wrote:Получается, что с формулой, что с граф.компонентами по производительности почти никаких изменений?

Именно так. Но так не должно быть. Текстовый парсер в Formula Node по определению должен быть медленнее Inline операций LV. И это всегда подтверждалось ранее. Тем более, что для FN никаких оптимизаций не выполняется, т.к. код не проходит через DFIR. Что здесь происходит, я сказать затрудняюсь. Время выполнения кода в FN менее 1 миллисекунды (!). Попытался найти инфу о детальном устройстве FN, но не смог найти.

ЗЫ: порядочно уже накопилось таких вот "странностей" LV, которые очень сложно объяснить. Начинает возникать ощущение, что программист толком не управляет своей же программой. Вот цена за те удобства, которыми нас щедро обеспечил NI в этом продукте.
User avatar
dadreamer
professor
professor
 
Posts: 3338
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 845
I/O VIP vision internet

Re: 3D Picture

Postby Sevas on 13 Nov 2016, 20:22

Странно.
Я, если честно, думал грабли где-то в области 2д анимации. У меня без неё на нетбуке работает плавнее. Многовато там процедурных линий и украшательств.
Sevas
user
user
 
Posts: 89
Joined: 23 Feb 2011, 19:32
Location: Sevastopol
LabVIEW Version: 13
Karma: 30

Re: 3D Picture

Postby alerm on 14 Nov 2016, 03:49

Sevas,
1) у меня в программе есть косяк:

косяк.png
раньше два раза рисовало шкалу выше нуля, теперь всё правильно

2) проблема в отрисовке шкалы, я бы посоветовал один раз отрисовать всю картинку со шкалой и выводить только необходимую часть на 2D Picture (см. Get Image Subset.vi). У Вас всё равно меняется положение "крыла", а не отклоняется шкала при изменении по оси Х.
User avatar
alerm
leader
leader
 
Posts: 580
Joined: 02 May 2012, 21:28
Medals: 1
Activity (1)
LabVIEW Version: 13
Karma: 156
VIP teachers freelance

Re: 3D Picture

Postby Sevas on 14 Nov 2016, 21:26

alerm, спасибо за наводку!

Еще вопрос непосредственно по 3д в :labview:

В целом я прекрасно понимаю что LV не для игрушек. Этот проект больше в академических целях планирую использовать.
Насколько от 3д сцены можно ожидать более менее внятной картинки. Можно ли будет сделать какое-то подобие скайбокса, облаков, ландшафта. Какой фпс при этом в итоге будет? В сферическом черном вакууме летать будет неинтересно.
Может кто находил какие нибудь зрелищные 3д проекты в LV. Покидайте ссылок. Я особо не находил.

В целом стоит ли игра свеч в плане возни с украшательствами по картинке в 3д?
Sevas
user
user
 
Posts: 89
Joined: 23 Feb 2011, 19:32
Location: Sevastopol
LabVIEW Version: 13
Karma: 30

Re: 3D Picture

Postby Artem.spb on 15 Nov 2016, 00:39

Ожидать можно, но ожидания обернутся разочарованием.
3d модели реальных и не очень сложных объектов, отрисованные в 3dMax и экспортированные в LV безбожно тормозили (2-10 кадров/сек).
Положение улучшается сильным уменьшением и упрощением моделек. Фон при этом был монотонный, никаких облаков и прочего.
Плюс большие элементы начинают безбожно глючить
Собственно именно так выглядит модель в сборе. И уже это сильно тормозит.
После уменьшения стало сильно легче. Но не летает.
Artem.spb
expert
expert
 
Posts: 1677
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 266
CLD hardware I/O VIP freelance

PreviousNext

Return to Работа с графикой и звуком

Who is online

Users browsing this forum: No registered users and 1 guest

cron