我有一个三维空间中的矩形平行六面体,如下所示:
假设它被放置在坐标轴原点上,并且当它的旋转为(0,0,0)时,它的最大面(绿色)在XY平面,最小面(蓝色)平行于YZ平面。
假设我有两个(正交)向量V1和V2。
V1表示Object3d最大面(绿色面)的法向量。
V2是最小面(蓝色面)的法向量。
给定两个新向量,如何在三维空间中旋转这个平行六面体,使其面的法向量与这些新向量对齐?
例如:
const V1 = new Vector3(0, 1, 0);
const V2 = new Vector3(0, 0, 1);
在这个设置中,我期望有这个旋转(欧拉角以度为单位):(-90, 0, -90)。
(生成的实体将其最大面朝下放在XZ平面上,最小面放在XY平面上)。
我尝试过的方法:
const v1 = some_value;
const v2 = some_othen_value; // ortogonal to v1
const q1 = new Quaternion();
q1.setFromUnitVectors(new Vector3(1, 0, 0), v1);
const q2 = new Quaternion();
q2.setFromUnitVectors(new Vector3(0, 0, 1), v2);
parallelepiped.setRotationFromQuaternion(q2.multiply(q1));
这种方法对于某些配置是有效的,但在其他情况下会失败得很厉害。
失败示例:
V1 = new Vector3(1, 0, 0);
V2 = new Vector3(0, 0, 1);
在这种情况下,旋转的结果是(0,0,0),但我期望得到类似于(0, 90, 90)的结果。您有任何想法吗?