7

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

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

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

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

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

4

3 回答 3

2

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

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

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

于 2010-03-29T15:34:30.757 回答
0

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

  1. 将屏幕位置缩放到 -1 < x < +1 和 -1 < y < +1 范围,其中 +1 是顶部/右侧,-1 是底部/左侧
  2. 按视图窗口大小缩放归一化 x,y
  3. 按相机的右向量和上向量进行缩放并对结果求和
  4. 添加按剪裁平面距离缩放的查看向量

实际上,您得到:

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
于 2010-03-29T16:53:27.983 回答
0

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

  • 对i方向的底角点进行插值得到P1
  • 插值i方向的顶角点得到P2
  • 在j方向插值P1和P2得到终点的世界坐标
于 2010-04-01T01:34:33.063 回答