软件 3d 引擎中的投影数学
Projection math in software 3d engine
我正在 Javascript 编写软件 3d 引擎,渲染为 2d canvas。我完全陷入了与从 3d 世界到 2d 屏幕坐标的投影相关的问题。
到目前为止,我有:
- 相机投影和视图矩阵。
- 转换后的模型顶点 (v x ModelViewProj)。
- 获取结果并将 x 和 y 除以 z(透视)坐标,得到视口坐标。
- 按视口大小缩放生成的二维矢量。
我正在画飞机,当所有 4 个顶点(2 个三角形)都在屏幕上时一切正常。当我将相机飞过飞机时,在某个时候,屏幕外的顶点会变换到屏幕的顶部。那一点似乎与透视坐标超过 1 时一致。我有一个例子来说明我的意思——向前按看它翻转:
http://davidgoemans.com/phaser3d/
代码未缩小,因此网络开发工具可以轻松检查,但我也将源代码放在这里:
https://github.com/dgoemans/phaser3dtest/tree/fixcanvas
提前致谢!
注意:我正在使用移相器,目前并没有真正做任何事情,但我的计划是混合 2d 和 3d。它不应该对 3d 数学有任何影响。
当投影点位于虚拟相机后面时,结果将投影在它的前面,镜像。 x/z
与 -x/-z
相同。
在渲染管线中,这个问题是通过裁剪算法解决的,该算法通过裁剪平面与图元相交。在您的情况下,位于相机前面某处的单个裁剪平面就足够了(在渲染管道中,通常使用 6 个裁剪平面来描述完整的查看体积)。您必须防止单个图元在相机前面至少有一个点,而在它后面至少有另一个点(并且您必须丢弃完全位于后面的图元,但这是微不足道的)。裁剪必须在透视分割之前完成,这也是space投影矩阵变换成的被称为裁剪的原因space.
我正在 Javascript 编写软件 3d 引擎,渲染为 2d canvas。我完全陷入了与从 3d 世界到 2d 屏幕坐标的投影相关的问题。
到目前为止,我有:
- 相机投影和视图矩阵。
- 转换后的模型顶点 (v x ModelViewProj)。
- 获取结果并将 x 和 y 除以 z(透视)坐标,得到视口坐标。
- 按视口大小缩放生成的二维矢量。
我正在画飞机,当所有 4 个顶点(2 个三角形)都在屏幕上时一切正常。当我将相机飞过飞机时,在某个时候,屏幕外的顶点会变换到屏幕的顶部。那一点似乎与透视坐标超过 1 时一致。我有一个例子来说明我的意思——向前按看它翻转:
http://davidgoemans.com/phaser3d/
代码未缩小,因此网络开发工具可以轻松检查,但我也将源代码放在这里:
https://github.com/dgoemans/phaser3dtest/tree/fixcanvas
提前致谢!
注意:我正在使用移相器,目前并没有真正做任何事情,但我的计划是混合 2d 和 3d。它不应该对 3d 数学有任何影响。
当投影点位于虚拟相机后面时,结果将投影在它的前面,镜像。 x/z
与 -x/-z
相同。
在渲染管线中,这个问题是通过裁剪算法解决的,该算法通过裁剪平面与图元相交。在您的情况下,位于相机前面某处的单个裁剪平面就足够了(在渲染管道中,通常使用 6 个裁剪平面来描述完整的查看体积)。您必须防止单个图元在相机前面至少有一个点,而在它后面至少有另一个点(并且您必须丢弃完全位于后面的图元,但这是微不足道的)。裁剪必须在透视分割之前完成,这也是space投影矩阵变换成的被称为裁剪的原因space.