Совместите 2 набора трехмерных точек в Unity, используя метод разложения по сингулярным числам (SVD)

Я хотел перевести набор контрольных точек на контуре в набор соответствующих целевых точек. Всего на каждом контуре 8 точек.

исходные и соответствующие целевые точки

Чтобы рассчитать вектор вращения и перемещения, я использовал библиотеку Math.Net Numerics для расчета SVD. Идея пришла из этого URL (стр. 3-7):

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

Результат Unity после примененного вектора перевода, рассчитанного по SVD

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

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

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

Редактировать:1. Преобразование одежды из эталонной модели в различные целевые модели

Трансформация одежды

1 ответ

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

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

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

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

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

Другие вопросы по тегам