3d 透视投影-如何投影位于';照相机';?

3d 透视投影-如何投影位于';照相机';?,3d,geometry,camera,projection,perspective,3d,Geometry,Camera,Projection,Perspective,我正在用Java编写我自己的软件光栅化程序,我遇到了一些麻烦。。。请看一张示例图像: 此示例仅在平面上绘制简单的方形网格。一切正常,直到我把相机移得足够近,让一些点移到后面。之后,它们不再正确投影,如您所见(垂直线-应该在相机后面的点投影在屏幕顶部) 我的变换矩阵和向量与DirectX使用的变换矩阵和向量相同(透视用于投影,透视用于相机) 我使用以下变换方法投影三维点: 将创建要变换的三维矢量 向量乘以视图投影矩阵 然后,使用以下方法将点转换为屏幕: // 'vector' is input

我正在用Java编写我自己的软件光栅化程序,我遇到了一些麻烦。。。请看一张示例图像:

此示例仅在平面上绘制简单的方形网格。一切正常,直到我把相机移得足够近,让一些点移到后面。之后,它们不再正确投影,如您所见(垂直线-应该在相机后面的点投影在屏幕顶部)

我的变换矩阵和向量与DirectX使用的变换矩阵和向量相同(透视用于投影,透视用于相机)

我使用以下变换方法投影三维点:

  • 将创建要变换的三维矢量
  • 向量乘以视图投影矩阵
  • 然后,使用以下方法将点转换为屏幕:

    // '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转换管道文章设置转换管道

    不幸的是,我在这方面也没有任何运气(同样的结果),所以任何帮助都将是非常感谢的,因为我在这一点上有点卡住了

    多谢各位

    致以最良好的祝愿,
    Alex

    您需要在三维空间中将直线与前剪裁平面相交并截断直线,以便只绘制可见的线段:

                 |
                 |
                 |
    x------------+-----------o
                 |
                 |
                 |   * - camera
                 |
                 |
                 |
           clipping plane
    
    在剪裁平面前面有一行
    xo
    ,其中
    x
    ,后面有一行
    o
    。将此线与剪裁平面相交以生成点
    +
    。你知道哪个
    x
    o
    是可见的,所以从
    x
    +
    划一条线


    这样,您就不会投影相机后面的点。

    您是否正确设置了相机的前剪裁平面?然后在渲染时将其考虑在内?My zNear plane设置为1,zFar plane设置为1000个单位。我已尝试更改值,但问题仍然存在。有什么建议吗?我做这类事情已经有一段时间了,但是在投影直线之前,你需要与前面的剪裁平面相交。谢谢。在剪辑空间中,透视变换之后,透视分割之前(使用齐次坐标和w),这样做可以吗?