如何确定哪个物体离相机最近?

时间:2011-03-26 08:38:11

标签: xna

我正在研究景深,我想让它变得更聪明。目前,一切正常,但我想知道如何根据相机所看到的物体是近还是远而自动调节?

我首先在虚幻引擎中看到了这个效果,但找不到任何关于它们如何完成此操作的资源。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

最常见的做法是将世界变换为相机空间(即,相对于相机的位置和方向),然后距离相机的距离只是它们的Z位置(假设是标准的左手笛卡尔坐标) )。 现在,每个相机都有焦距。这是物体看起来最清晰的距离。 物体距离这个焦点“最佳点”的距离决定了它的模糊程度。

答案 1 :(得分:0)

只需将每个物体的世界位置乘以相机视图矩阵,然后比较转换后位置的z值。

编辑:

那么让我们说你的每个对象都有一个世界位置属性'Position',假设你有摄像机视图矩阵,代码应该是这样的:

public static MyObject FindClosest(List<MyObject> visibleObjects, Matrix cameraViewMatrix)
  {
     MyObject closest = null;

     // objects near the camera will be at small negative distances, with the distance becoming more negative as they get farther away
     float closestDistance = float.NegativeInfinity;

     foreach (MyObject o in visibleObjects)
     {
        Vector3 transformed = Vector3.Transform(o.Position, cameraViewMatrix);

        if (transformed.Z > closestDistance)
        {
           closestDistance = transformed.Z;
           closest = o;
        }
     }

     return closest;
  }

请注意,您应该只将可见对象传递给此函数(对象实际位于视锥体内)。视图空间中相机附近的点将具有较小的负z值,当您离开相机时会变得更负。如果您要测试相机后面的物体,它将具有正的z值,就该代码而言,它将比实际在相机前面的所有物体更近。