在一系列依赖的附加对象上执行旋转变换的最快方法

时间:2012-01-27 18:37:57

标签: c++ algorithm math opengl eigen

假设我有两个(例如两个,实际上是一些n> 1)种类的矩形棱镜“相互连接”,使得它们相邻面上的4个顶点在内存中是相同的顶点。所以就像两个木块一样,一个堆叠在另一个上,底部有4个顶点,中间有4个在两者之间共享,4个在顶部。现在,我希望能够首先在“顶部”木块上进行特定旋转,就好像它位于具有这4个共享顶点的中心点的铰链上一样。

就像肘部一样,假设它只能以特定的角度弯曲45度,并且为了执行旋转,我将围绕该不可见的铰链中心点旋转构成物体的8个顶点。在此过程中,另一个块的4个共享顶点稍微移动,但由于铰链是它们中的中心点,因此它们不会从底部块“转换”。我猜他们称之为木制是违反直觉的,因为他们会以特定的方式变形,但我试图将其设置为可视化。无论如何,让我们说我希望能够以不同的方式旋转这个底部块,但让顶部块像它附加一样。因此,如果底部块移动,顶部块就会随之摆动,但,无论它们在它们之间的铰链上有什么弯曲。

我正在考虑通过轴角或四元数逐步进行转换,从“最顶层”块开始,沿着依赖链向下工作,在当前块上执行旋转,在“上面”块上执行每个顶点。然而,这将需要弄乱所有顶点以将当前铰链作为原点,执行旋转,然后反转该链中的每个步骤的前一个偏移。有没有更有效的方法来处理这个?我的意思是速度效率,在内存中有额外的预处理数据并不是什么大问题。也许有一段时间我不能指望拥有这样一个线性依赖链(例如顶部块最终会附加到底部块以形成一个环,也许)。为这种可能性处理这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:0)

从你的描述中听起来,你基本上想要像长条“jello”这样的东西,也就是说,如果块/棱镜的顶部移动,那么在其余部分中有一些次要运动。阻挡/棱柱链,有点像移动链条或某些软体会在构成链条或环的其余部分中产生次要运动。

如果是这种情况,那么我建议实际构建一些“骨骼”,其中每个骨段开始和结束于4个顶点的中心点,构成棱镜的每个起点和终点/块。然后,您可以计算何时移动骨链的一个部分,链中的其他骨骼相对于移动的骨骼应移动多少。从那里,您可以将棱镜/块中的其余顶点对着这个中心“骨骼”进行加权,以便它们在骨骼移动时移动适当的量。您可能还希望将附加到一个“骨骼”的顶点与另一个骨骼段进行平均,以便附着顶点的重量出现下降,如果最终在每个骨骼上施加过多的捏合,则会产生更平滑的移动“联合”。

使用具有与骨骼对称的顶点的骨骼应减少需要计算的旋转变换的数量。只有骨关节的运动才需要进行繁重的计算......顶点本身只是从链中骨骼的位置进行插值。

答案 1 :(得分:0)

答案 2 :(得分:0)

处理铰接式单端链的标准方法是skeletal animation - 使用一系列“骨骼”元素(由相对平移/旋转关系定义),可选择基于线性插值在骨骼上确定“皮肤”顶点的位置。 (请注意,您需要确定每个“关节”的旋转角度,以完全定义姿势。)

元素环更难以处理,因为您无法再独立于所有其他关节定义每个关节的旋转。要解决此问题,请设置包含所有约束的物理模拟或其他求解器。究竟要做什么取决于你需要如何操纵对象 - 如果它是游戏引擎的一部分,物理模拟是有意义的,但如果它是手动动画,你有半自动装配的广泛可能性( keyword:reverse-kinematic)。