投影数学在软件3d引擎

Projection math in software 3d engine

本文关键字:3d 引擎 软件 投影      更新时间:2023-09-26

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

到目前为止,我有:
  • 相机投影和视图矩阵。
  • 转换的模型顶点(v x ModelViewProj)。
  • 取结果并将x和y除以z(透视)坐标,生成视口坐标。
  • 根据视口大小缩放生成的2d矢量。

我正在绘制一个平面,当所有4个顶点(2个三角形)都在屏幕上时,一切都工作了。当我的相机在平面上飞行时,在某个点,屏幕外的顶点转换到屏幕的顶部。这一点似乎与透视坐标大于1的时候一致。我有一个例子来说明我的意思——按前进键看到它翻转:

http://davidgoemans.com/phaser3d/

代码没有被缩小,所以web开发工具可以很容易地检查,但我也把源代码放在这里:

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

提前感谢!


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

当投影点位于虚拟摄像机的后面时,结果将投影到它的前面,镜像。x/z-x/-z是一样的

在渲染管道中,这个问题是通过剪切算法解决的,该算法通过剪切平面与原语相交。在你的情况下,一个单一的裁剪平面位于相机前面的某个地方,就足够了(在渲染管道中,一个人通常使用6个裁剪平面来描述一个完整的观看体)。您必须防止这样的情况:单个原语至少有一个点在相机前面,而至少有另一个点在相机后面(并且您必须丢弃完全位于后面的原语,但这是相当微不足道的)。剪辑必须在透视分割之前完成,这也是为什么投影矩阵变换到的空间被称为剪辑空间的原因。