python - 误解 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 轴上都非常大,但仍然只是一个黑屏。=/
解决方案
经过更多测试后,我发现 pyrr 模块似乎正在奇怪地执行矩阵乘法。然而 Pyrr 是建立在 numpy 之上的,所以在使用之后:
numpy.matmul(projection_matrix, view_matrix)
然后,它能够正确地创建 MVP 矩阵。
推荐阅读
- visual-studio - Visual Studio 2017 版本 15.9.4 中的 C++ 优化器错误?
- c# - PrimaryThenSecondary LocationMode 是否检查主要的 RA-GRS 是否存在?
- sql - SQL - 获取多个范围之间的时间总和
- php - Codeigniter get_where 在条件数组中带有“或”
- javascript - 如何在 nodejs 中为 morgan 指定特定格式?
- python - 如何将系列转换为类浮动
- html - 如何减少 7 格 Bootstrap 页面中的列间距
- kubernetes - 使用 ABAC 保护 Kubernetes 仪表板
- postgresql - 在 PostgreSQL 中,age(datfrozenxid) 是如何计算的?
- javascript - 将本地存储页面带到页面不起作用