Unity3d 使用奇异值分解法(SVD)统一对齐2组3D点

Unity3d 使用奇异值分解法(SVD)统一对齐2组3D点,unity3d,decomposition,math.net,singular,Unity3d,Decomposition,Math.net,Singular,我想把轮廓上的一组参考点转换成一组对应的目标点。每个轮廓上总共有8个点 为了计算旋转和平移向量,我使用Math.Net Numerics library执行SVD计算-想法来自(第3-7页): 但不知何故,我注意到使用SVD计算结果进行的转换似乎不准确。结果如下所示: 变换应该将参考点移动到目标点,使其尽可能靠近目标点,但高亮显示时,它会远离目标点 此外,我还做了一个简单的测试,通过该测试,我计算了两个轮廓的质心并进行了推导:(TargetCentroid-RefCentroid=平移向量)

我想把轮廓上的一组参考点转换成一组对应的目标点。每个轮廓上总共有8个点

为了计算旋转和平移向量,我使用Math.Net Numerics library执行SVD计算-想法来自(第3-7页):

但不知何故,我注意到使用SVD计算结果进行的转换似乎不准确。结果如下所示:

变换应该将参考点移动到目标点,使其尽可能靠近目标点,但高亮显示时,它会远离目标点

此外,我还做了一个简单的测试,通过该测试,我计算了两个轮廓的质心并进行了推导:(TargetCentroid-RefCentroid=平移向量)。最终的转换结果与通过SVD的结果相同

我做错什么了吗?有人能提出一个更好的解决方案来将参考点转换为目标点吗

编辑: 1.从参考模型到各种目标模型的服装转换


这似乎是一个过于复杂的问题解决方案

如果您有目标点,您可以将给定点映射到相应的目标点

或者,如果目标是与图片中相同的网格,但具有不同的缩放和旋转,则可以分别对变换值、缩放和旋转进行Lerp,而无需逐个检查所有点

使用Vector3.Lerp

编辑:
此外,lerping将使所有点同时达到其目标,这在大多数情况下是所需的行为。

感谢您的回复。实际上,我正在构建一个虚拟试衣间应用程序。我之所以不使用Vector3.Lerp,是因为我需要获得平移向量,以便各个点能够平移到目标点。翻译向量稍后将用于将服装从参考模型转移到目标模型。@mcmc您还可以尝试使用transform.setParent(,true)将服装作为模型的子对象。对于第二个参数,将true传递给应该使服装位置保持在世界坐标中,并且可以将该偏移设置为0,使其滑动到模型上。在此之前,将衣服的局部坐标保存为所需的矢量。谢谢您的建议。目标模型具有动态大小和网格。Lerping可能能够将衣服滑动到模型上,是的,在视觉上它可能会解决问题,但它似乎无法获得真实的“合身”数据,例如:如果用户尝试穿较小的衣服,它应该突出显示紧身部分-真实的测量是关键;)@mcmc在这种情况下,我会像裁缝一样存储测量数据、物体的周长等(我真的不知道术语)。我是从事游戏开发的,所以我的第一个想法是如何通过这些类型的计算省钱,如果它在视觉上有效,那对我来说是件好事:)其余的是单独处理的隐藏数字数据。另外,如果是移动设备,用户实际会看到多少细节?嗯。。只需在检查器中调整刻度。如果附加一个标记(如弯头),调整比例后,标记将位于新的正确位置。@JoeBlow这必须在运行时动态完成-问题是,尽管在导入期间大小不同,但所有目标模型的比例均为(0,0,0)。配件不应该硬编码,因为目标模型的大小不同。这必须在运行时动态完成吗?Unity在运行时工作。当然,只需调整code dude中的
变换
。所有模型的每个部分都有以厘米为单位的适当测量值,以及那些衣服,这并不像通过检查器或程序调整比例那样简单,因为我说你在物品上使用标记对象,比如说相隔10厘米。这完全是标准的。Unity以实际米为单位工作。显然,如果你想把直径增加一个因子,当然你可以用一个基本的几何公式来增加半径(例如,d=r2pi,等等)