我正在使用OpenGL显示一组3D点。问题是3D点来自传感器,其中X向前,Y向左,Z向上。根据我的理解,OpenGL有X向右,Y向上,Z在屏幕外。所以,当我使用很多投影矩阵和相机的例子时,这些点显然没有以正确的方式或有意义的方式被观察。
因此,比较两者(S表示传感器,O表示OpenGL(:
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中几乎不需要角度。