计算旋转矩阵以将一个向量转换为另一向量?

时间:2018-09-05 15:49:40

标签: c++ vector linear-algebra rotational-matrices

关于堆栈溢出,有几个问题,但是大多数问题都使用四元数,而我正在寻找不需要的东西。这个问题遍及整个网络,但是很难在代码中找到简单的示例。我正在寻找用于旋转矩阵的C / C ++或GLSL /金属解决方案,以将一个向量转换为另一个向量。我发现这似乎可以回答以下问题:http://www.j3d.org/matrix_faq/matrfaq_latest.html#Q38

但是,它实际上对我不起作用。这样,我就可以在90度角处获得正确的变换(即,将0,0,1转换为0,1,0),但是在两者之间却以错误的方向扭曲。这是我正在使用的代码-有人看到它出了什么问题吗?

在这种情况下,我总是从固定的起始法线(0,0,1)进行转换。

// matrix to rotate from (0,0,1) to specified direction

float4x4 directionMatrix(float3 direction) {

    float3 normal = float3(0.0,0.0,1.0);
    float3 V = normalize(cross(normal, direction));
    float phi = acos(dot(normal,direction));

    float rcos = cos(phi);
    float rsin = sin(phi);

    float4x4 M;

    M[0].x =        rcos + V.x * V.x * (1.0 - rcos);
    M[1].x =  V.z * rsin + V.y * V.x * (1.0 - rcos);
    M[2].x = -V.y * rsin + V.z * V.x * (1.0 - rcos);
    M[3].x = 0.0;

    M[0].y = -V.z * rsin + V.x * V.y * (1.0 - rcos);
    M[1].y =        rcos + V.y * V.y * (1.0 - rcos);
    M[2].y = -V.x * rsin + V.z * V.y * (1.0 - rcos);
    M[3].y = 0.0;

    M[0].z =  V.y * rsin + V.x * V.z * (1.0 - rcos);
    M[1].z = -V.x * rsin + V.y * V.z * (1.0 - rcos);
    M[2].z =        rcos + V.z * V.z * (1.0 - rcos);
    M[3].z = 0.0;

    M[0].w = 0.0;
    M[1].w = 0.0;
    M[2].w = 0.0;
    M[3].w = 1.0;

    return M;
}

如果原始文章使用了我的相反的列行多数情况,我尝试将其转置,但没有帮助。

编辑:原来的问题是此代码适用于我的惯用右手的左手坐标系。因此,要使其正常工作,您只需将phi乘以-1。我还按照注释中的建议编辑了代码,以添加交叉向量的归一化。

0 个答案:

没有答案