透视投影 - 如何投影"相机"背后的点?

Ale*_*lex 9 3d geometry camera projection perspective

我正在用Java编写我自己的软件光栅化器,我遇到了一些问题...请看一下示例图片,请:

图片

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

我的转换矩阵和向量与DirectX使用的相同(PerspectiveFovLH用于投影,LookAtLH用于相机).

我正在使用以下转换方法来投射3D点:

  1. 创建要转换的3D矢量.
  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);
    
    Run Code Online (Sandbox Code Playgroud)

正如我之前所说,它可以正常工作,直到点移动到相机后面.事实上,我可以弄清楚当点位于相机后面时(通过在最终变换后测试它的Z值),但由于我正在绘制线条和其他基于线的对象,我不能只是跳过这一点.

然后我尝试根据MSDN上的Direct3D Transformation Pipeline文章设置我的转换管道.

不幸的是,我也没有任何运气(相同的结果),所以任何帮助都会受到高度赞赏,因为我有点卡在这一点上.

谢谢.

最诚挚的问候,Alex

Chr*_*isF 8

您需要在3d空间中将线与前剪切平面相交并截断线,以便仅绘制可见的线段:

             |
             |
             |
x------------+-----------o
             |
             |
             |   * - camera
             |
             |
             |
       clipping plane
Run Code Online (Sandbox Code Playgroud)

你有一条线xox剪裁平面前面和o后面.将此线与剪切平面相交以生成点+.你知道的x,并o可见,所以从画线x+.

这样你就不会投射相机后面的点.

  • 谢谢.如果我在剪辑空间中进行透视变换,在透视分割之前(使用齐次坐标和w),是否可以? (2认同)
  • 一定是的. (2认同)