关于堆栈溢出,有几个问题,但是大多数问题都使用四元数,而我正在寻找不需要的东西。这个问题遍及整个网络,但是很难在代码中找到简单的示例。我正在寻找用于旋转矩阵的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。我还按照注释中的建议编辑了代码,以添加交叉向量的归一化。