我必须假定,p1和p2,p2与p1相连,不仅与p1的位置有关,而且与它的旋转有关,所以q1是一个四元数,代表p1的旋转。如果q1旋转,则p1的位置也必须相应地围绕p1旋转。我只需要计算p2的位置,而不是轮换,我已经完成了轮换。所以,基本上是一艘太空船停靠在一个空间站,我需要移动和旋转空间站周围,与它对接的飞船。我该怎么做呢?
我为它编写的代码可以工作,只要在对接过程中车站没有旋转:
bool docked[100];
Quaternion quatTarget[100];
double distance_dock[100];
vector3 docking_position(int ship, int station)
{
if (!docked[ship])
{
docked[ship] = true;
distance_dock[ship] = distances(position[ship], position[station]);
vector3 direcc = normalized(position[station] - position[ship]);
quatTarget[ship] = vecToVecRotation(direcc, { 0, 0, 1 });
QuaternionNormalize(&quatTarget[ship], &quatTarget[ship]);
}
Quaternion orientation = total_rotation[station] * quatTarget[ship];
Matrix docking_place;
MatrixRotationQuaternion(&docking_place, &orientation);
vector3 axis_z = { docking_place(0, 2), docking_place(1, 2), docking_place(2, 2) };
return position[station] + -axis_z * distance_dock[ship];
}我在这里要做的是,在对接时,取一个四元数从船到站,然后沿着这个方向的负z轴将船的"distance_dock“单元转换,所以船总是相应地移动,但不知怎么的,如果我在空间站已经旋转时停靠船,那么我就把最初的对接位置弄错了,尽管它仍然与空间站完美地旋转。
发布于 2015-01-13 14:03:33
如果我正确理解你,你有两个对象,它们之间有一个严格的转换。问题是你想要计算一个姿势(位置+方向),给出另一个姿势。
假设您有三个框架:空间站框架"S“、车辆框架"V”和全局框架"G“(我假设您的图形环境有一个全局3D笛卡尔框架)。帧S和V之间的转换是完全已知的(平移和定向)和常数,表示为S_p_SV (站的位置,以站帧表示)和SV_q (车辆的四元数方向,以站帧表示)。
如果你没有刚体力学方面的经验,这会让人困惑,在这种情况下,你应该阅读一些关于“刚体力学”的介绍性说明/幻灯片,这在谷歌的结果中非常丰富。
我用乳胶写了这个表达式,但不幸的是,StackOverflow不支持它,所以我把它作为图像附在一起。原来的乳胶可以找到这里。例如,在下面的表示法中,第一行Sp_SV是Vehicle w.r.t的position。S,用(旋转的)S表示。前缀上标表示旋转框架。例如,对于四元数G_Sq,这表示从G圆框到S符号帧的方向。

关于在C++中实现这一点,我不确定您正在为四元数使用什么库,但是您需要以下函数:
https://stackoverflow.com/questions/27537160
复制相似问题