我正在用 C++(弹簧物理)进行绳索物理模拟。我成功地实现了基本的绳索运动,它由几个“骨骼”(它们只是一些具有位置、重量等的粒子 [质量])组成。计算每个粒子的位置后,我将它们分别分配给蒙皮网格骨架的相应骨骼。我想要的是计算一个粒子的旋转,以便它旋转到它的子粒子(圆是骨头的头部[粒子的位置],黑点是尾巴,它应该连接到它的孩子的头部,并且依此类推...): 我查找了一些线程并得出了结论:Finding quaternion代表从一个向量到另一个向量的旋转,并尝试实现我的项目接受的答案,所以我得到了这个:
XMVECTOR q;
XMVECTOR a = XMVector3Cross(head,tail);
XMVECTOR lh=XMVector3Length(head),lt=XMVector3Length(tail),dot=XMVector3Dot(head,tail);
q.m128_f32[0] = a.m128_f32[0]; //assigning the x coordinate
q.m128_f32[1] = a.m128_f32[1]; //assigning the y coordinate
q.m128_f32[2] = a.m128_f32[2]; //assigning the z coordinate
q.m128_f32[3] = sqrt(pow(lh.m128_f32[0],2)*pow(lt.m128_f32[0],2)) + dot.m128_f32[0]; //assigning the w coordinate
return XMQuaternionNormalize(q);
不幸的是,由于某种原因它对我不起作用,所以尝试了另一个也失败了:
XMVECTOR Head = XMVector3Normalize( head );
XMVECTOR Tail = XMVector3Normalize( tail );
float angle = acos(XMVector3Dot(Head,Tail).m128_f32[0]); //acos(dot(Head,Tail))
XMVECTOR axis = XMVector3Normalize(XMVector3Cross(Head,Tail));
XMVECTOR q = XMQuaternionRotationAxis(axis,angle);
如果有人能给我一个替代解决方案,我将非常感激,并为糟糕的绘画技巧感到抱歉。