给定摄像机和视图平面的2D点的3D坐标

时间:2010-03-29 15:22:40

标签: c++ geometry trigonometry raytracing

我希望通过观察平面从相机产生光线。为了做到这一点,我需要我的相机位置(“眼睛”),向上,向右和向向量(其中朝向是相机在相机所看到的物体方向上的向量)和P,观察平面上的点。一旦我有这些,产生的光线是:

ray = camera_eye + t*(P-camera_eye);

其中t是沿光线的距离(假设现在t = 1)。

我的问题是,如果它位于观察平面上的位置(i,j),我如何获得点P的3D坐标?假设给出了观察平面的左上角和右下角。

注意:观察平面实际上并不是一个平面,因为它不会在所有方向上无限延伸。相反,人们可能会将此平面视为宽度x高度图像。在x方向上,范围是0->宽度,并且在y方向上,范围是0->高度。我希望找到第(i,j)个元素的3D坐标,0

3 个答案:

答案 0 :(得分:2)

线和平面的一般解决方案见http://local.wasp.uwa.edu.au/~pbourke/geometry/planeline/

您的特定图形库(OpenGL / DirectcX等)可能有标准的方法来执行此操作

编辑:您正在尝试在场景中找到屏幕点(例如鼠标光标)与3d对象的三维交点?

答案 1 :(得分:0)

要计算P,你需要从相机到近剪裁平面(屏幕)的距离,近剪裁平面上窗口的大小(或视角,你可以从中计算出窗口大小)视角)和渲染窗口的大小。

  1. 将屏幕位置缩放到范围-1< x< +1和-1< y< +1其中+1是顶部/右部,-1是底部/左侧
  2. 按视图窗口大小缩放标准化的x,y
  3. 按摄像机的向右和向上矢量缩放并对结果求和
  4. 添加由剪裁平面距离缩放的矢量外观
  5. 实际上,你得到:

    p = at * near_clip_dist + x * right + y * up
    

    其中x和y是:

    x = (screen_x - screen_centre_x) / (width / 2) * view_width
    y = (screen_y - screen_centre_y) / (height / 2) * view_height
    

答案 2 :(得分:0)

当我直接将建议的公式插入我的程序时,我没有获得正确的结果(可能需要进行一些调试)。我最初的问题似乎是误解了插值角点的(x,y,z)坐标。我分别处理x,y,z坐标,我不应该这样做(这可能是应用程序特有的,因为摄像机可以朝向任何方向)。相反,解决方案结果是观察平面角点的简单插值:

  • 插入i方向的底角点以获得P1
  • 插入i方向的顶角点以获得P2
  • 在j方向上插入P1和P2以获得最终点的世界坐标