首页 > 解决方案 > 误解 OpenGL 中的 Model-View-Projection 矩阵

问题描述

我正在尝试使用 Python 和 pyglet 在现代 OpenGL 中编写一个基本程序。我可以在屏幕上放置一个简单的三角形,每个角都有不同的颜色。我正试图添加投影和视图矩阵,以便能够在 3D 空间中移动“相机”,但是当我添加两个矩阵时它会保持黑屏。我可以添加投影矩阵,它按预期工作。我可以简单地添加视图矩阵,它仍然显示三角形。但是,当我将视图矩阵和投影矩阵相乘时,它会产生黑屏。

因为我能够用投影矩阵生成一个彩色三角形,我我可以放心地假设我所有的 OpenGL 上下文都是有效的。所以,也许我一定误解了数学。

以下是我的相关代码的摘要:

import pyrr

fov = 60
aspect_ratio = 800 / 600 #width / height
near_clip = 0.1
far_clip = 100

#create a perspective matrix
projection_matrix = pyrr.matrix44.create_perspective_projection(
fov,
aspect_ratio,
near_clip,
far_clip
)

view_matrix = pyrr.matrix44.creat_look_at(
pyrr.vector3.create(0, 0, 1), #camera position
pyrr.vector3.create(0, 0, 0), #camera target
pyrr.vector3.create(0, 1, 0)  #camera up vector
)

mvp_matrix = projection_matrix * view_matrix

从这里开始,我将 mvp_matrix 翻译成 OpenGL 可以理解的 c_types 数组。我不认为进行翻译的代码是相关的,因为它只正确地与投影矩阵一起工作。

以下是 pyrr 给我的矩阵:

Projection Matrix:
[[ 1.15470054  0.          0.          0.        ]
 [ 0.          1.73205081  0.          0.        ]
 [ 0.          0.         -1.002002   -1.        ]
 [ 0.          0.         -0.2002002   0.        ]]

View Matrix:
[[1.  0.  0.  0.]
 [0.  1.  0.  0.]
 [0.  0.  1.  0.]
 [0.  0. -1.  1.]]

MVP Matrix:
[[ 1.15470054  0.          0.          0.        ]
 [ 0.          1.73205081  0.          0.        ]
 [ 0.          0.         -1.002002   -0.        ]
 [ 0.          0.         -0.          0.        ]]

关于为什么只有投影矩阵能够显示三角形的任何想法,但是当我添加视图矩阵时它只显示黑屏?

我已经尝试使三角形在所有 x、y 和 z 轴上都非常大,但仍然只是一个黑屏。=/

标签: pythonopenglmatrix

解决方案


经过更多测试后,我发现 pyrr 模块似乎正在奇怪地执行矩阵乘法。然而 Pyrr 是建立在 numpy 之上的,所以在使用之后:

numpy.matmul(projection_matrix, view_matrix)

然后,它能够正确地创建 MVP 矩阵。


推荐阅读