Как узнать, находится ли определенный Point3D внутри границ обзора камеры?

Вот и все. У меня есть некий Point3D. У меня есть камера. Я знаю угол обзора камеры, т.е. 45 градусов; Я знаю положение камеры и вектор LookDirection. Теперь я хочу каким-то образом узнать, будет ли точка видна камере или нет.

So p1 Should be visible, p2 should not Спасибо тем, кто ответил и прокомментировал, но:

  1. Для меня это непростая проблема. Это может показаться простой вещью, но я не нашел никакого специального метода или вспомогательного класса для решения проблемы. Я пытался решить это сам чисто математическим способом, но решение нестабильно и работает непредсказуемо:

    bool isPointInCameraView(Point3D P, Point3D CP, Vector3D LD, double CameraAngle) {
     //сначала вычисляем расстояние до плоскости, образованной вектором нормали LD и точкой P на ней
    var D = -LD.X*P.X-LD.Y*P.Y-LD.Z*P.Z; // -AXb-BYb-CZb
     //L — расстояние до плоскости.
    double L = Math.Abs((LD.X * CP.X + LD.Y * CP.Y + LD.Z * CP.Z + D)) / Math.Sqrt(LD.X * LD.X + LD. Y * LD.Y+LD.Z * LD.Z);
    var BL = L * Math.Tan(CameraAngle); //длина связанной части
    var PL = Math.Sqrt(((новый Vector3D(P.X - CP.X, P.Y - CP.Y, P.Z - CP.Z)).LengthSquared - L * L)); // длина точечной части
     //проверяем, не вышла ли точка за границы!
    вернуть PL <= BL;
    }
    
  2. Я знаю о Helix3D и использую его. Мой видовой экран и камера взяты из структуры спирали.

Я думаю, что будет легче понять проблему, если я объясню, зачем мне нужен такой тест. Я создаю приложение для геолого-геофизической визуализации, и мне нужно иметь возможность масштабировать текстуру, чтобы увидеть детали. Проблема заключалась в том, что я не мог использовать слишком большие текстуры, так как они занимали бы слишком много памяти и слишком долго рисовались бы. Тогда я решил разделить свою плоскость на несколько подпрямоугольников, каждый из которых должен обрабатываться отдельно. Итак, идея состоит в том, что когда пользователь приближает определенную часть плоскости, я буду визуализировать только эту часть. Это работало нормально, за исключением того, что код по-прежнему перерисовывал текстуры для тех подпрямоугольников, которые были невидимы для камеры. Теперь я хочу оптимизировать это. Я пытался найти любую специальную функцию, которая позволила бы мне это сделать, но безуспешно. Так что пока решение только математическое и оно нестабильное, работает неправильно. Вот почему я задал этот вопрос здесь.

6
задан Timur Nuriyasov 15 May 2012 в 08:33
поделиться