代码之家  ›  专栏  ›  技术社区  ›  Budda

如何在三维物体的二维投影中确定最上面的物体?

  •  3
  • Budda  · 技术社区  · 14 年前

    我有一个曲面,上面画了一组三维对象。任务是根据曲面上给定的坐标确定对象。

    例如:有些对象是在桌面应用程序上绘制的,我需要确定用户单击了哪个对象。

    你能告诉我,这类任务通常是如何解决的吗?我需要为每个像素创建一个最上面的对象吗?我认为这不是最好的方法。

    任何想法都欢迎!

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  2
  •   Gareth Rees    14 年前

    此任务的名称为 采摘 (这应该能帮你在谷歌上找到更多的帮助)。主要有两种方法:

    1. 射线投射 :找到从相机位置开始并穿过感兴趣的曲面点的线。(鼠标下面的一行,或者触摸屏下面的一行)根据您使用的是哪种3D系统,可能会有一个API调用来生成这一行:例如 Camera.ViewportPointToRay 在Unity3D中,或者您可能需要通过反转相机变换来自己生成它。查找此线与场景中对象之间的所有交点。哪一个点最接近相机的近平面?你可以用 space partitioning 加快速度。

    2. 致使 :执行额外的渲染过程,在该过程中记录绘制的对象,而不是将纹理写入帧缓冲区。你不需要对整个屏幕进行渲染,只需要对你感兴趣的区域(例如像素)进行渲染。(这是 GL_SELECT OpenGL中的模式:请参见 Picking Tutorial 有关详细信息。)

        2
  •  1
  •   John    14 年前

    如果你以某种方式在三维空间中描述了曲面,那么光线(由你的观察点定义)和一个三维点(你单击的位置的解决方案)应该与你世界中的一个或多个对象相交,如果你确实单击了其中一个对象。

    给定对象表面的方程式,可以确定此光线与对象相交的位置(如果有的话),因为您还知道同一坐标系中光线的方程式。

    与观察点最接近的交叉点(假设你正从上面看这些对象)就是赢家。