我正在研究景深,我想让它变得更聪明。目前,一切正常,但我想知道如何根据相机所看到的物体是近还是远而自动调节?
我首先在虚幻引擎中看到了这个效果,但找不到任何关于它们如何完成此操作的资源。任何帮助将不胜感激。
答案 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值,就该代码而言,它将比实际在相机前面的所有物体更近。