【发布时间】:2011-06-07 21:22:45
【问题描述】:
请注意,虽然听起来很相似,但这不是常见的“如何将一个向量旋转到另一个向量”的问题。
我想从两组 3 个点推导出仿射变换(矩阵或四元数+向量形式)。这些可以看作是刚体上的“标记点”,或者是“向前和向上”向量的端点。 平移和旋转是必要的,缩放不是必需的。此外,四元数+矢量解决方案将是一个加号,因为它可以让我将 1/3 的实例塞进绘图批次(8 个制服而不是 12 个)。 其目的是建立一个系统,用于以直观的方式确定(铰接或未铰接的)身体的姿势,而无需维护和行走复杂的层次结构。
第一个明显的简化是通过选择一个点并从相应的“起点”中减去“目的地”来消除平移部分。现在我们只需要处理一个轮换。
有一个众所周知的、计算成本低廉的构造四元数的解决方案,它可以将一个向量旋转到另一个向量上,即 q(cross(v1,v2) ; sqrt(v1.len_sq * v2.len_sq) + dot(v1,v2 )) 或 q(cross(v1,v2) ; 1 + dot(v1,v2)) 用于单位长度向量。不幸的是,这种方法没有“向上方向”的概念,因此总是在最短的弧上旋转(这会使对象不对齐)。 幼稚的做法是简单地对两个向量使用这种方法并将四元数相乘,但显然不会那么容易。 需要做的是选择两个向量中的一个(我们称其为“前向”),并为此创建一个四元数,然后使用该四元数旋转另一个(“向上”)向量,然后构造第二个四元数对于旋转的“向上”向量(和目标“向上”向量),最后将第二个乘以第一个四元数。据我所知,这将是正确的,但它也非常复杂。
现在...至于旋转矩阵,我知道“三元法”,我理解如下: - 正交化向量对(开始和结束) - 这会产生两个正交基,它们是从“公共参考系”开始和结束的相应旋转矩阵。这到底是什么参考系并不重要,重要的是两者都是相同的。 - S 是从“普通帧”到起始帧的变换,D 是分别到结束帧的变换。 - 因此,S-1 * D * v 将任意点从起点坐标系变换到终点坐标系(通过公共参考系)。 - S-1 == ST 因为它是一个正交矩阵,并且 ST * x = x * S - 因此:ST * D * v = D * S * v
这应该可行,但对于实际上应该非常非常简单的事情来说,它似乎仍然相当复杂。
有没有更简单、更直接的解决方案?
【问题讨论】:
-
我相信这是
http://math.stackexchange.com/的一个很好的候选人
标签: math