OpenGL在不同右手符号之间的转换

OpenGL在不同右手符号之间的转换,opengl,Opengl,我正在用OpenGL显示一组3D点。问题是3D点来自一个传感器,其中X向前,Y向左,Z向上。据我所知,OpenGL在屏幕右侧有X,Y向上,Z向上。所以,当我使用很多投影矩阵和相机的例子时,这些点显然不是以正确的方式,或者说是有意义的方式来观察的 因此,要比较这两个(传感器为S,OpenGL为O): Xs==-Zo,Ys==-Xo,Zs==Yo 现在我的问题是: 如何将点从S旋转到O。我试着绕X旋转90度,然后再绕Z旋转,但似乎不起作用 我是否需要按照OpenGL的约定旋转,我是否可以制作自己的轴

我正在用OpenGL显示一组3D点。问题是3D点来自一个传感器,其中X向前,Y向左,Z向上。据我所知,OpenGL在屏幕右侧有X,Y向上,Z向上。所以,当我使用很多投影矩阵和相机的例子时,这些点显然不是以正确的方式,或者说是有意义的方式来观察的

因此,要比较这两个(传感器为S,OpenGL为O):

Xs==-Zo,Ys==-Xo,Zs==Yo

现在我的问题是:

  • 如何将点从S旋转到O。我试着绕X旋转90度,然后再绕Z旋转,但似乎不起作用
  • 我是否需要按照OpenGL的约定旋转,我是否可以制作自己的轴(使用传感器方向)并更改相机代码?或者一些假设会在图形管道中的某个地方被打破

  • 我的实施基于以下答案:

      glm::mat4 model = glm::mat4(0.0f);
      model[0][1] = -1;
      model[1][2] = 1;
      model[2][0] = -1;
      // My input to the shader was a mat4 for the model matrix so need to
      // make sure the bottom right element is 1
      model[3][3] = 1;
    
    着色器中的一行:

    // Note that the above matrix is OpenGL to Sensor frame conversion
    // I want Sensor to OpenGL so I need to take the inverse of the model matrix
    // In the real implementation I will change the code above to 
    // take inverse before sending to shader
    "  gl_Position = projection * view * inverse(model) * vec4(lidar_pt.x, lidar_pt.y, lidar_pt.z, 1.0f);\n"
    

    为了将传感器数据的坐标系转换为OpenGL的右手世界空间,其中X轴指向右侧,Y轴指向上方,Z轴指向屏幕前面的用户(即“屏幕外”),您可以非常轻松地得出一个3x3旋转矩阵,该矩阵将执行您想要的操作:

    因为您说过,在传感器的坐标系中,X指向屏幕(相当于OpenGL的-Z轴),所以我们将传感器的(1,0,0)轴映射到(0,0,-1)。 你的传感器的Y轴指向左边(如你所说),这将是OpenGL的(-1,0,0)。同样,传感器的Z轴指向上,这将是OpenGL的(0,1,0)

    利用这些信息,我们可以构建旋转矩阵:

    / 0 -1  0\
    | 0  0  1|
    \-1  0  0/
    
    在应用OpenGL的视图和投影变换之前,只需将传感器数据顶点与该矩阵相乘即可

    所以,当你把它乘以一个向量(Sx,Sy,Sz),你得到:

    Ox = -Sy
    Oy =  Sz
    Oz = -Sx
    
    (其中,Ox/y/z是OpenGL坐标中的点,Sx/y/z是传感器坐标)

    现在,您只需构建一个变换矩阵(与通常的模型视图投影矩阵相乘),然后让着色器通过该矩阵变换顶点,或者您只需在上传到OpenGL之前预变换传感器顶点


    当您了解线性代数数学时,您几乎不需要在OpenGL中使用角度。

    尝试在顶点着色器中执行此操作:vec3 vertex=sensor\u space\u vertex.zxy*vec3(-1.0,-1.0,1.0);此外,了解显示3D点的方式也很好。