2010-07-25 101 views
8

我用Java编写自己的软件光栅,和我遇到了一些麻烦与它...看看样本图像,请:透视投影 - 我如何投射“相机”后面的点?

Image

此示例只是画一些简单的方形网格在飞机上。一切工作正常,直到我移动相机足够接近一些点后移动。之后,它们不再被正确投影,正如你所看到的(垂直线条 - 应该在相机后面的点投影在屏幕顶部)。

我的转换矩阵和向量是DirectX正在使用的(PerspectiveFovLH用于投影,LookAtLH用于相机)。

我用下面的方法改造项目三维点:

  1. 进行改造,创建三维矢量。
  2. 向量乘以ViewProjection矩阵。
  3. 之后,点转换使用下面的方法来筛选:

    // '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上的文章。

不幸的是,我还没有任何运气,以及(相同的结果),所以任何帮助将不胜感激,因为我有点卡住在这一个。

谢谢。

最好的问候, 亚历

+0

您是否正确设置了相机的前裁剪平面?然后在渲染时考虑它? – ChrisF 2010-07-25 13:34:47

+0

我的zNear平面设置为1,zFar平面设置为1000个单位。我试过改变这些值,但问题依然存在。有什么建议么? – Alex 2010-07-25 13:43:58

+0

自从我做这类事情已经有一段时间了,但您需要在投影线之前与前裁剪平面*执行交点。 – ChrisF 2010-07-25 14:15:27

回答

7

您需要相交在三维空间中前剪裁平面行和截断行,所以你只画线段这是明显的:

   | 
      | 
      | 
x------------+-----------o 
      | 
      | 
      | * - camera 
      | 
      | 
      | 
     clipping plane 

你” ve得到了一行xo,其中x位于剪贴面前,o位于剪贴板后面。将此线与裁剪平面相交以生成点+。你知道xo中的哪一个是可见的,所以从x+画一条线。

这样你就不会在摄影机后面投射点。

+1

谢谢。如果我在剪辑空间,透视变换之后,透视分割之前(使用齐次坐标和w),可以吗? – Alex 2010-07-27 05:06:34

+2

是的一切。 – 2010-07-29 01:10:36