2011-03-26 79 views
3

我正在研究景深,我想让它更加智能化。目前,一切正常,但我想知道如何自动调整,取决于相机看到的物体是靠近还是远离?如何确定哪个物体距离相机最近?

我第一次在虚幻引擎中看到了这种效果,但在他们如何完成这个任务时找不到任何资源。任何帮助将不胜感激。

回答

0

只需将每个对象的世界位置乘以摄像机视图矩阵,然后比较转换后的位置的z值。

编辑:

那么假设每个对象都有一个世界上的地位属性“位置”,并假设你有摄像机视图矩阵,代码应该是这个样子:

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值,并且就代码而言,它会比实际位于摄像机前的所有物体更近。

+0

你能提供一些代码吗? – 2011-03-29 05:52:47

+0

编辑我的帖子上面的一些代码 – eodabash 2011-03-29 23:55:32

+0

我会给这个去并让你知道:o)谢谢。 – 2011-03-30 08:42:10

0

这样做的最常见方法是将世界转化为相机空间(即相对于相机的位置和方向),然后与相机的距离就是它们的Z位置(假定标准的左手笛卡尔坐标)。 现在,每台相机都有一个焦距。这是物体看起来最锐利的距离。 这个焦点'最佳点'的物体距离多远决定了它得到多少模糊。

+0

这就是我的想法。有没有任何教程,代码引用你可以指向我? – 2011-03-26 08:50:51

+0

http://digitalerr0r.wordpress.com/2009/05/16/xna-shader-programming-tutorial-20-depth-of-field/下面是如何实现作为后期着色器的教程 – 2011-03-26 09:19:04

+0

http:///mynameismjp.wordpress.com/samples-tutorials-tools/depth-of-field-sample/这里是一些示例代码的技术概述 – 2011-03-26 09:19:26

相关问题