我正在使用Java编写自己的软件光栅化器,但遇到了一些问题...请看一下样例图像:
这个样例只是在平面上绘制了一个简单的方格网。一切都很正常,直到我把相机移动到足够近的位置,使得某些点移动到它后面。之后,它们就不再被正确地投影了,就像你所看到的那样(垂直线 - 应该在相机后面的点被投影在屏幕顶部)。
我的变换矩阵和向量与DirectX使用的相同(透视投影使用PerspectiveFovLH,相机使用LookAtLH)。
我正在使用以下变换方法来投影3D点:
- 3D vector to be transformed is created.
- Vector is multiplied by ViewProjection matrix.
After that, point is transformed to screen using following method:
// '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);
然后,我尝试根据MSDN上的《Direct3D变换管道》文章设置我的转换管道。
不幸的是,我也没有成功(结果相同),因此任何帮助都将不胜感激,因为我有些卡在这里了。
谢谢。
最好的问候, Alex