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



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

因此,比较两者(S表示传感器,O表示OpenGL(:

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

现在我的问题是:

  1. 如何将点从S旋转到O。我试着绕X旋转90度,然后绕Z旋转,但似乎不起作用
  2. 我甚至需要按照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中几乎不需要角度

最新更新