Math 如何从两个3D方向向量(零Z旋转)获得X和Y旋转

Math 如何从两个3D方向向量(零Z旋转)获得X和Y旋转,math,graphics,3d,Math,Graphics,3d,我有两个3D方向(标准化)向量A和B。我正在寻找将A旋转为B的欧拉角。我知道它有很多解决方案,因为它可以在任何地方旋转法向量,只需使用两个轴,如X和Y或滚动和俯仰。我必须找到Z旋转为零的解 我想创建这样一个函数: Vector3 dir1 (0, 1, 0); Vector3 someRotation(Pi / 4, Pi / 4, 0); Vector3 dir2 = dir1.rotateXYZ(someRotation); Vector3 xyRotation = dir1.eulerT

我有两个3D方向(标准化)向量A和B。我正在寻找将A旋转为B的欧拉角。我知道它有很多解决方案,因为它可以在任何地方旋转法向量,只需使用两个轴,如X和Y或滚动和俯仰。我必须找到Z旋转为零的解

我想创建这样一个函数:

Vector3 dir1 (0, 1, 0);
Vector3 someRotation(Pi / 4, Pi / 4, 0);
Vector3 dir2 = dir1.rotateXYZ(someRotation);

Vector3 xyRotation = dir1.eulerToDirection(dir2);

// now I expect that the eulerToDirection fv calculated the X, Y rotation from the vectors at Z = 0
// so xyRotation.x == Pi / 4 && xyRotation.y == Pi / 4 && xyRotation.z == 0 is true
// aside from the floating point error

当然,某些旋转在Z轴上并不总是0。只是在这个例子中,首先使用atan2(z2-z1,y2-y1)来找到围绕X轴旋转的角度,该角度对齐y轴和Z轴。然后,使用刚刚旋转的向量和最终向量之间的点积的
acos
。这将是围绕Y旋转所需的角度。根据您执行旋转的方式,您可能需要翻转一些标志。

欢迎使用StackOverflow。如本教程所述,本网站是一个有用问题及其答案的存储库。您没有包含语法有效的代码。请查看如何创建一个演示您的问题的示例。请访问,特别是阅读,了解如何有效地使用这个网站。你的回答真的帮助我理解我错了。即使一个旋转轴固定在零,我也有无穷多的解。在您的解决方案中,我们将一个轴视为首选轴,将另一个轴视为选定轴以获得解决方案。无论如何,谢谢你的回答!