Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 将对象从一个坐标系旋转到另一个坐标系_Opengl_3d_Glm Math - Fatal编程技术网

Opengl 将对象从一个坐标系旋转到另一个坐标系

Opengl 将对象从一个坐标系旋转到另一个坐标系,opengl,3d,glm-math,Opengl,3d,Glm Math,使用glm库进行计算。我有一个位于局部坐标系中的网格,其中轴为: meshUp = glm::vec3(0, 1, 0); meshForward = glm::vec3(0, 0, -1); meshRight = glm::vec3(1, 0, 0); 我需要一个矩阵,它可以将顶点旋转到任何其他新的坐标系,坐标轴为3,fx: newUp = glm::vec3(-0.85, 0.51, -0.08); newForward = glm::vec3(0.45, 0

使用
glm
库进行计算。我有一个位于局部坐标系中的网格,其中轴为:

meshUp =      glm::vec3(0, 1, 0);
meshForward = glm::vec3(0, 0, -1);
meshRight =   glm::vec3(1, 0, 0);
我需要一个矩阵,它可以将顶点旋转到任何其他新的坐标系,坐标轴为3,fx:

newUp =       glm::vec3(-0.85, 0.51, -0.08);
newForward =  glm::vec3(0.45, 0.65, -0.61);
newRight =    glm::vec3(-0.26, -0.56, -0.79);
无需平移,坐标系共享原点。我可以走到一半,就像这样:

glm::vec3 rotationVecForUpAxis = glm::normalize(glm::cross(meshUp, newUp));
float rotationRadiansForUpAxis = acos(glm::dot(meshUp, newUp));

glm::mat4 rotationMatrix = glm::rotate(glm::mat4(), 
                                       rotationRadiansForUpAxis,
                                       rotationVecForUpAxis);
这将工作并旋转网格,使其向上轴与
newUp
轴对齐。但是,在网格的
meshForward
轴与
newForward
轴对齐之前,仍然需要围绕
newUp
轴旋转网格


有人知道怎么做吗

你可以查数学题。但为了好玩,我将在这里推导它

假设以原始坐标系表示的新基向量为:

     [ xnx ]         [ ynx ]         [ znx ]
xn = [ xny ]    yn = [ yny ]    zn = [ zny ]
     [ xnz ]         [ ynz ]         [ znz ]
您正在寻找矩阵
M
,该矩阵将这些向量映射到新坐标系中的基向量:

    [ xnx ] = [ 1 ]        [ ynx ] = [ 0 ]        [ znx ] = [ 0 ]
M * [ xny ] = [ 0 ]    M * [ yny ] = [ 1 ]    M * [ zny ] = [ 0 ]
    [ xnz ] = [ 0 ]        [ ynz ] = [ 0 ]        [ znz ] = [ 1 ]
以矩阵形式编写此文件将给出:

    [ xnx  ynx  znx ] = [ 1  0  0 ]
M * [ xny  yny  zny ] = [ 0  1  0 ]
    [ xnz  ynz  znz ] = [ 0  0  1 ]
这反过来为
M

             [ xnx  ynx  znx ]
M = inverse( [ xny  yny  zny ] )
             [ xnz  ynz  znz ]
换句话说,矩阵是以新基向量作为列的矩阵的逆矩阵

对于旋转,这变得特别容易。旋转矩阵的逆矩阵是矩阵的转置。因此
M
是以新基向量作为行的矩阵:

    [ xnx  xny  xnz ]
M = [ ynx  yny  ynz ]
    [ znx  zny  znz ]
这样,您只需构建一个矩阵,该矩阵将新基向量的值作为行。例如,如果使用
newRight
作为x轴,
newUp
作为y轴,
newForward
作为z轴,则变换矩阵为:

[ newRight.x    newRight.y    newRight.z   ]
[ newUp.x       newUp.y       newUp.z      ]
[ newForward.x  newForward.y  newForward.z ]

在构建矩阵时,请记住,OpenGL的矩阵通常是按列主顺序存储的。

看起来您可能对基础矩阵的更改感兴趣:。非常感谢您的回答,它工作得非常漂亮,而且比我之前的方向简单得多!非常好的回答,谢谢,对于还没有拿过林阿尔格的人来说,非常容易理解!