вторник, 11 марта 2014 г.

короткой строкой
- экспортер теперь на C++ в виде плагина для 3ds max 2014
удобно блин

1 скорость выгрузки несопоставима с максовым скриптом ! к примеру 450к поликов выгружаются через maxscript часа 4 через С++ меньше 10 секунд

2 экспорт происходит вызовом команды из максового меню export

короче мега удобнее мега лучше ! кстати еще + вершины через С++ выгружаются в дефолтном состоянии ( то есть без скейлов ротаций и смещений ) можно отдельно выгрузить эти матрицы ( что удобнее чем влоб получение позиций как в макскрипте ) 

воскресенье, 9 марта 2014 г.

Привет)

Да я опять без скринов ) на самом деле сижу жду пока произойдет выгрузка модели из 3дмакса ( 400к поликов ... )

Поэтому расскажу пока вот что

Дополненная реальность
итак пути развития есть 2

1 это решение в лоб
- получили картинку с камеры
- нашли на картинке все корнеры ( это границы, грани, очертания и т.д. )
- из того что нашли ( а найти мы можем реально много ) выбираем те которые образует между собой замкнутую область с 4 углами ( вычисляем теоритические маркеры )
- после чего полученные области можно отсечь путем подсчета размера ( к примеру совсем мелкие выкинуть и совсем крупные )
- теперь проверяем пару внутренних пикселей на черный цвет ( или какой у нас в маркере является "ободком" ), и выкидываем все те которые не подходят
- далее оставшиеся уже проверяем, после долгого поиска в гугле я нашел довольно интересный подход, а именно наш рект проецируется на экран, а именно убираются все искажения и получается плоская картинка, как будто наш кусок изображения не лежит на столе, а приклеен к камере, таким образом имея размеры нашего ректа мы можем его "прочитать"( кстати тут если мы знаем точные соотношения нашего маркера мы можем выкинуть еще парочку не подходящих квадратов ), самый простой способ создания маркера это черный белый квадрат, где черный означает битовый флаг сброшен, а белый установлен

в итоге мы получаем заветные наши 4 точки которые через solvePnP можно преобразить в два вектора tVec и rVec далее путем простой математики мы получаем матрицу для openGL

да я сейчас пишу очень поверхностно и без примеров кода и картинок ( на самом деле это пре-статья и я чуть позже напишу более развернуто все )

2 это решение через featureDetect
- получили картинку
- нашли на картинке точки ( определенным образом )
- далее ищем соответствия с просчитанными заранее точками маркера
- ну тут конечно нужно будет отсеять кучу не нужного, например - точки могут найтись там где фактически маркера нету. путь решения - считать длину ( не подходящую выкидывать ), и считать сколько точек сосредоточены в одном месте ( это кстати просто мысль ), судя по тестам ошибочные точки хаотичны и разбросаны по картинке поэтому если подсчитать сколько точек находятся наиболее тесно друг другу в одном месте можно понять нашли мы то что нужно или нет
- мобильная оптимизация, самым главным образом
1 на маркере ищем порядка 1500 точек
2 на кадре ищем порядка 100 точек ( кстати есть статья где говорится что достаточно искать 20 точек но что то мне не верится а времени проверить пока нет )
3 если мы нашли маркер то к следующему кадру мы готовим только найденные точки
- в итоге это позволяет сузить нагрузку но на сколько пока не ясно
- для найденных точек мы вызываем findHomography которая нам выдает матрицу 3х3
- далее по матрице можно а) найти 4 точки описывающие наш маркер, б) построить матрицу для openGL

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

все это больше похоже конечно на записку чем запись в блоге ) так что считаем это убиением времени и промежуточным вариантом статьи )


среда, 5 марта 2014 г.

Привет ) я тут и дело движется
сейчас я занят дополненой реальностью и написанием движка на основе опенСВ, чуть позже когда появятся картинки я буду выкладывать инфо об этом направлении ( конечно для рендера используется мой движок )

кстати я тут провел массовые замеры + тесты, итак

GLKMatrixMult vs XTECHMath

GLKMult время исполнения запроса 0.06
XTECHMath время исполнения 0.04

что главным образом у меня сделано ?
- передача в функции указателей
- агресивный инлайн функций
- арм НЕОН ( он есть и в ките, но на примере используется не много другой код мультипликации )

тестирование было как в симуляторе на чистом С++ коде так и на устройстве с включенным НЕОН, так же я пробовал вставлять агресивный инлайн в GLK, в итоге во всех тестах моя реализация показала себя быстрее ;)

на данный момент я загрузил в движок 24к поликов ( не много, да, но это моделька из асасинкрита ) включил пер-пиксельное освещение и тени, и имею 1 мс утилизации GPU и 1ms утилизации CPU на iphone 5, пока сложно сказать на сколько это хорошие или плохие показатели так как сцена все таки мега простая, но как старт я думаю норм )


статьи по дополненной реальности я буду писать в этот же блог так что ждем обновления, совсем скоро я расскажу о двух методах определения маркеров в кадре и о трекинге ;)