Маркировка частей 3D-модели с помощью Android и OpenGL ES/Rajawali

Я импортировал в свою сцену модель (например, чайник), используя Rajawali. Я хотел бы пометить части модели (например, крышку, корпус, ножку, ручку и носик), используя простые представления Android, но я понятия не имею, как этого можно достичь. В частности, размещение меток в нужном месте кажется сложной задачей. Идея состоит в том, что когда я изменяю положение моей модели в сцене, кончики меток по-прежнему располагаются правильно.

Учебник Rajawali показывает, как представления Android могут быть размещены поверх сцены здесь https://github.com/Rajawali/Rajawali/wiki/Tutorial-08-Adding-User-Interface-Elements . Я также понимаю, как с помощью матриц преобразования 3D-координату на модели можно преобразовать в 2D-координату на экране, но я понятия не имею, как определить точные 3D-координаты на самой модели. Модель экспортируется в формат OBJ с помощью Blender, поэтому я предполагаю, что есть какой-то умный способ определить координаты в Blender и экспортировать их в отдельный файл или как-то включить их в файл OBJ (но не отображать эти точки, а только включать их как метаданные), но я понятия не имею, как это сделать.

Любые идеи очень ценятся! :)


person medonja    schedule 08.11.2015    source источник


Ответы (1)


Я бы использовал screenquad, а не представление. Это общее решение GL, которое также будет работать с iOS.

Вы должны определить индексы желаемых вершин модели. Используя приведенный ниже алгоритм рендеринга текста, вы можете просто возиться с ними, пока не нажмете нужные.

  1. Создайте разумное растровое изображение ARGB с тем же соотношением сторон, что и экран.
  2. Создайте текстуру screenquad, используя это растровое изображение.
  3. Создайте холст, используя это растровое изображение
  4. Остальное происходит в onDrawFrame(). Очистите холст, используя прозрачную краску.
  5. Используйте матрицу MVP, чтобы преобразовать желаемые вершины модели в координаты холста.
  6. Нарисуйте желаемый текст в координатах холста
  7. Обновите текстуру.

  • Ваш текст будет отображаться очень точно в указанных вами вершинах. Поток GL выполнит двойную буферизацию и зациклит вас на #4. Супер плавная 3D анимация текста!
  • Используйте двойную математику с плавающей запятой, чтобы избежать потери точности при преобразовании координат, что приводит к шаткому тексту. Вы даже можете использовать значение z вершины для масштабирования текста. Изысканный!
  • Узким местом производительности является № 7, поскольку все растровое изображение должно копироваться в память текстур GL в каждом кадре. Старайтесь, чтобы растровое изображение было как можно меньше, сохраняя соотношение сторон. Возможно, пусть пользователь переключает ярлыки.

  • Обратите внимание, что копирование в память текстур GL является избыточным, поскольку в OpenGL-ES память GL является обычной памятью. Из соображений совместимости избыточный кусок обычной памяти зарезервирован для искусственного принудительного копирования.

person Dominic Cerisano    schedule 10.11.2015
comment
Спасибо Доминик за ответ. Тем не менее, я все еще не уверен, как сопоставить координаты. Что касается рисования на холсте, я не уверен, что тогда у меня будет какое-либо взаимодействие с пользователем с помощью меток. Я хотел использовать представления, потому что мне нужно, чтобы метки реагировали на события касания. - person medonja; 11.11.2015
comment
Используйте MVPMatrix (model-view-projection), предоставляемый классом материала, для преобразования 3D в экранные координаты. Поскольку события onTouch дают координаты экрана, вам ни для чего не нужны представления. Представления обрабатываются в отдельном потоке пользовательского интерфейса, и синхронизация потока пользовательского интерфейса с потоком GL чрезвычайно проблематична. Просто используйте поток GL. - person Dominic Cerisano; 16.11.2015
comment
Кстати, вы также можете использовать систему частиц GL_POINTS с поддержкой VBO, FBO и текстурных альтов для очень быстрого рендеринга меток. Обратите внимание, что чистое решение GL можно переносить на iOS, Win10, WebGL и т. д. - person Dominic Cerisano; 16.11.2015
comment
Хорошо, спасибо! Тем временем я разработал решение для потока пользовательского интерфейса, оно на самом деле прекрасно работает на моем HTC One. Почему вы говорите, что синхронизировать эти потоки крайне проблематично? - person medonja; 16.11.2015
comment
Проблематично обмениваться данными между любыми независимо синхронизируемыми потоками. Если вы никогда не планируете обмениваться данными между потоками пользовательского интерфейса и GL, то проблем нет. Кроме того, вы заметите, что ваши метки пользовательского интерфейса не полностью синхронизированы с вершинами GL (они очень немного колеблются из-за независимой синхронизации). Незначительная деталь, но как только вы увидите идеальную синхронизацию GL, вы не сможете вернуться назад. - person Dominic Cerisano; 17.11.2015
comment
Вы также можете использовать систему частиц с атласом текстур, но это значительно сложнее и требует шейдеров. Тем не менее, это решило бы проблему с копированием текстур. - person Dominic Cerisano; 19.12.2015