3D Picture

Обсуждение вопросов, связанных с обработкой аудио и видео информации
Sevas
user
user
Сообщения: 89
Зарегистрирован: 23 фев 2011, 19:32
Версия LabVIEW: 13
Откуда: Sevastopol

Re: 3D Picture

Сообщение Sevas »

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

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

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

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

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

Проект в LV 2013й версии.
Вложения
LV2013 3d plane.rar
(1.29 МБ) 228 скачиваний
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: 3D Picture

Сообщение dadreamer »

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 КБ) 11992 просмотра
Для сравнения: создание объектов в старом примере и в новом (см. ниже).
Старый:
old_ex.jpg
Новый:
new_ex.jpg
Сам пример:
Axis Rotation Test 2 w Axis Parent.vi
lv2011
(28.24 КБ) 237 скачиваний
А также очень хороший пример для понимания наследственности: 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)). Результат - объект займет ту точку, которая нам нужна. Это проверил: матрица преобразований в обоих случаях одинаковая.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3394
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: 3D Picture

Сообщение Artem.spb »

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

Вторая функция работает как описано, а вот первая всё равно смещает вдоль оси Х.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3394
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: 3D Picture

Сообщение Artem.spb »

Sevas
главный совет: забыть про функции rot x/y :)
В идеале надо рассчитать текущее направление радиус-вектора самолёта и задать его одной функцией.
Как возможный вариант (нет времени проверить), хранить старые значения углов поворота и, получив новые углы, вычислить необходимый доворот (именно это и происходит при вызове функций rel).
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: 3D Picture

Сообщение dadreamer »

Artem.spb писал(а):abs смещение (пусть по X) должно сместить кубик ниже розовой оси Х, так что радиус-вектор равен смещению, а угол между осью и R - как раз N
А почему ниже-то? Абсолютное смещение смещает объект-потомок от своего родителя на заданные смещения X,Y,Z. И действует один раз, поскольку берётся нулевой столбец исходных координат. То есть, сказали на 1 сместить по X, так на 1 и сместится от (0,0,0) родительской СК. Относительное смещение учитывает предыдущие смещения, добавляя к ним текущие. Всё довольно просто получается.
И вот это ваше пожелание тоже выполняется:
Artem.spb писал(а):Центр остался там же, да. Но оси теперь направлены иначе. Так что если бы одна из функций смещала ЦК объекта в СК самого объекта, то кубик должен уезжать не по вектору 1-1-1 в СК сцены.
capture-1.rar
видео
(1.77 МБ) 224 скачивания
Думаю, на этом этапе, когда мы более-менее разобрались с инструментами поворота-смещения, можно "забить" на эти несоответствия (мнимые или реальные, чем бы они ни были). Можно ещё раз описать их основное поведение, выделить красным, (распечатать, вырезать, поставить в рамочку) и запомнить. А можно и не делать, если написанного здесь достаточно. :dntknw:
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: 3D Picture

Сообщение dadreamer »

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

Далее, исходя из того, что "самолёт" вращается по 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. Но всё портят графические глюки на контроле.
Sevas
user
user
Сообщения: 89
Зарегистрирован: 23 фев 2011, 19:32
Версия LabVIEW: 13
Откуда: Sevastopol

Re: 3D Picture

Сообщение Sevas »

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

Qor24PRg5lI

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


500х500 это мои тесты, я с 0 0 0 начинал, но уже не помню почему сдвинул.
Sevas
user
user
Сообщения: 89
Зарегистрирован: 23 фев 2011, 19:32
Версия LabVIEW: 13
Откуда: Sevastopol

Re: 3D Picture

Сообщение Sevas »

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

Настоятельно приму рекомендации по оптимизации проекта, т.к. на нетбуке проект все же подтормаживает. 2д анимация грузит. Если кто сможет упростить буду премного благодарен.
Может как-то можно не процедурно рисовать прибор, а текстуру подгрузить?
Вложения
img-2016-11-12-12-58-29.png
LV2013_Quaternion_rotation.rar
(371.92 КБ) 228 скачиваний
Аватара пользователя
alerm

Activity
leader
leader
Сообщения: 682
Зарегистрирован: 02 май 2012, 21:28
Награды: 1
Версия LabVIEW: 20
Благодарил (а): 57 раз
Поблагодарили: 9 раз
Контактная информация:

Re: 3D Picture

Сообщение alerm »

Уважаемые знатоки! Вопрос задает человек, которому явно нечего делать в два часа ночи, внимание на экран:
сравнение памяти.jpg
LV2013_Quaternion_rotation_1.rar
(386.64 КБ) 209 скачиваний
Sevas
user
user
Сообщения: 89
Зарегистрирован: 23 фев 2011, 19:32
Версия LabVIEW: 13
Откуда: Sevastopol

Re: 3D Picture

Сообщение Sevas »

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

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: 3D Picture

Сообщение dadreamer »

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

ЗЫ: порядочно уже накопилось таких вот "странностей" LV, которые очень сложно объяснить. Начинает возникать ощущение, что программист толком не управляет своей же программой. Вот цена за те удобства, которыми нас щедро обеспечил NI в этом продукте.
Sevas
user
user
Сообщения: 89
Зарегистрирован: 23 фев 2011, 19:32
Версия LabVIEW: 13
Откуда: Sevastopol

Re: 3D Picture

Сообщение Sevas »

Странно.
Я, если честно, думал грабли где-то в области 2д анимации. У меня без неё на нетбуке работает плавнее. Многовато там процедурных линий и украшательств.
Аватара пользователя
alerm

Activity
leader
leader
Сообщения: 682
Зарегистрирован: 02 май 2012, 21:28
Награды: 1
Версия LabVIEW: 20
Благодарил (а): 57 раз
Поблагодарили: 9 раз
Контактная информация:

Re: 3D Picture

Сообщение alerm »

Sevas,
1) у меня в программе есть косяк:
раньше два раза рисовало шкалу выше нуля, теперь всё правильно
раньше два раза рисовало шкалу выше нуля, теперь всё правильно
2) проблема в отрисовке шкалы, я бы посоветовал один раз отрисовать всю картинку со шкалой и выводить только необходимую часть на 2D Picture (см. Get Image Subset.vi). У Вас всё равно меняется положение "крыла", а не отклоняется шкала при изменении по оси Х.
Sevas
user
user
Сообщения: 89
Зарегистрирован: 23 фев 2011, 19:32
Версия LabVIEW: 13
Откуда: Sevastopol

Re: 3D Picture

Сообщение Sevas »

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

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

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

В целом стоит ли игра свеч в плане возни с украшательствами по картинке в 3д?
Artem.spb

Activity Автор
professor
professor
Сообщения: 3394
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: 3D Picture

Сообщение Artem.spb »

Ожидать можно, но ожидания обернутся разочарованием.
3d модели реальных и не очень сложных объектов, отрисованные в 3dMax и экспортированные в LV безбожно тормозили (2-10 кадров/сек).
Положение улучшается сильным уменьшением и упрощением моделек. Фон при этом был монотонный, никаких облаков и прочего.
Плюс большие элементы начинают безбожно глючить
Собственно именно так выглядит модель в сборе. И уже это сильно тормозит.
После уменьшения стало сильно легче. Но не летает.
Ответить

Вернуться в «Работа с графикой и звуком»