如何在这个库中使用透视投影
我找到一个叫做 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 个回答
我不知道这是否有用,因为你可能已经知道了,但你还需要一个视图矩阵。视图矩阵表示的是你相机在世界中的变换的反向。你可能会发现矩阵类里有一些辅助方法可以用来创建视图矩阵,有时叫做lookAt或类似的名字。或者,你也可以手动创建一个矩阵,来设置你(想象中的)相机的位置和方向,然后再对它进行反转。
如果你把投影矩阵应用到世界坐标上,你就默认你的视图矩阵是单位矩阵,也就是说你的相机在世界的原点,并且朝着某个轴看。具体是哪个轴取决于投影矩阵,但如果和大多数系统一样,那就是z轴,因为通常相机的深度是沿着z轴来测量的。这个方向可以是正方向也可以是负方向,所以最好查一下文档了解详细信息。
所以,总结一下,你需要先把模型矩阵和视图矩阵相乘,然后再乘以投影矩阵。投影矩阵是为了在相机坐标系中工作,而不是在世界坐标系中。
这个教程解释了 gluPerspective() 这个函数的参数,应该可以直接用在你的库上,因为你的库是以这个为基础写的。
我期待新的 new_perspective() 方法能像一个构造函数一样工作,也就是说,它会返回一个设置好的矩阵,用于透视变换。这样,你就可以通过把向量和这个矩阵相乘,把世界坐标转换成透视投影坐标。