Как мне определить, какой объект находится ближе всего к камере? - PullRequest
3 голосов
/ 26 марта 2011

Я работаю над Depth of Field, и я хотел бы сделать его более интеллектуальным.В настоящее время все работает, но мне было интересно, как я могу автоматически настроить в зависимости от того, находится ли объект, на который смотрит камера, близко или далеко?

Я впервые увидел этот эффект в движке Unreal, но могуне найти никаких ресурсов о том, как они это сделали.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 29 марта 2011

Просто умножьте мировое положение каждого объекта на матрицу вида камеры и сравните значения z преобразованных положений.

EDIT:

Хорошо, скажем, у каждого из ваших объектов есть свойство позиции в мире '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, а в отношении этого кода он был бы ближе, чем все объекты перед камерой.

0 голосов
/ 26 марта 2011

Самый распространенный способ сделать это - преобразовать мир в пространство камеры (т. Е. Положения и ориентации относительно камеры), а затем расстояние от камеры - это просто их положение Z (при условии стандартных левосторонних декартовых координат).Теперь у каждой камеры есть фокусное расстояние.Это расстояние, на котором объекты кажутся самыми острыми.То, как далеко объект находится от этого фокусного «сладкого пятна», определяет степень размытия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...