我希望通过观察平面从相机产生光线。为了做到这一点,我需要我的相机位置(“眼睛”),向上,向右和向向量(其中朝向是相机在相机所看到的物体方向上的向量)和P,观察平面上的点。一旦我有这些,产生的光线是:
ray = camera_eye + t*(P-camera_eye);
其中t是沿光线的距离(假设现在t = 1)。
我的问题是,如果它位于观察平面上的位置(i,j),我如何获得点P的3D坐标?假设给出了观察平面的左上角和右下角。
注意:观察平面实际上并不是一个平面,因为它不会在所有方向上无限延伸。相反,人们可能会将此平面视为宽度x高度图像。在x方向上,范围是0->宽度,并且在y方向上,范围是0->高度。我希望找到第(i,j)个元素的3D坐标,0
答案 0 :(得分:2)
线和平面的一般解决方案见http://local.wasp.uwa.edu.au/~pbourke/geometry/planeline/
您的特定图形库(OpenGL / DirectcX等)可能有标准的方法来执行此操作
编辑:您正在尝试在场景中找到屏幕点(例如鼠标光标)与3d对象的三维交点?
答案 1 :(得分:0)
要计算P,你需要从相机到近剪裁平面(屏幕)的距离,近剪裁平面上窗口的大小(或视角,你可以从中计算出窗口大小)视角)和渲染窗口的大小。
实际上,你得到:
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坐标,我不应该这样做(这可能是应用程序特有的,因为摄像机可以朝向任何方向)。相反,解决方案结果是观察平面角点的简单插值: