3d - 透视投影-如何投影 'camera'之后的点?

标签 3d geometry camera projection perspective

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

Image

该示例仅在平面上绘制简单的正方形网格。一切正常,直到我将相机移到足够近的位置,以使某些点向后移动为止。此后,如您所见,它们不再正确投影(垂直线-应当在相机后面的点投影在屏幕顶部)。

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

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

  • 创建要转换的3D向量。
  • 向量乘以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值),但是由于我正在绘制线和其他基于线的对象,因此我不能仅跳过该点。

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

    不幸的是,我也没有运气(相同的结果),所以任何帮助将不胜感激,因为我对此有所保留。

    谢谢你。

    此致,
    亚历克斯

    最佳答案

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

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

    您有一行xo,其中x在剪切平面的前面,而o在剪切平面的后面。将此线与剪切平面相交以生成点+。您知道xo中的哪一个可见,因此请绘制从x+的线。

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

    关于3d - 透视投影-如何投影 'camera'之后的点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3329308/

    相关文章:

    安卓相机实现

    android - 使用相机查找对象的尺寸(高度,宽度)

    math - 矢量方向的改变

    c++ - opengl 3D变换需要旋转矩阵

    javascript - 地面阴影看起来不准确且浑浊

    javascript - 如果鼠标位于圆圈内?

    java - 数学问题 : place circles around the clock

    javascript - SVG 圆形描边原点

    image - 使用 MATLAB 制作文本动画

    java - 重新加载相机预览之前的 Android 内存问题