我想在python中使用pyOpenGL创建透视转换矩阵。我的视图和模型转换正在工作,但是当我应用我的投影转换时,我得到一个空白屏幕(应该从(0,0,+ 1)处查看原点处的三角形)。Python中的OpenGL透视矩阵
我已经查看了数学,并且据我所知,转换应该可行,所以我需要第二双眼睛来帮助找到问题。
def perspective(field_of_view_y, aspect, z_near, z_far):
fov_radians = math.radians(field_of_view_y)
f = math.tan(fov_radians/2)
a_11 = 1/(f*aspect)
a_22 = 1/f
a_33 = (z_near + z_far)/(z_near - z_far)
a_34 = -2*z_near*z_far/(z_near - z_far)
# a_33 = -(z_far + z_near)/(z_far - z_near)
# a_34 = 2*z_far*z_near/(z_far - z_near)
perspective_matrix = numpy.matrix([
[a_11, 0, 0, 0],
[0, a_22, 0, 0],
[0, 0, a_33, a_34],
[0, 0, -1, 0]
]).T
return perspective_matrix
projection_matrix = perspective(45, 600/480, 0.1, 100)
mvp_matrix = projection_matrix * view_matrix * model_matrix
我转置的矩阵,因为我相当肯定numpy存储矩阵转置为如何OpenGL需要它。我已经尝试发送矩阵而不进行转置,并且它对输出没有(可见的)影响。
这里是顶点着色器:
#version 330 core
layout(location = 0) in vec3 position;
uniform mat4 MVP;
void main()
{
vec4 p = vec4(position, 1.0);
gl_Position = MVP * p;
}
能有人认同我的转变可能存在的问题可能是什么?
编辑:我已经采取了输出矩阵,并通过手工计算。在应用透视图之后,沿着NDC框出现截锥体边缘上的所有点,其中近点和远点处的z分别被转换为-1,+1(由于舍入误差而导致+/-微小精度)。对我来说,这表明我的数学是正确的,问题在其他地方。这是输出矩阵:
[ 1.93137085 0. 0. 0. ]
[ 0. 2.41421356 0. 0. ]
[ 0. 0. -1.002002 -1. ]
[ 0. 0. 0.2002002 0. ]
'600/480'总是要返回'1'。使它成为'600.0/480.0'。这应该不是空白屏幕的原因。 –
600/480 = 1.25当我在Python中运行它。 – Francis
http://ideone.com/I9sfXf –