2016-03-03 14 views
0

Я хотел перевести набор опорных точек на контур в набор соответствующих целевых точек. На каждом контуре имеется всего 8 очков.Выровнять 2 набора трехмерных точек в Unity с помощью метода разложения сингулярных значений (SVD)

reference and corresponding target points

Для расчета перевода вектора вращения &, я использую библиотеку Math.Net ЦИФРЫ выполнить расчет SVD - Идея пришла от this URL (стр 3-7):

Но как-то Я заметил, что преобразование, проведенное с использованием результата расчета SVD, кажется неточным. Результат, как показано ниже:

Unity result after applied translation vector calculated from SVD

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

Кроме того, я также сделал простой тест, по которому я рассчитал центроид для обоих контуров и выполнил вывод: (TargetCentroid - RefCentroid = переводный вектор). Конечный результат преобразования такой же, как и через SVD.

Я сделал что-то не так? Может ли кто-нибудь предложить лучшее решение для преобразования точки ref в целевую точку?

Edit: преобразование 1. одежды от эталонной модели для различных целевых моделей

Garment transformation

+0

umm .. просто отрегулируйте ** шкалу ** в инспекторе. если вы прикрепляете маркер к локтю, после настройки ** шкалы **, маркер будет в новом правильном положении. – Fattie

+0

@JoeBlow Это должно выполняться «на лету» во время выполнения. Проблема заключается в том, что все целевые модели масштабируются (0,0,0), несмотря на размер во время импорта. Фитинг не должен быть жестко закодирован, так как размер целевых моделей отличается. – mcmc

+0

Это должно выполняться «на лету» во время выполнения? ** Unity работает во время выполнения **. конечно, просто отрегулируйте «Трансформацию» в чуваке кода. – Fattie

ответ

0

Это кажется более сложным решением проблемы.

Если у вас есть целевые точки, вы можете просто переместить указанные точки в соответствующие целевые точки.

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

Использование Vector3.Lerp

Edit: Кроме того, lerping заставит все точки, чтобы достичь своих целей, в то же время, что, в большинстве случаев, желаемое поведение.

+0

Спасибо за ваш ответ.На самом деле я создаю приложение виртуальной аппликации. Причина, по которой я не использую Vector3.Lerp, состоит в том, что мне нужно получить вектор трансляции, чтобы соответствующие точки могли перевести на целевые точки. Вектор перевода будет использоваться позже, чтобы перенести одежду из эталонной модели в целевую модель. – mcmc

+0

@mcmc Вы также можете попробовать сделать одежду дочерней моделью с transform.setParent (<преобразование модели>, истина). Передача true для второго аргумента должна содержать местоположение одежды в мировых координатах, и вы можете зафиксировать это смещение до 0, чтобы он скользил по модели. Сохранение локальных координат предмета как желаемого вектора перед тем, как сделать. –

+0

Спасибо за ваше предложение. Целевая модель имеет динамический размер и сетку. Лерпинг может скользить по одежде на модель, да, визуально она может решить проблему, но, похоже, она не может получить реалистичные «подгоняемые» данные, например: если пользователь пытается надеть меньшую одежду, он должен выделить узкую секцию - реальное измерение является ключевым;) – mcmc