我正在用Java编写自己的软件光栅化程序,但遇到了一些麻烦...请看示例图像,请:
Image
该示例仅在平面上绘制简单的正方形网格。一切正常,直到我将相机移到足够近的位置,以使某些点向后移动为止。此后,如您所见,它们不再正确投影(垂直线-应当在相机后面的点投影在屏幕顶部)。
我的变换矩阵和向量与DirectX使用的变换矩阵和向量相同(PerspectiveFovLH用于投影,LookAtLH用于相机)。
我正在使用以下变换方法来投影3D点:
// '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转换管道文章来设置转换管道。
不幸的是,我也没有运气(相同的结果),所以任何帮助将不胜感激,因为我对此有所保留。
谢谢你。
此致,
亚历克斯
最佳答案
您需要在3d空间中将线与前裁剪平面相交,然后截断线,以便仅绘制可见的线段:
|
|
|
x------------+-----------o
|
|
| * - camera
|
|
|
clipping plane
您有一行
xo
,其中x
在剪切平面的前面,而o
在剪切平面的后面。将此线与剪切平面相交以生成点+
。您知道x
和o
中的哪一个可见,因此请绘制从x
到+
的线。这样,您就不会投影相机后面的点。
关于3d - 透视投影-如何投影 'camera'之后的点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3329308/