我用Java编写自己的软件光栅,和我遇到了一些麻烦与它...看看样本图像,请:透视投影 - 我如何投射“相机”后面的点?
此示例只是画一些简单的方形网格在飞机上。一切工作正常,直到我移动相机足够接近一些点后移动。之后,它们不再被正确投影,正如你所看到的(垂直线条 - 应该在相机后面的点投影在屏幕顶部)。
我的转换矩阵和向量是DirectX正在使用的(PerspectiveFovLH用于投影,LookAtLH用于相机)。
我用下面的方法改造项目三维点:
- 进行改造,创建三维矢量。
- 向量乘以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值),但由于我正在绘制线条和其他基于线条的对象,因此我不能跳过该点。
然后我试图根据设置我的转换管道。Direct3D转换管道 MSDN上的文章。
不幸的是,我还没有任何运气,以及(相同的结果),所以任何帮助将不胜感激,因为我有点卡住在这一个。
谢谢。
最好的问候, 亚历
您是否正确设置了相机的前裁剪平面?然后在渲染时考虑它? – ChrisF 2010-07-25 13:34:47
我的zNear平面设置为1,zFar平面设置为1000个单位。我试过改变这些值,但问题依然存在。有什么建议么? – Alex 2010-07-25 13:43:58
自从我做这类事情已经有一段时间了,但您需要在投影线之前与前裁剪平面*执行交点。 – ChrisF 2010-07-25 14:15:27