Совместите 2 набора трехмерных точек в Unity, используя метод разложения по сингулярным числам (SVD)
Я хотел перевести набор контрольных точек на контуре в набор соответствующих целевых точек. Всего на каждом контуре 8 точек.
Чтобы рассчитать вектор вращения и перемещения, я использовал библиотеку Math.Net Numerics для расчета SVD. Идея пришла из этого URL (стр. 3-7):
Но как-то я заметил, что преобразование, выполненное с использованием результата вычисления SVD, кажется неточным. Результат как показано ниже:
Предполагается, что преобразование перемещает контрольные точки к целевым точкам как можно ближе, но, как выделено, оно удаляется от целевой точки.
Кроме того, я также провел простой тест, в соответствии с которым я рассчитал центроид для обоих контуров и выполнил вычет: (TargetCentroid - RefCentroid = вектор перевода). Окончательный результат преобразования такой же, как и при прохождении SVD.
Я сделал что-то не так? Кто-нибудь может предложить лучшее решение для преобразования контрольной точки в целевую точку?
Редактировать:1. Преобразование одежды из эталонной модели в различные целевые модели
1 ответ
Это кажется слишком сложным решением проблемы.
Если у вас есть целевые точки, вы можете просто привязать указанные точки к соответствующим им целевым точкам.
Или, если целью является та же сетка, но с другим масштабом и вращением, как на рисунке, вы можете просто отбросить значения преобразования, масштабировать и вращать с уважением, без необходимости проходить все точки по отдельности.
Использование Vector3.Lerp
Изменить: Кроме того, lerping заставит все точки достичь своих целей одновременно, что в большинстве случаев является желаемым поведением.