将3D点映射到2D上下文

时间:2014-06-30 23:49:36

标签: c# algorithm 3d 2d

我已经阅读了一些文章甚至是堆栈溢出的问题。我没有找到我想要的东西。我可能没有仔细查看,所以如果你知道的话,请指出我更正的文章/问题。

任何方式,我想要做的是清楚。我知道相机的位置(x',y',z')我有相机旋转矩阵(Matrix3)。我还有相机宽高比(W / H)和输出尺寸(W,H)。我的POINT位于(x,y,z),我想要一个代码或(一个算法,所以我可以编写代码)来计算它在屏幕上的位置(屏幕的大小与相机输出的大小相同) )as(x'',y'')。

你知道任何有用的文章吗?我对支持相机旋转矩阵的文章或算法非常重要。

谢谢大家。

3 个答案:

答案 0 :(得分:1)

你需要先指定投影类型(ortogonal,perspective ......?)

  1. 将任意点(x,y,z)转换为相机空间

    减去摄像机位置然后应用摄像机方向(坐标系)矩阵的逆。 Z相机轴通常观看方向。如果你使用4x4同质矩阵,那么减法已经在其中,所以不要两次!

  2. 应用投影

    正交投影只是比例矩阵。透视预测更复杂,因此谷歌为他们。这是应用宽高比的位置,也是 FOV (视野)视角。

  3. 剪辑到屏幕和Z缓冲区空间

    现在您在投影相机空间中有x,y,z。要实际获取具有透视的屏幕坐标,您必须除以zw坐标(取决于所使用的数学和投影),因此对于3x3矩阵

        xscr=x/z;
        yscr=y/z;
    

    这就是为什么投影的z-near必须是> 0! (否则可能导致除零)

  4. 渲染或处理像素(x,y)

  5. 有关详细信息,请参阅:Mathematically compute a simple graphics pipeline

    <强> [注释]

    如果您查看 OpenGL 教程/参考或任何 3D 矢量数学渲染,您会发现很多东西。谷歌同源变换矩阵或同质坐标。

答案 1 :(得分:0)

我并不完全确定你想要达到的是什么,但我认为你试图让一个平面(一个屏幕)的表面排成一个亲戚尺寸到另一架飞机。要计算此比率,您应该查看Gaussian Surfaces。还有很多触发器。希望这会有所帮助。

答案 2 :(得分:0)

我认为你没有足够的信息来执行计算!

您可以将相机视为针孔相机。它由一个图像平面和一个点,所有光照射到图像平面上。通常,图像平面是矩形的,所有入射光所来自的点都是从图像平面中心开始的图像平面的法线。

有了这些限制,您需要以下内容: - 相机的中心位置 - 两个矢量(彼此垂直)定义图像平面的大小和姿态 - 该点与相机平面的距离(这可称为焦距,即使它严格来说不是同一个事物)

(实际上有几种方法可以表达这些数量,例如,。)

如果您只有像素和相机旋转的图像平面的位置和大小,则缺少比例因子。在现实世界中,这相当于知道你拿着相机的位置和指向它的位置,但不知道焦距(变焦设置)。

有很多文献可供使用,首先是搜索结果:

http://www.cse.psu.edu/~rcollins/CSE486/lecture12_6pp.pdf

也许这有助于您找到正确的搜索字词。