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