9

我正在用 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);
    

正如我之前所说,它工作正常,直到点移动到相机后面。事实是,我可以确定该点何时位于相机后面(通过在最终变换后测试它的 Z 值),但由于我正在绘制线条和其他基于线条的对象,所以我不能跳过那个点。

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

不幸的是,我也没有任何运气(相同的结果),所以任何帮助将不胜感激,因为我有点坚持这个。

谢谢你。

最好的问候, 亚历克斯

4

1 回答 1

10

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

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

你在剪裁平面的前面和后面都有xo一条x线o。将此线与剪裁平面相交以生成点+。您知道x和中的哪一个o是可见的,所以从x到画线+

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

于 2010-07-26T20:05:25.677 回答