如何在这个库中使用透视投影

0 投票
2 回答
1529 浏览
提问于 2025-04-15 15:02

我找到一个叫做 pyeuclid 的库,它在3D数学方面似乎能满足我的需求。这个库里有一个3D向量类和一个4x4矩阵类,可以进行旋转、平移和缩放等变换。

创建 矩阵 非常简单,只需要传入参数,矩阵就会被创建出来。

>>> m = Matrix4()
>>> m.translate(50,50,50)
Matrix4([    1.00     0.00     0.00    50.00
             0.00     1.00     0.00    50.00
             0.00     0.00     1.00    50.00
             0.00     0.00     0.00     1.00])

这个库提供了一个3D向量类,如果我想用这个矩阵来平移一个3D点,我需要先创建一个 向量类,像这样。

>>> v = Vector3(100,200,300)
>>> v
Vector3(100.00, 200.00, 300.00)
>>> v.x
100
>>> v.y
200
>>> v.z
300

现在,Matrix4() 类里有一个方法可以用来变换坐标,使用方法如下。

>>> m.transform(v)
Point3(150.00, 250.00, 350.00)

这很好,不过,库里没有应用透视投影。它有一个叫做 Matrix4.new_perspective(fov_y, aspect, near, far) 的方法。问题在于,我不知道怎么正确使用这个函数,(m.transform(vector3) 并没有产生任何可用的结果)文档里没有说明它是如何与向量或其他矩阵一起使用的,只提到它“相当于 OpenGL 的 gluPerspective.fov_y” 的调用,但我从来没有用过 OpenGL,所以这对我没有帮助。

这是模块 (从 euclid 导入 Vector3,Matrix4)

我不想要的是一些游戏引擎/可视化库的推荐,或者什么能在屏幕上绘制东西的东西,我只是想知道我能否使用这个库将3D向量坐标转换为2D屏幕坐标,如果不能,那我可以用什么库呢???

所以,快来帮帮这个困扰中的菜鸟吧!:-) 感谢你的帮助。

2 个回答

0

我不知道这是否有用,因为你可能已经知道了,但你还需要一个视图矩阵。视图矩阵表示的是你相机在世界中的变换的反向。你可能会发现矩阵类里有一些辅助方法可以用来创建视图矩阵,有时叫做lookAt或类似的名字。或者,你也可以手动创建一个矩阵,来设置你(想象中的)相机的位置和方向,然后再对它进行反转。

如果你把投影矩阵应用到世界坐标上,你就默认你的视图矩阵是单位矩阵,也就是说你的相机在世界的原点,并且朝着某个轴看。具体是哪个轴取决于投影矩阵,但如果和大多数系统一样,那就是z轴,因为通常相机的深度是沿着z轴来测量的。这个方向可以是正方向也可以是负方向,所以最好查一下文档了解详细信息。

所以,总结一下,你需要先把模型矩阵和视图矩阵相乘,然后再乘以投影矩阵。投影矩阵是为了在相机坐标系中工作,而不是在世界坐标系中。

0

这个教程解释了 gluPerspective() 这个函数的参数,应该可以直接用在你的库上,因为你的库是以这个为基础写的。

我期待新的 new_perspective() 方法能像一个构造函数一样工作,也就是说,它会返回一个设置好的矩阵,用于透视变换。这样,你就可以通过把向量和这个矩阵相乘,把世界坐标转换成透视投影坐标。

撰写回答