将3D矢量旋转到另一个3D矢量上

时间:2015-01-28 14:17:31

标签: python vector 3d rotation euler-angles

我正在尝试将一个三角形转换为3D空间中的另一个三角形(右三角形)。我的想法是我对齐前向和左向量,然后将一个中心转换为另一个。

因此,我试图找到一种方法来旋转一个矢量,使其面向与另一个矢量相同的方向。我必须将3D矢量旋转到另一个3D矢量上。我只允许对全局x,y和z进行旋转。

我使用以下代码创建3D旋转矩阵:

normA = TriangleA.forward.normalize();
normB = TriangleB.forward.normalize();

v = normA.cross(normB);
s = v.magnitude();
c = normA.dot(normB);

if s == 0:
    return TriangleB;

vx = [[None for _ in range(3)] for _ in range(3)];
vx[0][0] = 0;
vx[0][1] = v.z;
vx[0][2] = -v.y;

vx[1][0] = -v.z;
vx[1][1] = 0;
vx[1][2] = v.x;

vx[2][0] = v.y;
vx[2][1] = -v.x;
vx[2][2] = 0;

vx = Matrix3x3(vx);
vx2 = vx * vx;

# R = I + vx + vx2 * 1 - c/s^2
a = (1 - c)/(math.pow(s, 2));
a = vx2.scalar_multiply(a);
a = vx + a; 
I = GetIdentity();

R = I + a;

if R.m[2][0] != -1 or R.m[2][0] != 1:
    roty = -math.asin(R.m[2][0]);
    roty2 = math.pi - roty;

    rotx = math.atan2(R.m[2][1]/math.cos(roty), R.m[2][2]/math.cos(roty));
    rotx2 = math.atan2(R.m[2][1]/math.cos(roty2), R.m[2][2]/math.cos(roty2));

    rotz = math.atan2(R.m[1][0]/math.cos(roty), R.m[0][0]/math.cos(roty));
    rotz2 = math.atan2(R.m[1][0]/math.cos(roty2), R.m[0][0]/math.cos(roty2));
else:
    rotz = 0;
    if R.m[2][0] == -1:
        roty = math.pi/2.0;
        rotx = rotz + math.atan2(R.m[0][1], R.m[0][2]);
    else:
        roty = -math.pi/2.0;
        rotx = -rotz + math.atan2(-R.m[0][1], -R.m[0][2]);

rotx = math.degrees(rotx);
roty = math.degrees(roty);
rotz = math.degrees(rotz);

然而,我遇到了问题。第一个问题是当叉积为0时,这并不一定意味着两个向量面向相同的方向。可能是他们是平行的,但相隔180度。

第二个问题是,即使向量面向相同方向,三角形最后仍然相隔180度:

enter image description here

不确定我做错了什么。

0 个答案:

没有答案