我正在用 Java 编写自己的软件光栅化器,但遇到了一些麻烦......请看一下示例图像:
此示例只是在平面上绘制简单的方形网格。一切正常,直到我将相机移动得足够近以使某些点移动到它后面。之后,它们不再被正确投影,如您所见(垂直线 - 应该在相机后面的点被投影在屏幕顶部)。
我的变换矩阵和向量与 DirectX 使用的相同(PerspectiveFovLH 用于投影,LookAtLH 用于相机)。
我正在使用以下转换方法来投影 3D 点:
- 创建要转换的 3D 矢量。
- 向量乘以 ViewProjection 矩阵。
之后,使用以下方法将点转换为屏幕:
// 'vector' is input vector in projection space // projection to screen double vX = vector.x / vector.z; double vY = vector.y / vector.z; //translate //surfaceW is width and surfaceH is height of the rendering window. vX = (( vX + 1.0f) / 2.0f) * surfaceW; vY = ((-vY + 1.0f) / 2.0f) * surfaceH; return new Vector3(vX, vY, vector.z);
正如我之前所说,它工作正常,直到点移动到相机后面。事实是,我可以确定该点何时位于相机后面(通过在最终变换后测试它的 Z 值),但由于我正在绘制线条和其他基于线条的对象,所以我不能跳过那个点。
然后我尝试根据MSDN 上的 Direct3D 转换管道文章设置我的转换管道。
不幸的是,我也没有任何运气(相同的结果),所以任何帮助将不胜感激,因为我有点坚持这个。
谢谢你。
最好的问候, 亚历克斯