软件 3d 引擎中的投影数学

Projection math in software 3d engine

我正在 Javascript 编写软件 3d 引擎,渲染为 2d canvas。我完全陷入了与从 3d 世界到 2d 屏幕坐标的投影相关的问题。

到目前为止,我有:

我正在画飞机,当所有 4 个顶点(2 个三角形)都在屏幕上时一切正常。当我将相机飞过飞机时,在某个时候,屏幕外的顶点会变换到屏幕的顶部。那一点似乎与透视坐标超过 1 时一致。我有一个例子来说明我的意思——向前按看它翻转:

http://davidgoemans.com/phaser3d/

代码未缩小,因此网络开发工具可以轻松检查,但我也将源代码放在这里:

https://github.com/dgoemans/phaser3dtest/tree/fixcanvas

提前致谢!


注意:我正在使用移相器,目前并没有真正做任何事情,但我的计划是混合 2d 和 3d。它不应该对 3d 数学有任何影响。

当投影点位于虚拟相机后面时,结果将投影在它的前面,镜像。 x/z-x/-z 相同。

在渲染管线中,这个问题是通过裁剪算法解决的,该算法通过裁剪平面与图元相交。在您的情况下,位于相机前面某处的单个裁剪平面就足够了(在渲染管道中,通常使用 6 个裁剪平面来描述完整的查看体积)。您必须防止单个图元在相机前面至少有一个点,而在它后面至少有另一个点(并且您必须丢弃完全位于后面的图元,但这是微不足道的)。裁剪必须在透视分割之前完成,这也是space投影矩阵变换成的被称为裁剪的原因space.